深入了解ES之ES集群的启动流程

ES集群的启动流程

ES的在启动的过程中主要会经过:

1.electmaster(选举主节点)

ES的选主算法是基于Bully算法的改进,主要的思路是对节点ID的排序,取ID值最大的节点,作为Master,每个节点都运行这个流程。

  • 参赛人数需要过半
  • 得票数需要过半
  • 当存在节点离开时,要判断当前的节点数是否过半。如果没有过半,已选择的Master将放弃Master地位,重新选取。

这里为了防止由于网络延迟等原因,出现“脑裂”现象

discovery.zen.minimum_master_nodes    最小值为: 具有Master资格节点数n/2+1

ID分别为:1、2、3、4、5 节点

  • 依次启动3会当选
  • 当3发生宕机,5会当选
  • 当3从宕机中恢复,5会继续保持Master(es集群)

但是Zookeeper集群下,3从宕机中恢复会获得Master身份。
像比较而言zookeeper选主机制更加优秀,支持如果Master宕机后恢复,该节点会继续成为Master.(不需要进行ID的比较)

2.gateway(收集选举集群元信息)

Master节点第一个任务是让各节点把各自存储的元信息发送过来,再比较版本号之后,将最新的元信息广播到所有的节点中。
集群元信息的选举包括:集群级和索引级。
集群元信息选举完毕后,Master发布首次集群状态,然后开始选举索引级元信息。
在gateway选举的过程中,不接受新节点的加入请求。

3.allocation(分配过程)

ES中通过分配过程决定哪个分片位于哪个节点,重构内容路由表。
第一步:选主分片
ES中所有的分配任务都是由Master来完成的。
主分片选举过程中是通过集群级元信息中记录的“最新主分片的列表”(这里的新旧是通过UUID来确定的)来确定主分片的。

第二步:选副分片
主分片选举完成后,从上一个过程(即选主分片)汇总的shard信息选择一个副本作为副分片。如果汇总信息不存在,则分配一个全新副本的操作依赖于延迟配置项:

index.unassigned.node_left.delayed_timeout #通常以天为单位

在allocation分配的过程中,运行新启动的节点加入集群。

4. index recovery(索引恢复)

主分片的recovery不会等待其副分片分配成功才开始recovery。它们是独立的流程,只是副分片的recovery需要主分片恢复完毕才开始。

第一步:主分片recovery
由于每次写操作都会记录事务日志(translog),事务日志中记录了具体操作以及相关数据。主分片通过将最后一次提交的事务日志重放,
建立Lucene索引,如此完成主分片的recovery.

扫描二维码关注公众号,回复: 9821474 查看本文章

第二步:副分片recovery
副分片的恢复需要与主分片一致,同时,恢复期间允许新的索引操作。
通常会分成2个阶段来恢复:
1. 在主分片的节点中,获取translog保留锁(这使得索引操作可以正常执行),然后调用Lunece接口把shard做快照(因为这时主分片已经完成索引恢复),然后将shard数据复制到副本节点。(这时副分片就可以处理写请求了)
2. 对translog做快照处理,并发送大副本节点进行重放。(保证了主副分片数据的一致性)

ES启动时的外部检查

ES中的“节点”在实现时被封装为Node模块。在Node类中调用其他内部组件,同时对外提供启动和关闭方法,对外部环境的检测就是在Node.start()中进行的。
检测项包括:

  • 堆大小检查:通常要将JVM堆大小(Xms)与最大堆大小(Xmx)的值设为一致。
  • 文件描述符检查:调整系统的默认值 (如 /etc/security/limits.conf 设置最大线程数)
  • 内存锁定检查:ES允许进程使用物理内存,避免使用交换分区。(生产环境下建议关闭操作系统交换分区)
  • 最大线程数检查 :ES将请求分解为多个阶段执行,每个阶段使用不同的线程池来执行。因此ES需要使用很多线程池。
  • 最大虚拟内存检查:Lucene使用mmap来映射部分索引到进程地址空间,所以要足够多的地址空间,即占用多的虚拟内存。
  • 最大文件大小检查:段文件和事务日志存储在本地磁盘,它们可能会非常大,所以建议将系统的最大文件设置为无限。
  • 虚拟内存区域最大数量检查:ES进程需要创建很多内存映射区,本项检查是要确保内核允许创建至少262144个内存映射区。
  • JVM Client模式检查:JVM的运行模式:client JVM模式与server JVM模式。client
    JVM调优了启动时间和内存消耗,server JVM提供了更高的性能。默认使用server JVM.
  • 串行收集检查:串行收集器会影响ES的性能,默认使用CMS。
  • 系统调用过滤器检查:根据不同的操作系统,ES安装各种不同的系统调用过滤器。这些过滤器可以阻止一些攻击行为。(同时要求使用普通用户来启动ES,也是为安全性)
  • OnError与OnOutOfMemoryError:JVM遇到致命错误或内存溢出。
发布了232 篇原创文章 · 获赞 42 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_40990818/article/details/104848544
今日推荐