节点间交互细节

date
Jul 28, 2021
slug
elasticsearch-guide-node-interaction
status
Published
tags
Elasticsearch
读书
summary
type
Page

安装 elasticsearch-head Chrome 插件

插件可以连接 Elasticsearch,可视化查看集群中的节点、索引、分片等集群状态
 

安装 Elasticsearch

通过 docker-compose 本地安装 Elasticsearch
 
通过 homebrew 安装 Elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/current/brew.html 指定版本安装: brew install elasticsearch@6 ,装完 Elasticsearch 用到几个目录:
  • Data: /usr/local/var/lib/elasticsearch/
  • Logs: /usr/local/var/log/elasticsearch/elasticsearch_lisong.log
  • Plugins: /usr/local/var/elasticsearch/plugins/
  • Config: /usr/local/etc/elasticsearch/
  • Bin:/usr/local/opt/elasticsearch@6/bin/elasticsearch
 

集群中的节点

一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同集群名配置的节点组成,它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
集群中分主节点和从节点,主节点通过在集群中选举产生。
主节点负责集群中所有索引的写操作,如增加索引,删除索引,但主节点不涉及文档级别的写操作,那是主分片的事儿。
如图是一个单节点集群,该节点就是主节点。此时集群中没有任何索引,所以也就没有索引被分片存储:
notion image
 

节点中的分片

分片存储在集群中的节点里,当集群节点增加或减少时,Elasticsearch 会自动在各节点中迁移分片,使得数据均匀分布在集群里。
前面基础概念说过,分片分为主分片和副本分片。其中集群里主分片数量在创建索引时就确定了不能改,但副本数量可以随时修改。
 

单节点集群

首先添加一个索引,设置主分片 3 个,每个分片各有 1 个副本:
由于当前本机上只有一个节点,所以三个主分片 P0 P1 P2 都分配在了主节点上。使用 elasticsearch-head 插件查看当前集群状态更加形象化:
notion image
node1 左侧的星星表示是主节点,绿色的 0 1 2 表示分片,黑边框表示是主分片,有 3 个 unassigned 的副本分片用灰色表示,右上角显示当前集群是 yellow 状态。前面提到 Elasticsearch 不允许主分片和其对应的副本分片分布在同一个节点上,所以在目前只有一个节点的情况下,副本分片是未分配的,所以集群状态是 Yellow,即有副本未被分配。
也可以通过 REST API 查看此时集群状态:
 

向集群中加入第二个节点

向集群中加入第二个节点之后的集群状态:
notion image
可以看到 node1 没有变,还是主节点,其中保存了主分片 0 1 2,node2 作为从节点,保存了副本分片 0 1 2。集群整体的状态变为了 green
查看主节点 node1 的日志也能看到,主节点向集群中添加了一个新节点 node2:
notion image
 

加入第三个节点

如果再加入第三个节点,集群中的分片会再次迁移,使数据分布更加均衡:
notion image
注意其中主分片与之对应的副本分片不会被分配到同一个节点上。
 

增加副本数量

极限情况下集群中节点数等于分片数,即每个节点只保留一个分片。主分片负责文档的更改操作,副本分片则可以提供读操作,适当的增加副本数量可以提高集群的吞吐量。
修改副本数:
修改后集群中有 3 个主分片,6 个副本分片:
notion image
相应的可以减少副本数:
notion image
 

移除一个从节点,或者说从节点挂了:

kill 掉 node3 模拟从节点挂了,主节点会将其从集群中移除,并重新分配集群上的分片分布:
notion image
notion image
如果 node3 之后再次启动加入集群,过程跟重新加入类似。
 

主节点挂了

kill 掉 node1 主节点模拟主节点挂了,集群会有短暂的 Red 状态,即部分可用状态。剩下的节点会选举出新的主节点 master,master 会移除关掉的节点,重新分配分片,并将丢失的主分片对应的副本分片提升为主分片。
notion image
本次选举除了 node2 作为新的主节点,查看 node2 的日志:
notion image
可以看到首先检测到 master_left,因为 node1 shut down了。之后 node2 选举成为了新的 master。
再看 node3 的日志:
notion image
能够看到 node3 也检测到了 master_left,之后由于 node2 选举成功,node3 探测到了新的 master 存在。
之后新集群中移除无效节点 node1,并重新分配分片,最终回到两个节点的状态:
notion image
状态从 Yellow 转变成 Green 状态。
notion image
 
 
 
 
 
 
 

© 菜皮 2020 - 2023