1. 前提
搭建集群前,首先将各个节点的索引库存储位置的数据清空,比如我的索引存放在 /usr/local/elasticsearch-7.4.2/data 目录下,就需要将该目录下的数据都删除。
2. 配置集群
修改 elasticsearch.yml 文件
修改内容主要有:
# 配置集群名称,保证每个节点的名称相同,如此就能都处于一个集群之内了
cluster.name: imooc-es-cluster
# 每一个节点的名称,必须不一样
node.name: es-node1
# http端口(使用默认即可)
http.port: 9200
# 主节点,作用主要是用于来管理整个集群,负责创建或删除索引,管理其他非master节点(相当于企业老总)
node.master: true
# 数据节点,用于对文档数据的增删改查
node.data: true
# 集群列表
discovery.seed_hosts: ["192.168.1.184", "192.168.1.185", "192.168.1.186"]
# 启动的时候使用一个master节点
cluster.initial_master_nodes: ["es-node1"]
需要在每个 elasticsearch 节点都修改这些内容,对于所有节点,以下三点可以不同,但其他内容必须相同
# 每一个节点的名称,必须不一样
node.name: es-node1
# 主节点,作用主要是用于来管理整个集群,负责创建或删除索引,管理其他非master节点(相当于企业老总)
# 所有节点也都可以一样,设置为 true,就意味着主节点挂了之后,该节点有可能成为主节点
node.master: true
# 数据节点,用于对文档数据的增删改查,建议设置为true
node.data: true
最后可以通过如下命令查看配置文件的内容(不显示注释信息):
more elasticsearch.yml | grep ^[^#]
3. 集群脑裂现象
如果发生网络中断或者服务器宕机,那么集群会有可能被划分为两个部分,各自有自己的master来管理,那么这就是脑裂。
简而言之,就是一个集群出现了两个master节点,就会导致数据缺失,不一致,冲突等问题。
解决方案:
master主节点要经过多个master节点(在配置文件中设置了 node.mastre: true 的那些节点)共同选举后才能成为新的主节点。就跟班级里选班长一样,并不是你1个人能决定的,需要班里半数以上的人决定。
解决实现原理:半数以上的节点同意选举,节点方可成为新的master。
需要设置的参数:discovery.zen.minimum_master_nodes=(N/2)+1
其中 N 为集群中master节点的数量,也就是那些node.master=true设置的那些服务器节点总数。
Elasticsearch 7.x 以及以后的版本中,minimum_master_node 这个参数已经被移除了,这一块完全由es自身去管理,这样就避免了脑裂的问题,选举也会非常快。
4. es集群中文档读写原理
文档写操作
-
用户访问服务器和es进行交互, 服务器都是指定一台 es节点服务器作为交互方;
-
当服务器访问的这台es服务器时,这台服务器就会被es认作为 es集群中的协调节点(负责接收 响应用户请求);
-
而是会做一个算法(hash算法),通过算法结果来决定 具体写到哪一个主分片;(路由转发)
-
-
文档存入主分片之后, 再将数据同步到副本分片上
-
当主分片和副本分片的文档数据都写入之后, 再由[协调节点]响应客户端结果
-
P0,P1,P2是主节点,R0,R1,R2是副本节点
文档读操作
-
客户端请求 协调节点;
-
协调节点 针对 文档id 做 路由转发(采用的算法类似hash算法,计算出文档保存在哪个位置)
-
-
之后在存储该文档的 主节点或者备份节点之间通过 轮询的方式 转发到其中一个节点上 (这么做可以分担请求压力提高效率)
-
之后数据返回给协调节点,由协调节点响应客户端