一、Elasticsearch集群的概念
集群:
ES节点:运行的ES实例
ES集群:由若干节点组成,这些节点在同一个网络内,cluster-name相同
节点:
master节点:
集群中的一个节点会被选为master节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群删除节点。master节点无需参与文档层面的变更和搜索,这意味着仅有一个master节点并不会因流量增长而成为 瓶颈。任意一个节点都可以成为 master 节点.
data节点:
持有数据和倒排索引。默认情况下,每个节点都可以通过设定配置文件elasticsearch.yml中的node.data属性为 true(默认)成为数据节点。如果需要一个专门的主节点,应将其node.data属性设置为false
Client节点:
如果将node.master属性和node.data属性都设置为false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点
分片:
(1)单个节点由于物理机硬件限制,存储的文档是有限的,如果一个索引包含海量文档,则不能在单个节点存储。ES提供分 片机制,同一个索引可以存储在不同分片(数据容器)中,这些分片又可以存储在集群中不同节点上
(2)分片分为 主分片(primary shard) 以及 从分片(replica shard)
(3)主分片与从分片关系:从分片只是主分片的一个副本,它用于提供数据的冗余副本
(4)从分片应用:在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求
(5)是否可变:索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变
(6)索引默认创建的分片:默认设置5个主分片和一组从分片(即每个主分片有一个从分片对应),但是从分片没有被启用(主从分片在同一个节点上没有意义),因此集群健康值显示为黄色(yellow)
二、搭建Elasticsearch集群
修改 elasticsearch.yml 这个配置文件如下:
# 配置集群名称,保证每个节点的名称相同,如此就能都处于一个集群之内了
cluster.name: elasticsearch-cluster
# 每一个节点的名称,必须不一样
node.name: es-node1
# http端口(使用默认即可)
http.port: 9200
# 主节点,作用主要是用于来管理整个集群,负责创建或删除索引,管理其他非master节点
node.master: true
# 数据节点,用于对文档数据的增删改查
node.data: true
# 集群列表
discovery.seed_hosts: ["192.168.130.101", "192.168.130.102", "192.168.130.103"]
# 启动的时候使用一个master节点
cluster.initial_master_nodes: ["es-node1"]
可以通过如下命令查看配置文件的内容:
more elasticsearch.yml | grep ^[^#]
三、Elasticsearch集群脑裂现象探讨
什么是脑裂
如果发生网络中断或者服务器宕机,那么集群会有可能被划分为两个部分,各自有自己的master来管理,那么这就是脑裂。
脑裂解决方案
master主节点要经过多个master节点共同选举后才能成为新的主节点。不能通过单个节点选举为master,而需要一半以上的节点同意才可以,。
解决实现原理:半数以上的节点同意选举,节点方可成为新的master。
discovery.zen.minimum_master_nodes=(N/2)+1
N为集群的中master节点的数量,也就是那些 node.master=true 设置的那些服务器节点总数。
ES 7.X
在最新版7.x中, minimum_master_node 这个参数已经被移除了,这一块内容完全由es自身去管理,这样就避免了脑裂的问题,选举也会非常快。