AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

腾讯云 Elasticsearch 集群多可用区容灾实现原理及最佳实践

  • 2021-05-07
  • 本文字数:3192 字

    阅读完需:约 10 分钟

腾讯云Elasticsearch集群多可用区容灾实现原理及最佳实践

引言


目前腾讯云 ES 集群可以支持双可用区及三可用区的集群部署,且支持单可用区平滑升级到多可用区集群。当一个可用区出现故障时,剩余可用区依然能够保障集群的稳定性、服务的可用性和数据的完整性。


数据节点


当客户选择了跨多可用区的集群架构部署时,集群的数据节点必须是多可用区的倍数,如客户选择的是三可用区部署,则数据节点个数应为 3,6,9,12 等,以此类推。



如上图 1 所示,我们在上海地域选择了三可用区集群的部署,数据节点数量选择 6 个。ES 会自动将 6 个数据节点均衡得分布在三个可用区中,并对每个节点标记上可用区属性,从而可以通过可用区感知功能将索引的分片自动分布在多可用区中,集群中节点的具体分布情况如图 2 所示。



从图 2 中我们可以看到,腾讯云 ES 提供了 VPC 内的负载均衡功能,客户可以直接通过 VIP 连接集群,由于 VIP 下绑定了集群内部的所有数据节点,因此客户所有的读写请求会均衡的分布到各个数据节点上。


另外该 VIP 还自带健康检查功能,如一个周期内多次检测到某节点未响应,健康检查功能则会暂时从该 VIP 的路由列表中摘除该异常节点,直到节点恢复正常。这样就保障了当一个节点宕机或者某一个可用区不可用的情况下,客户端依然能够无感知的请求集群。


专用主节点


为了保障集群的稳定性和高可用性,当选择多可用区集群架构部署时,需强制设置三个专用主节点。其中专用主节点的分布机制如下:


  • 当选择三可用区部署时,会在每个可用区部署一个专用主节点,从而保障任何一个可用区不可用时,依然能够选出 Master 节点;

  • 当选择双可用区部署时,为了避免出现一个可用区上分布两个专用主节点且出现“该可用区不可用”导致选不出 Master 节点的情况,腾讯云 ES 会选择一个隐藏可用区用来专门部署专用主节点,如下图 3 所示。



索引副本分片


为了保障在一个可用区不可用的情况下,依然能够保证数据的完整性和服务的可用性,索引分片至少设置 1 副本。如果选择三可用区部署,当两个可用区不可用时,希望剩下的可用区依然能够完整提供服务,则索引的副本个数至少为 2 个。


ES 多可用区架构部署实现机制


腾讯云 ES 多可用区集群部署依赖于 ES 提供的节点属性感知 awareness [1] 功能。通过对每个节点进行属性标记,即对节点进行可用区的属性标记:"node.attr.zone_id:shanghai-3"。


该属性配置在 elasticsearch.yml 文件中(也可以选择在启动节点时进行参数指定:"./bin/elasticsearch -Enode.attr.zone_id=shanghai-3"),设置完节点属性后,腾讯云 ES 集群通过设置如下参数:"cluster.routing.allocation.awareness.attributes=zone_id" 来让集群在分片分配中使用节点属性执行分配策略。


这样 ES 就可以通过可用区 zone_id 属性将节点进行分类。且将索引的主副本分片分布到属性 zone_id 不同的节点上。


例如,我们创建了一个具有 4 个数据节点的双可用区的集群,分别部署在上海 3 区和上海 4 区。那么上海 3 区的节点属性为: "node.attr.zone_id:shanghai-3",上海 4 区的节点属性为: "node.attr.zone_id:shanghai-4"。


当我们创建一个索引,该索引有 5 个主分片和 1 个副本分片,那么所有的主分片和对应的副本分片都会均衡的分布在上海 3 区和 4 区上,而不会出现主分片和副本分片同时分布在上海 3 区或者上海 4 区的情况。


需要注意的是:这时候如果有一个可用区挂掉,如上海 3 区整体不可用,ES 会将上海 3 区的主副本分片在上海 4 区进行重建。即这时候会出现主副本分片同时分配在同一个可用区的情况。


