2.2 Elasticsearch集群的形成机制
Elasticsearch在生产环境中都是以集群的方式使用的,了解各节点如何互相发现并形成有效的集群是开发者用好Elasticsearch需学习的重要内容,本节就来探讨集群的形成过程。
在讲解集群的形成过程以前,需要介绍几个重要的概念,它们在集群的形成过程中发挥着重要的作用。
(1)主节点(master node):每个集群有且只有一个主节点,主节点是整个集群的管理者,它负责维护整个集群的元数据,并在节点数目发生变化时及时更新集群的状态然后将状态发布给集群的其他节点。主节点还负责索引分片的分配,本书将在2.3节探讨索引分片的分配。另外,主节点还能处理一些轻量级的请求,例如创建和删除索引。
(2)主候选节点(master-eligible node):主候选节点指的是集群中有权参与主节点选举的那些节点。选举时,超过一半的主候选节点达成一致方能成功。选举出的主节点是主候选节点列表中的一个。为了维持集群的正常运转,任何时候必须确保有一半以上的主候选节点在正常工作。
(3)投票配置(voting configuration):投票配置包含主节点选举或集群状态需要修改时可参与投票的节点列表。在一般情况下,投票配置的列表与主候选节点的列表是一致的。选举主节点时,只有某个节点的得票数超过投票配置中节点数的一半,选举才能成功。你可以人工排除一些主候选节点,即不让它们参与投票,在9.3节将演示这个过程。投票配置的信息保存在集群的元数据中,可以调用REST端点进行查看。
2.2.1 集群节点的发现、选举和引导过程
当一组崭新的Elasticsearch节点启动的时候,需要进行集群节点的引导来把这些孤立的节点组织成一个整体对外提供统一的服务。集群节点的引导主要分为4个步骤。
(1)初始化投票配置。确定集群中的主候选节点列表,将配置cluster.initial_master_nodes中的节点列表作为主候选节点列表写入投票配置。
(2)选举主节点。投票配置中的主候选节点发起主节点的选举,只要超过一半的主候选节点达成一致,则主节点选举成功。
(3)发现集群的其他节点。每个节点根据配置的主候选节点列表discovery.seed_hosts逐一尝试连接,如果联系到了主节点就申请加入集群,主节点确定连接成功就把该节点加入集群并修改集群的状态,然后将集群的最新状态发布到其他节点中保存。
(4)当所有的节点都发现完毕,整个集群的状态生成结束时,待集群启动完毕就可以对外提供统一服务。
注意:在步骤(3)中,节点的发现过程是递归的。即使某个节点的discovery.seed_hosts不包含集群的主节点,只要它可以通过列表中的节点间接地找到主节点,就能被主节点纳入集群。
2.2.2 集群状态的发布过程
2.2.1小节讲述了一个崭新的集群形成所经历的步骤,然而对于现有的集群,添加和删除节点会改变集群的状态。集群的状态是一种庞大的数据结构,它包含整个集群的元数据信息。当集群状态发生变化时,主节点需要把最新的状态发布给每个节点,这个过程需要经历以下两个阶段。
(1)预提交阶段:如图2.2所示,主节点把最新的集群状态数据发布到每个节点上,每个节点接收状态数据并将其保存在本地然后向主节点发送确认响应。
图2.2 状态发布的预提交阶段
(2)正式提交阶段:如图2.3所示,主节点统计收到的主候选节点的确认响应数量,如果超过一半的主候选节点的确认响应成功,则开始正式提交。主节点发布提交消息到集群的每个节点,通知它们应用最新的集群状态。每个节点应用最新的集群状态后,向主节点发送最终的确认响应。一旦所有的确认响应成功,则本次状态发布成功完成。
图2.3 状态发布的正式提交阶段
集群状态的发布具有时间限制,如果超过时间限制(默认为30秒)主节点状态没有发布成功则主节点失败,主候选节点需要重新选举新的主节点。如果某个节点最终的确认响应超过一定时间限制(默认为90秒)没有发送到主节点,则主节点认为该节点掉线,将其从集群列表中删除。
集群在运行时可能会由于网络环境或硬件问题导致某些节点不能正常工作,为了维持集群的正常运转,主节点和非主节点每隔一段时间就会互相发送心跳检测包。如果某个非主节点连续多次心跳检测失败,则该节点掉线,主节点会把它从集群的状态中删除;如果主节点掉线,则需要使用投票配置重新选举出新的主节点来管理整个集群。