Elasticsearch学习-集群选主问题

Elasticsearch选择主从的模式作为其分布式架构的设计方案,该模式在节点数并不多、相对稳定的网络、并不需要经常处理节点的加入或离开的应用场景下是合理的选择。

选举算法

在选举算法中以 Bully算法为主,该选举算法假设集群节点都有一个唯一ID,根据 集群状态+唯一ID做二次排序获取到Master节点。当集群不稳定时,如Master负载过重而假死,集群第二位节点当选Master,这时老的Master恢复了,再次被选为新主,再次假死。ES通过推迟选举的方式,即当从节点发现Master假死,通过检测的方式判断是否真正假死。但此方法容易产生脑裂,通过 法定得票人数过半解决脑裂问题

选举流程

选举流程分为两步:

  1. 每个节点计算已知最小ID ,该节点视为临时Master,并向临时Master投票
  2. 当一个节点收到的投票数大于最小法定人数(n/2+1)时,它将成为正式的Master,并发布集群状态

选举临时Master

首选介绍两个集合分别为:activeMaster和masterCandidates

  • activeMasters:这个集合中存储的是当前活跃的Master,集合的size存在 0或1两种可能性。当集合大小为0时,集群需要通过排序masterVCandidates进行选主;当集合大小为1时,说明当前集群存在Master,选主结束。
  • masterCandidates:集合中存储Master候选节点(node.master=true),通过排序逻辑支持当前节点选主

选主的主流程如下:

Created with Raphaël 2.2.0 开始 执行ping 获取节点列表 构建activeMaster、masterCandidates集合 activeMaster是否为空? 从masterCandidates中选主 operation: 判断候选人是否达到法定人数? 结束 选择activeMaster做为主节点 yes no yes no

选主前需判断候选人数量是否达到法定人数,否则重新ping节点,在进行排序的时候,会选择集群状态版本号高且ID小的节点,选择集群状态版本号高的原因是需要选择元数据最新的节点作为主节点,这样可以避免元数据丢失。

确认Master

Master为当前节点
  1. 等待足够多的具备Master资格的节点join请求投票,当投票达到法定人数则完成选举
  2. 若超时后,join请求没有达到法定人数则重新选举
  3. 成功后,发起节点状态
Master为其他节点
  1. 拒绝其他节点的join请求
  2. 向Master发出请求并等待回复
  3. 检测join请求返回值是否为空或并不是选择节点,则重新选举
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Docker-compose搭建Elasticsearch集群,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Docker和Docker-compose。 2. 创建一个名为docker-compose.yml的文件,并在其中定义Elasticsearch集群的配置。你可以使用以下示例作为参考: ``` version: '3' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2 container_name: es01 environment: - node.name=es01 - cluster.name=my-cluster - discovery.seed_hosts=es02,es03 - cluster.initial_master_nodes=es01,es02,es03 ports: - 9200:9200 volumes: - esdata01:/usr/share/elasticsearch/data es02: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2 container_name: es02 environment: - node.name=es02 - cluster.name=my-cluster - discovery.seed_hosts=es01,es03 - cluster.initial_master_nodes=es01,es02,es03 volumes: - esdata02:/usr/share/elasticsearch/data es03: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2 container_name: es03 environment: - node.name=es03 - cluster.name=my-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02,es03 volumes: - esdata03:/usr/share/elasticsearch/data volumes: esdata01: esdata02: esdata03: ``` 3. 在终端中,进入包含docker-compose.yml文件的目录,并运行以下命令启动Elasticsearch集群: ``` docker-compose up -d ``` 这将会启动一个包含三个Elasticsearch节点的集群。 4. 使用以下命令验证集群是否成功启动: ``` docker ps ``` 你应该能够看到三个运行中的Elasticsearch容器,每个容器对应一个节点。 现在,你已经成功使用Docker-compose搭建了一个Elasticsearch集群。你可以通过访问http://localhost:9200来访问集群Elasticsearch节点。 #### 引用[.reference_title] - *1* *3* [Elasticsearch (一) 基于Docker-compose 搭建集群](https://blog.csdn.net/m0_67390963/article/details/124240861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【Docker-compose Elasticsearch搭建集群】](https://blog.csdn.net/qq_39127761/article/details/126221224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值