为了防止某一个可用区不可用,导致另一个可用区磁盘容量被重建的分片大量耗尽的情况,腾讯云 ES 启用了分片强制感知 (force awareness) 的功能。


腾讯云 ES 通知设置如下参数:cluster.routing.allocation.awareness.force.zone_id.values=shanghai-3,shanghai-4,从而保证了在一个可用区不可用时,不会使得剩余的可用区磁盘资源不足的情况。


单可用区平滑升级多可用区


前文图 1 演示了在腾讯云 ES 控制台购买多可用区集群的操作步骤。对于存量的单可用区集群,腾讯云 ES 同样支持平滑升级到多可用区的部署架构。具体操作如下图 4 所示:



这里需要注意以下几点:


  • 当选择了升级到多可用区时,只能设置新的可用区信息,不可更改节点配置和磁盘容量;

  • 当升级到双可用区时,数据节点数量自动翻倍;当升级到三可用区时,数据节点数量自动乘三倍;当从双可用区升级到三可用区时,数据节点数量自动乘 1.5 倍;

  • 如果原集群未设置专用主节点,则会强制选择设置 3 个专用主节点;如果原集群设置了专用主节点,则节点数量不变,腾讯云 ES 会自动完成专用主节点在各可用区之间的调度和分布。


单可用区升级到多可用区的变配流程最大的难点和挑战在于专用主节点的协调上。下面重点介绍腾讯云 ES 在处理可用区升级方案中专用主节点的实现机制:


为了下图说明方便,我们先对各类型节点使用不同颜色进行标记:



普通节点:包含 master、data、ingest 等所有属性,节点上存储索引数据,使用蓝色标记。



专用主节点:只包含 master 属性,在集群中属于专用主节点,不存储索引数据,只负责管理集群和存储集群的元数据信息,使用粉红色标记。



数据节点:只包含 data、ingest 属性,一般用于具有专用主节点的场景,该节点上存储索引数据,通常也被称为专有数据节点,使用绿色标记。


单可用区升级到多可用区场景分析:


(1)原单可用区集群没有专用主节点:


如果原单可用区集群没有设置专用主节点,这种情况下无论是升级到双可用区还是三可用区都是比较简单的。


升级变配流程如上图 5 所示:


  • 在新增的可用区中申请创建并加入普通节点以及在每个可用区中各加入一个专用主节点(如果是升级到双可用区,则会在隐藏可用区加入一个专用主节点);

  • 修改各可用区中普通节点的属性为专有数据节点,即上图中将蓝色变更为绿色。


在流程的第 2 步修改节点属性时,每重启一个节点,min_master_node 都会重新计算并设定,避免在中间状态发生脑裂。


(2)原单可用区集群已设置专用主节点:


如果原单可用区集群中已经设置了 3 个专用主节点,那么按照最终的状态来看,应该是每个可用区都会均衡分布一个专用主节点。


自然想到的流程是先在新增的可用区中各加入一个专用主节点,然后再将原可用区中的多余两个专用主节点下线即可。如下图 6 所示:



具体流程步骤如下:


  • 在新增的可用区中加入数据节点及一个专用主节点(如果是升级到双可用区,则只需要在隐藏可用区申请加入一个专用主节点即可);

  • 将原单可用区中多出的两个专用主节点下线。


但是这种升级变配流程存在一个隐藏的集群不可用风险。如图 7 所示:



从图 6 的第一个流程上我们再结合图 7 可以看到,如果在中间状态原单可用区突然发生不可用,那便会出现剩余的可用区中只剩下 2 个专用主节点,这时候从 5 个专主变成了 2 个专用主节点,便会出现选不出 Master 节点的情况,从而使得集群整体不可用,违背了跨可用区的容灾初衷。


为了规避上面分析的这种异常风险,我们对图 6 的第 1 个流程的中间状态做了优化,如下图 8 所示:



