在生产环境中, 为了保证es的可用性, 需要一个failover的方案, es默认就支持集群模式, 下面就来试用一下 es 集群模式.
配置集群
首先要有三个 es 实例, 放在不同机器上, 假设三台机器分别叫node1/node2/node3, 分别修改各个 node 的 config/elasticsearch.yml, 设置如下:
node1:
# 集群名称 每个node的应该一致 |
node2:
# 集群名称 每个node的应该一致 |
node3:
# 集群名称 每个node的应该一致 |
启动集群
启动node1
[2016-05-08 21:55:12,053][INFO ][node ] [niko-node1] version[1.7.5], pid[2632], build[00f95f4/2016-02-02T09:55:30Z] |
启动node2
log of node2:
$ bin/elasticsearch |
log of node1:
[2016-05-08 21:55:40,144][INFO ][cluster.service ] [niko-node1] added {[niko-node2][7Fc97mnTTZGEWiLZgm4WmA][ubuntu][inet[/10.2.10.210:9300]],}, reason: zen-disco-receive(join from node[[niko-node2][7Fc97mnTTZGEWiLZgm4WmA][ubuntu][inet[/10.2.10.210:9300]]]) |
启动node3:
log of node3:
$ bin/elasticsearch |
log of node1:
[2016-05-08 21:57:40,004][INFO ][cluster.service ] [niko-node1] added {[niko-node3][UzK8fUZJRs-mrOWKJnxHBQ][ubuntu][inet[/10.2.10.211:9300]],}, reason: zen-disco-receive(join from node[[niko-node3][UzK8fUZJRs-mrOWKJnxHBQ][ubuntu][inet[/10.2.10.211:9300]]]) |
log of node2:
[2016-05-08 21:57:40,081][INFO ][cluster.service ] [niko-node2] added {[niko-node3][UzK8fUZJRs-mrOWKJnxHBQ][ubuntu][inet[/10.2.10.211:9300]],}, reason: zen-disco-receive(from master [[niko-node1][iZzjAHGURxW3orWute-PtQ][ubuntu][inet[/10.2.10.209:9300]]]) |
查看集群
curl http://10.2.10.209:9200/_nodes/process?pretty
:
{ |
宕机测试 (node1)
由上可知, 集群的 masetr 是 niko-node1, 现在关闭它, 然后查看其他 node 的变化:
log of node2:
[2016-05-08 22:04:55,748][INFO ][discovery.zen ] [niko-node2] master_left [[niko-node1][iZzjAHGURxW3orWute-PtQ][ubuntu][inet[/10.2.10.209:9300]]], reason [shut_down] |
log of node3:
[2016-05-08 22:04:55,721][INFO ][discovery.zen ] [niko-node3] master_left [[niko-node1][iZzjAHGURxW3orWute-PtQ][ubuntu][inet[/10.2.10.209:9300]]], reason [shut_down] |
从上可知, node2 被选举为新的 master.
脑裂问题
接着上面, 因为集群中只有两个 node 了, 这时如果这两个 node 之间的连接中断, 那么它们都会认为对方已经 down 了, 然后选举自己为 master, 从而导致有两个 master, 带来了数据不一致的问题.
为了解决这个问题, 需要修改一个设置:
# Set to ensure a node sees N other master eligible nodes to be considered |
设置为最小需要2个:
discovery.zen.minimum_master_nodes: 2 |
Next
至于集群的工作原理将会在接下来的博客中介绍 ~~
参考
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-cluster-on-ubuntu-14-04
http://www.wklken.me/posts/2016/06/29/deploy-es.html