Qunar万亿级Elasticsearch集群节点迁移实战
作者介绍
许睿哲
2020年12月加入去哪儿网-数据平台团队,目前主要负责公司的 esaas 云服务与实时日志 ELK 平台的开发、维护与优化。主导参与了公司的es平台的SLA规则的制定与开发、 ES 架构升级迁移与jinkela集群拆分等工作。
机房 A 目前为饱和状态,批量新增机器难以支持 机房 A 主要由 Hadoop、ES 集群组成,业务交互会产生大量跨机房流量,峰值会影响到业务
如何保证迁移中的服务可用性与用户无感知
如何提升迁移效率
迁移的速度:主要取决于迁移策略和持续的调优。迁移的总数据在PB级,单机器(机械硬盘)也到了10TB+,优化迁移效率,提升速度是后续持续研究的重点。 迁移的人工成本:迁移过程中,每个流程环节都需要人工介入,如何能提升自动化率,降低人工成本,也是研究提高生产力的方向。
· Data Node
· Coordinate Node
· Master Node
· Kibana
· Service
a. 手动迁移节点 b. 调参保证稳定性 c. 整理问题,确立后续工作侧重点
PUT _cluster/settings{"transient" :{"cluster.routing.allocation.exclude._name" : "data1_node1,data2_node1,data1_node2,data2_node2,data1_node3,data2_node3,data1_node4,data2_node4,data1_node5,data2_node5"}}
Tips: 迁移节点数据最直接的方法就是官方提供的exclude操作,这个操作是集群级的,可以直接通过"_cluster/settings"进行修改,执行操作后,集群会将匹配到的节点的分片reroute(同步)到其他节点上。通过exclude分为以下三种操作: · exclude._name:将匹配的node名称对应的节点数据迁移,多个node名称逗号分割
· exclude._ip:将匹配的node的ip对应的节点数据迁移,多个ip用逗号分割
· exclude._host:将匹配的node的主机名对应的节点数据迁移,多个host用逗号分割
a.添加 exclude_name 后,集群多了很多 relocating shards,此时会出现大量的分片迁移操作,通过_cat/recovery 可以看到期间的分片进行的过程。 b.白天集群是写入高峰,压力不算小,此时还需要同步数据,会造成 exclude name 对应的节点,因为要大量的迁出数据,会进行大量的磁盘读操作,同时,还有很多分片还在进行当前的写入操作,磁盘 io 很容易趋近于100%(使用的是机械盘)。 c.迁入分片的节点也因为读取量的飙升,导致了磁盘的 io 上涨。继而影响同步两侧的节点纷纷 load 飙高,影响的就是会有个别的 appcode 写入堆积。
高峰时期:调整到2个机器节点同时 exclude。 低峰时期:保持5个节点同时 exclude。
* status:集群状态为 Green
* load:集群 load>30节点不超过7个;load>50的节点不能超过3个(基于日常集群情况)
2. 判断 relocating shards count:
* 哪些节点迁移完成:如有,则统计数量
* 目前在迁移的 shard 数量
如果有节点迁移完成,且正在迁移的 shard 数量在40以内,可以进行新节点批次迁移,否则说明尚有多数分片在同步中,需等待下一次判断
3. 下线迁移完的机器节点。根据第二步得到的机器列表,下线前,需再次校验是否机器节点无索引分片
4. 获取下一批 exclude 的列表(顺序)
5. 根据时间峰值进行 exclude(基于之前的经验)
* 高峰:2个机器节点
* 低峰:5个机器节点
注:
*实际迁移的机器节点数为:需要迁移的节点数 X - 已经迁移完成的节点数 Y
*这样可以保持系统一直迁移机器数一直稳定在峰值对应的数量
节省人力成本(不用去手动操作),同时为第三个阶段的优化架构留出了演进基础 保证迁移节点数量保持恒定
index.routing.allocation.total_shards_per_node:设置单个索引在单个节点上最多的分片数(包括主副本)。默认无限量
total_shards_per_node: shard_num/(nodes_count * 0.95(buffer系数) * 0.5){"order": 99,"index_patterns": ["log_appcode-*"],"settings": {"index": {"number_of_shards": "278","routing": {"allocation": {"total_shards_per_node": "2"}},"refresh_interval": "60s"}},"mappings": {"properties": {#索引独立的结构}}}注:上面这个template 模板设定的索引分片单个节点最多分配两个分片。
index.unassigned.node_left.delayed_timeout : 节点脱离集群后多久分配unassigned shards(默认1min),相当于延迟恢复分配多久的时间。
1.INIT:刚开始恢复的阶段 2.INDEX:恢复Lucene文件 3.VERIFY_INDEX:验证Lucene index中是否有分片损坏 4.TRANSLOG:重放Translog,同步数据 5.FINALIZE:执行refresh操作 6.DONE:更新分片状态,完成操作
delayed_timeout = random.randint(100, 300)PUT /index/_settings{"settings": {"index.unassigned.node_left.delayed_timeout": delayed_timeout}}
PUT _cluster/settings{"transient" :{"cluster.routing.allocation.exclude._name" : "data1_node1,data1_node2,..."}}
cluster.routing.allocation.cluster_concurrent_rebalance: 用来控制集群内并发分片的 rebalance 数量,默认为2
周中新上的机器节点 node-300,到了周末统一创建索引的时候,由于 node-300基本没有分片(除少数新增索引外),会有大量的分片创建到 node-300中。 ES 集群创建完次周索引后,分片数在10w,数据节点数大致为450,平均到单个数据节点的分片大致为220+。而新周的索引分片数大约在5w+,对应的分片数为110+,而 node-300的新周索引分片数即为220+,相当于是其余节点的1倍以上。
1.主要的思路是:计算次周总的分片数/可用数据节点,得到平均分片,然后将分片多的迁移到分片少的节点。 2.因为是空索引,迁移时间基本可以忽略不计。 3.需要注意的是可用数据节点,从_cluster/health 可以获取到对应的可用 data node 数量,但是还需要将_cluster/settings exclude._name 中对应的节点数排除出去方是真实可用的数量。 4.同步完后,可以达到写索引的平衡(整体分片数不一定均衡)。
1.顺序:先进行节点迁移=》然后进行分片平衡
2.时间:一般会提前1-2天创建次周索引,可以在创建索引后进行以上流程操作
3.节点迁移增加新节点相当于是将需要迁移的分片迁移到新节点上,因为是新节点,基本上不会有 reroute 冲突
4.可以根据机器的配置进行阈值的调整,比如迁移节点后计算节点分片阈值为80(每个节点平均80个次周分片),可以将高配置的机器阈值提高:
48c的机器 阈值增加20%
32c的机器 阈值降低20%
如果有 ssd 机器,可以在原有阈值上进一步提升,也可以做点对点分片均衡调整,将高配置节点、分片数较少节点统一作为被同步节点,将配置低节点、分片数远高于阈值节点作为同步节点,进行 reroute。
分片均衡,可以参考以下用法:
POST _cluster/reroute{"commands": [{"move": {"index": "log_appcode-2023.18","shard": 59,"from_node": "data2_node1","to_node": "data2_node10"}}]}
用了这个方法,可以说,速度提升了2倍以上,并提前了一周多完成了节点的迁移。 reroute new shard 思路还适用于平时的平台开发维护,后来也用到了 ES日志集群的拆分工程中,至于 Qunar-ES 集群拆分实践,可以留做后续专门独立做一个分享。
Tips:
建议小集群可以不用单独的协调节点
大集群协调节点建议如下配置(只做协调作用):
唯一需要注意的点是,由于整个集群的迁移是不停服务的,而 elasticsearch.yml 的 master 与 discovery 模块配置的 master 选举的节点列表已经写的是机房 A 的机器节点,一旦用了机房 B 的 master 服务,是无法感知对应的 node。 master 节点需要一个一个迁移,如果低于需要的最小数量,集群恐无法使用 master 的 node 名称感知问题可以通过以下来做: 将 new master 节点 =》 host 到 old master 节点上,效果就是如下:
制定迁移计划:针对不同的节点类型制定不同的方案(提前制定好可预见的问题与应对方案,这点非常重要) 能用自动化代替人工的,尽量多走自动化,提升效率,复用性高,稳定性好 熟悉对应的底层原理与系统参数,可以更好的指导技术层面的优化与实践
total_shards_per_node node_left.delayed_timeout 单机器单节点迁移 reroute迁移演进
有时候系统性的优化或者方案,从来都不是一蹴而就的,都要通过不断的尝试与调整,在对系统原理的把控上,进行方案的优化,从而取得持续的进步。
https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster
https://www.elastic.co/guide/en/elasticsearch/reference/7.7/allocation-total-shards.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.7/delayed-allocation.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.7/index-modules-translog.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.7/cluster-reroute.html
https://cloud.tencent.com/developer/article/1334743?cps_key=6a15b90f1178f38fb09b07f16943cf3e
https://blog.csdn.net/laoyang360/article/details/108047071
以上就是本次分享的所有内容啦!
最后,给大家带来一些岗位招聘信息。
你与驼厂只差一份简历的距离
快扫码投递吧