具体流程如下:


  • 在新增的可用区中加入数据节点及两个专用主节点(如果是升级到双可用区,则只需要在隐藏可用区申请加入两个专用主节点即可);

  • 将原单可用区中多出的两个专用主节点和新增的可用区中多出的一个专用主节点下线。


这样便可保证即使在流程一的中间状态下任何一个可用区不可用,依然不影响剩余专用主节点选出 Master 节点。从而保障了集群的高可用性。


结语


本篇文章我们详细介绍和分析了腾讯云 ES 集群多可用区容灾的实现原理和操作实践。并重点介绍了单可用区集群升级到多可用区的几种场景及具体流程细节,希望能够帮助到腾讯云 ES 的客户朋友们。



头图:Unsplash

作者:吴容

原文:https://mp.weixin.qq.com/s/7VzmoK4ZsVfnJflEs_B9tA

原文:腾讯云 Elasticsearch 集群多可用区容灾实现原理及最佳实践

来源:云加社区 - 微信公众号 [ID:QcloudCommunity]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-05-07 04:063747

评论

发布
暂无评论
发现更多内容

Nginx简单属性和使用总结

赵镇

架構實戰營 - 模塊 6 作業

Frank Yang

架构实战营

鸿蒙究竟是什么?

Nydia

Flink集成hive测试及生产规划

一弦思华年

大数据 hive 实时数仓 数仓 flink 执行

密码学系列之:blowfish对称密钥分组算法

程序那些事

加密解密 密码学 程序那些事 密码学和算法

Python——双向队列 (deque)

在即

6月日更

EasyRecovery,拯救那些遗失的文件

淋雨

文件恢复 Easyrecovery破解 数据恢复软件 免费数据恢复

共享存储设备,如何实现差异化IO分配策略

怀瑾握瑜

云计算 负载均衡 存储 数据中心 SSD

从工单到需求管理,企业如何快速响应客户反馈?

万事ONES

项目管理 需求管理 需求 ONES

模块六:课后作业

菲尼克斯

架构实战营

电商系统微服务

贯通

架构实战营

架构实战营 模块六作业

Dylan

架构实战营

顶级程序员都是如何诞生的?

Nydia

话题讨论

架构实战营模块 6

阿体

从 Flutter 和前端角度出发,聊聊单线程模型下如何保证 UI 流畅性

魅影

大前端 事件驱动 Event iOS 知识体系

34岁安卓开发大叔感慨,帮你突破瓶颈

欢喜学安卓

android 程序员 面试 移动开发

Cookie常见面试题

悟空聊架构

缓存 面试 Cookie 6月日更

第6模块作业

高亮

架构训练营

活久见!低访问量竟然也能导致系统问题

三石

mycat

HarmonyOS学习路之开发篇——Data Ability

爱吃土豆丝的打工人

HarmonyOS Ability 鸿蒙 Ability Data Ability

不动如山,表备份硬核技术:物理细粒度备份恢复

华为云开发者联盟

集群 数仓 Roach 物理细粒度 备份恢复

推荐 3 款超好用的 Docker 图形化管理工具

学神来啦

Docker Linux 程序员 分布式 运维

云图说|初识云数据库GaussDB(for Cassandra)

华为云开发者联盟

开源 Cassandra 云数据库 GaussDB(for Cassandra) 宽列数据库

34岁Android开发大叔感慨,已拿offer附真题解析

欢喜学安卓

android 程序员 面试 移动开发

【Vue2.x 源码学习】第二十篇 - 使用真实节点替换原始节点

Brave

源码 vue2 6月日更

Linux之mkdir命令

入门小站

Linux

在线crontab表达式执行时间计算工具

入门小站

工具分享

架构实战营 模块六课后作业

iProcess

架构实战营

【Flutter 专题】128 图解 ColorTween 颜色补间动画 & ButtonBar 按钮容器

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

浪潮云说 | 开源新势力—云溪数据库ZNBase

云计算

MySQL 页完全指南——浅入深出页的原理

leonsh

MySQL 数据库 innodb

腾讯云Elasticsearch集群多可用区容灾实现原理及最佳实践_大数据_云加社区_InfoQ精选文章