概述
Elasticsearch是一款强大的实时搜索和分析引擎,设计用于处理海量数据。它采用分布式架构,能够轻松地扩展以应对大规模数据的需求。通过使用JSON格式存储数据,Elasticsearch提供了灵活性,同时具备强大的查询语言,能够支持全文搜索、范围查询和聚合操作。它在处理大规模数据方面也是非常出色,适用于各种实时应用,如监控日志、数据分析等业务场景。
单租户面临的问题
这里的租户特指访问集群的用户
单租户场景:所有访问者使用相同用户身份操作集群数据
多租户场景:不同用户有不同的用户角色(Role),不同用户对不同资源有不同权限
- 索引命名混乱:索引名称很随意,如果没有运维平台管理,从索引名称也无法追随到具体的业务归属。成为孤儿索引
- 索引生命周期管理: 没有清理策略,每次都是发现集群容量到达水位,临时删除数据量大、历史归档的索引
- 权限及隔离性:无,都是管理员,都有最大权限,索引无隔离性,索引被其他业务无意删除等问题
解决思路
对于上面的几个突出问题,我们可以通过一些规范+ES本身的能力,可以规避这些问题。
- 命名规范:这里的索引命名很重要,这里的命名规则会作用到后面介绍的权限的配置,做好命名规范对集群管理和自动化都是基本要求,我司使用基于资产服务树体系结构命名。比如:{团队}_{产品线}_{服务组}_{服务}_xxx
- 生命周期管理:ES自身的 index lifecycle policy 就可以满足我们的需求
- 权限控制:ElasticSearch在6.8以后的版本中支持了RBAC(基于角色的访问控制),可以在role中配置集群、索引级别的权限,role绑定到user上,即可完成基于indexs级别的控制
实践流程
创建账户及权限
用户名: 可以使用标识业务属性的名称。比如我们公司以{app_name}作为用户名称
Role:指定权限。可以控制到索引,支持正则。
通过kibana创建Role,并分配权限。(inno_sweetfans_*,只允许访问inno_sweetfans开通的索引)。
创建User,关联Role。(User关联到Role之后,就获得了Role规定的权限)。
索引生命周期管理
如果业务索引数据量过大,有索引归档需求,比如按照天、周、月切分索引的,可以配置索引生命周期
配置步骤
- 添加 Index Lifecycle Policies
- 创建index template
- Index Lifecycle Policies 运用到 index template
具体流程
添加Index Lifecycle Policies策略,(Hot phase:多大开始切割;Delete phase:删除多久之前的)。
创建索引模版。(index_patterns写索引前缀来匹配索引)。
删除策略和索引模版关联。运用规则。
方案总结
我们借助ES的RBAC机制构建了一个具有权限控制、资源隔离的环境,解决了单租户模式下的诸多问题,运用了集群的生命周期管理补充了对索引的管理。这个demo只是多租户的一个引子,真实场景需要考虑到业务的复杂性和运维性。
扩展和思考
低于6.8版本的ES不支持权限控制和索引生命周期管理,如何破局?
- 安全:可以使用http-basic、search guard 等增加权限控制。
- 生命周期管理:Curator。
通过权限控制虽然解决了资源的访问控制,但是资源抢占、业务优先级等问题依然存在?
- ES支持对节点打标签(TAG), 可以通过索引和tag绑定做到资源独占。
ES运维过程中的问题?
- 分片不合理,数据倾斜。
- 故障定位复杂、分布式集群维护困难。
- 太多了,不总结了,遇到问题,干就对了。