ElasticSearch版本:6.4.2
缩容场景:
公司多个ES集群,占用资源,考虑释放多台服务器。
问题调研:
集群脑裂,集群同时出现多台master节点,导致数据彼此不同步,处理起来会非常麻烦。
ES官方推荐集群最少三台节点构成。那么我考虑将公司的数据集群缩容成两台,两个节点构成的集群能否避免脑裂问题呢?
两个节点构成的集群有哪些风险和优势呢?
问题剖析:
master选举
discovery.zen.minimum_master_nodes参数设置,对master选举至关重要,表示必需有多少台节点参与选举,master选举才能正常进行。参数设置算法是:master候选资格节点数量 / 2 + 1。
三台节点集群master选举和高可用
拿三台节点的集群来说,discovery.zen.minimum_master_nodes = 3/2+1=2,表示最少保证有两台节点参与选举,master选举就能进行。也就是说,保证了每次选举只会产生一个master,不会脑裂;同时,只有保证有两台正常运行,集群仍是可用的,体现微观高可用(毕竟只是三台的初等集群场景)。
综上,三台及以上节点构成的集群,master选举和高可用都可以保证的。
两台节点集群master选举和高可用
拿2台节点的集群来说,discovery.zen.minimum_master_nodes = 2/2+1=2。同样也是2,也就是说,保证两台节点都正常的话,也能进行master选举,且能保证只产生一个master,也不会脑裂;但只要有一台异常,选举就不能进行,集群就不可用。
综上,两台节点构成的集群,master选举正常,不会脑裂,但不能保证高可用。该方案适用于学习或测试环境,资源有限的情况下,也不失为一种集群方案。
实施步骤:
基于kibana完成集群缩容,步骤如下:
-
查看集群节点情况,确认要剔除的节点。
GET /_cat/nodes?v -
通过kibana-》Monitoring-》Nodes,查看被剔除节点占用内存情况,和保留节点的可用内存情况,保证剔除节点后,内存充足。
-
执行剔除节点,这将导致Elasticsearch将该节点上的分片分配给其余节点,重点是操作期间,保证ES集群正常可用。重新分配所有分片后,可以关闭被剔除节点。
PUT _cluster/settings
{
“transient”: {
“cluster.routing.allocation.exclude._ip”: “10.xxx.xxx.xxx”
}
} -
通过kibana-》Monitoring-》Nodes,监控分片重新分配情况,直至剔除节点的分片数为0,执行如下命令,查看如果没有节点relocating,则剔除节点已经被安全剔除,可以考虑关闭节点
GET /_cluster/health?pretty -
关闭节点服务
-
置空剔除节点列表
PUT _cluster/settings
{
“transient”: {
“cluster.routing.allocation.exclude._ip”: null
}
}
至此,ElasticSearch集群缩容完成。