ElasticSearch启动失败:master not discovered or elected yet, an election requires at least X nodes with ids from [XXXXX]
做一个单机三个节点的集群, 如果一次性全部停掉,再启动master节点时,就会提示上面的信息
主要有两点原因,
1)如果ES集群是第一次启动时,已经加入集群的几点信息保存在data目录下,以供下次启动使用,这样也就是说cluster.initial_master_nodes就不在起作用了
2)每个ES集群都维护一个选举配置集合(Voting Configurations),这个选举集合由可以选举为主节点的master类型节点组成.它除了提供选举功能,还决定者集群的状态,当选举配置集合中超过一半的节点存活时,集群才提供服务(也就是过半原则,通常集群解决脑裂问题都是采用这种方式).也就是说3个节点,挺掉一个,还有两个,属于过半了,不会有什么问题.但如果一下3个全停了,那就完犊子了.三个服务都彻底不能用了
但如果不愿意启动多个节点,也就是要将多节点集群降级,也就是如何减少集群中的节点数呢?发现很多推荐做法是清空data目录,确实这样相当于重新启动而创建一个全新的集群,可以解决问题,但是结果是导致所有的数据丢失.所以只能一个一个的停,每停一个节点,向主节点的voting_config_exclusions中添加一下要删除节点的ID或者名称
具体操作:
1) 添加排除,也就是从配置集合中删除,可以使用节点Id(node_ids)或者节点名称(node_names)来排除,如果执行失败.加上参数 wait_for_removal=false 试试
用PostMan向主节点Post http://localhost:9201/_cluster/voting_config_exclusions?node_names=node-1002,node-1003
2) 查看排除列表
用PostMan向主节点Get http://localhost:9201/_cluster/state?filter_path=metadata.cluster_coordination.voting_config_exclusions&pretty
3)然后就可以停掉节点node-1002,node1003
4)清空列表 用PostMan向主节点 Delete http://localhost:9201/_cluster/voting_config_exclusions