项目背景
公司基于elasticsearch实现了很多的业务统计分析与展示服务,而且随着业务的发展,数据量的持续增涨,es的查询效率方面遇到了很多的问题。由于在早期建设该技术平台时,未过多考虑性能加速方面的设计,故均是配置使用的普通大容量、低速磁盘。
现在,为满足业务使用需求,我们需要对es平台继续进行扩容,加入更多的SSD配置的服务器,服务于频繁查询使用的近期数据使用需求。
为达到这一设计目的,我们调研了大量的中英文技术资料,很多资料都是片段性的,难以提供一个全局性方案的指导。所以,现将我们整理、优化并实施验证过的技术方案概要做一下说明,以帮忙更多的人提供处理类似问题的参考。
本文以介绍主要实现思路为主,对基础的配置方法细节不做过多的描述。
技术方案的设计思路
从elasticsearch7.x后开始支持为es实例设置属性标签参数。这种标签参数主要有两种用途,其一是用于分片分配感知(allocation awareness),管理在哪里放置数据的副本,如下所示。当有多个es节点可用时,es会尽量把分片与副本均衡到rack_id值不同的节点上去。但如果只剩一个可用的es数据节点了,es也会选择把一个索引的分片和副本全部部署在同一个节点上面。
node.attr.rack_id: rack_one
cluster.routing.allocation.awareness.attributes: rack_id
其二,是用于iLM索引生命周期管理服务中。iLM提供了hot/warm/cold/delete等几个生命阶段,每的阶段进入的条件都支持根据自定义的实例节点属性标签值进行判定。所以,我们主要就是利用这一点来实现索引数据在SSD配置的实例、低速大容量磁盘配置的实例之间进行调度的。
node.attr.box_type: warm
node.attr.box_type: hot
当然了,以上只是实现es冷热数据分区存储的一个基本指导思想,在真正的生产系统实现时,需要考虑到更多的复杂因素。
方案要点介绍
由于我们是采用对在用生产系统进行扩容SSD配置服务器的方式,故既需要处理新增设备,也要将在用设备配置妥当。
在用实例节点的配置变更
elasticsearch.yml文件
新增:node.attr.box_type: warm
由于扩容前的在用实例节点均是配置的低性能大容量磁盘,故全部为其设置box_type:warm的属性标签。
部署和配置SSD主机上的服务实例
除去基础性的程序部署和配置调整外,需要注意,在elasticsearch.yml文件中新增:
node.attr.box_type: hot
在新扩容的热数据节点中,不增加新的master node角色,全部作为data node运行。
重启Elasticsearch服务集群
es实例节点属性标签box_type非要重启实例程序才能生效。
为使新增的节点实例标签生效,我们需要逐个重启实例进程。
在重启es集群服务时,有以下几点注意事项:
- 建议临时关停数据入库程序,如logstash;
- 刷新索引缓存 POST _flush/synced ;
- 先关datanode角色节点;
- 最后关master角色的实例,尤其是把active master的实例留在最后一个关闭;
- 再统一启动全部服务实例,按与关停操作刚好相反的顺序。
观察master角色节点是否成功形成一个集群并选举出主节点
GET _cat/nodes
GET _cat/health?v=true
如果此时kibina提示无法连接es服务,则暂不能通过kibana查看es集群状态了,可以改为使用以下命令行的方式进行查询:
curl -k --header "Content-Type: application/json;charset=UTF-8" -XGET --user USERNAME:PASSWORD 'https://192.168.1.11:9200/_cluster/health?pretty'
注:需要使用适合的账号密码替换命令行中的 USERNAME:PASSWORD
观察并等待集群服务恢复至yellow或green,观察是否所有节点都已加入集群,且集群的健康状态从 red 变为了 yellow。
禁用集群分片分配功能
在启动和将SSD实例节点加入ES集群之前,我们先临时禁用掉es集群的索引分片分配与再平衡的功能,以避免有历史索引数据分布到了SSD实例节点上去。
(1)禁止创建索引分片
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}}
禁用索引分片再平衡服务
PUT _cluster/settings
{
"persistent": {
"cluster.routing.rebalance.enable": "none"
}}
启动SSD配置服务器上的es服务扩容实例
我们就不在这里描述怎样部署和配置es服务实例了,相关资料在网上有很多。
在这里,主要是强调启动扩容实例程序的步骤位置。
注意观察程序日志输出信息,观察集群服务和实例节点的健康状态指标,扩容节点正常加入集群且状态符合预期。
设置es索引模板以启用冷热数据的分区管理
Logstash在向es集群写入索引数据时,会按预定义的格式规范为每天创建一个索引,创建索引的配置规范则是在es集群中的索引模板中预定义好的。
我们需要修改索引模板的配置信息,添加索引分片过滤参数,使得在创建新的索引文件时默认使用高性能的SSD实例节点。
登录kibana,进入Stack Management/Index Managent/Index Templates界面。
设置主要使用的几个索引模板,并添加下面的分片分布过滤参数配置:
"routing.allocation.require.box_type": "hot",
索引模板是es生产环境中很重要的概念,因为生产环境中对索引的结构、分片数量、副本数量、关键词等有很多的配置要求,才能保证最终的数据使用效果与效率。这些复杂的索引定义信息便是通过索引模板来维护的。当我们使用logstash向es写入数据并创建索引时,会调用匹配上的索引模板并创建出符合使用要求的索引文件来。
修改iLM索引生命周期管理
登录kibana,在索引模板iLM管理页面,针对"warm"阶段、"cold"阶段均需要启用判断节点属性 box_type=warm
的配置。
预期配置效果是,7天以上的历史索引分片数据(这个时间范围可以根据自己实际情况调整),自动向warm低性能节点转移。
恢复es集群的索引分片管理功能
恢复es集群的索引分片分配等参数配置。
(1)启用创建索引分片服务
PUT _cluster/settings
{"persistent":
{"cluster.routing.allocation.enable": "all"
}
}
(2)启用分片再平衡服务
PUT _cluster/settings
{
"persistent": {
"cluster.routing.rebalance.enable": "all"
}}
配置和启动Logstash服务
观察索引创建与分片分布,是否符合我们的设计预期,新建索引分片应该均是分布在SSD配置的实例上。
logstash服务在以上扩容操作中,基本上涉及两处变更。一个是/etc/hosts中补充定义扩容节点的主机名/IP映射关系,另一个是编辑logstash.conf文件,在output段落中为elasticsearch.hosts参数值补充新增的实例节点信息。
手工调整指定索引的分区标签参数
如果有大量的历史索引,因为没有包含冷热分区属性,很可能会被iLM调度到SSD配置实例上去,那么可以参照下面的方法手工调整下索引的设置参数,以避免这样的问题:
查看索引参数的信息:
GET applog-20211112/_settings
设置索引参数的信息:
PUT applog-20211111/_settings {"index.routing.allocation.require.box_type": "warm"}
以下是命令行方式的设置方法,便于写个shell脚本对大量的历史索引批量地进行变更:
curl -k --header "Content-Type: application/json;charset=UTF-8" -XPUT --user USERNAME:PASSWORD https://192.168.1.11:9200/applog-20211211/_settings -d '{"index.routing.allocation.require.box_type": "warm"}'
查看es集群配置信息与健康状态信息
下面是常用的一些查询命令:
GET _cluster/health
GET _cluster/settings
GET _cat/nodes
GET _cat/nodeattrs
GET _cat/health?v=true
GET _cat/recovery