大佬教程收集整理的这篇文章主要介绍了ES集群启动流程,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
ES集群是主从模式的,其启动的过程主要包括主Master选举,集群元数据选举,索引主分片选取和副本分片选取。其主要过程如下:
集群启动的第一件事就是选取Master节点,选取的时间点为当集群启动的备选master节点过半时,开始集群的选举,这一点和zookeeper是类似的。例如集群有7个节点,有5个节点设置了node.master:true
当这5个备选节点中有超过discovery.zen.minimum_master_nodes
(避免脑裂该值应该是半数已上)个节点启动时,就可以开始选举主节点。当主节点得票超过半数后,当前节点被选择为主节点。
主节点确定之后,主节点会向所有的节点询问元数据信息,当收到的元数据过半之后,对比元数据的版本号将版本号最大的元数据作为最新的元数据,并将元数据广播到集群中。这里的过半指的是候选元数据节点。因为只有这两个节点可以持久化元数据到磁盘。这里涉及到三个参数:
在元数据选举完成后,开始数据分片的选择。ES为了保证数据的高可用,设计了分片及副本分片,作为准备模式。
对于主分片,应选取集群中的最新分片。在ES5.X之前,Master会询问其他节点关于分片的信息,这种情况下,Master节点在短时间内会接收到节点数*分片数的信息,然后宣群每个分片最新的信息,这样在短时间内,传输的数据量交到,在ES5.X之后,ES为每个分片设置了一个shardUUID,并在元数据中保存着哪个分片是主分片。因为ES写的顺序是先写主分片,然后并发写副本分片,这样的机制保证了主分片的数据是最新的。因此元数据记录的最新主分片即为重启后的主分片。在重新启动时,主分片所在的节点可能无法正常启动,这时候会在in-sync列表里选取一个分片作为主分片。
主分片分配完成后,分片汇总信息中的其他分片作为副本分片,如果还不够,则说明有的分片所在的节点已经无法启动,这时候集群会在其他节点重新分配副本分片。ES并没有强制要求相同分片的副本不能再同一个节点分配。而kafka则有这样的要求。
在分片分配完成后,则开始了分片数据的恢复。
主分片的恢复不会等到副本分片全部选取之后才开始。他是一个独立的过程。主分片需要恢复的原因是在上此次关机或者集群异常退出时,有些数据可能还没有刷盘。每次刷盘都会记录一个syncid,tranlog需要重放syncid后的写操作。并简历Lucene索引。
副本分片恢复是一个较为复杂的流程,这个流程经过了多次的修改,这个修改的过程与redis的主从复制面临着同样的问题,解决思想也比较相似。
初始版本分为两个阶段:
这个版本的恢复存在的问题是,不管副本分片之前有无数据都需要复制主分片的所有数据。当数据量较大时,phase1需要执行很长时间,这回带来两个问题:
基于已上的不足,副本的恢复经过,视图版本,将translog分成多个文件,进化到最终的基于序列号的最终版本。分片在每次刷盘是都会记录当前分片刷盘的sequencenumber。副本在恢复时会将自己的sequencenumber发送给主分片,如果sequencenumber在translog中,则直接使用translog恢复,否则才制作phase1中的快照。
当副本分片执行完phase1后就可以接收集群的写入请求了。这时候会存在一个问题,恢复过程中旧值被新值覆盖的问题。例如文档ID为docId的值刚开始为4。这个值在translog中,主副本分片都没有来及刷盘服务器重启了,当phase1执行完之后,集群接收到请求将docId设置为4,这时候如果副本分片先执行了修改值,然后重放translog。这时候docId的值就会被覆盖为3。 ES引入了版本号来解决这个问题。版本号由主分片分配,当发现存在旧版本数据覆盖新版本数据时,会放弃覆盖来解决这个问题。
以上是大佬教程为你收集整理的ES集群启动流程全部内容,希望文章能够帮你解决ES集群启动流程所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。