节点概念:
- 节点是一个Elasticsearch的实例
- 本质上就是一个JAVA进程
- 一台机器上可以运行多个Elasticsearch进程,但是生产环境一般建议一台机器上只运行一个Elasticsearch实例
- 每一个节点都有名字,通过配置文件配置,或者启动时候 -E node.name=node1指定
- 每一个节点在启动之后,会分配一个UID,保存在data目录下
节点类型
常用的有以下几种:
- Master Node:主节点
- Master eligible nodes:可以参与选举的合格节点
- Data Node:数据节点
- Coordinating Node:协调节点
Master eligible nodes和Master Node
1、每个节点启动后,默认就是一个 Master eligible节点,
可以通过 node.master: false 禁止成为 master eligible 节点
2、Master-eligible节点可以通过参加选主流程,成为 Master 节点
3、集群中第一个启动的节点会将自己选举成 Master 节点
4、每个节点上都保存了集群的状态,但是只有 Master 节点才能修改集群的状态信息
所有的节点信息
所有的索引和相关的 Mapping、Setting 信息
分片的路由信息
Master Node的职责
- 处理创建,删除索引等请求,负责索引的创建与删除
- 决定分片被分配到哪个节点
- 维护并且更新Cluster State
选主的过程
- 互相Ping对方,Node ld 低的会成为被选举的节点
- 其他节点会加入集群,但是不承担Master节点的角色。一旦发现被选中的主节点丢失,就会选举出新的Master节点
Data Node & Coordinating Node
-
Data Node
- 可以保存数据的节点,叫做Data Node,负责保存分片数据。在数据扩展上起到了至关重要的作用
- 节点启动后,默认就是数据节点。可以设置node.data: false 禁止
- 由Master Node决定如何把分片分发到数据节点上
- 通过增加数据节点可以解决数据水平扩展和解决数据单点问题
-
Coordinating Node
- 负责接受Client的请求, 将请求分发到合适的节点,最终把结果汇集到一起
- 每个节点默认都起到了Coordinating Node的职责
可以通过命令查看集群节点信息
GET _cat/nodes?v
带 * 的表示 Master 节点
也可以通过 cerebro 工具查看
带有 实心的小星星 表示 Master 节点
分片(Primary Shard & Replica Shard)
- 主分片(Primary Shard)
- 用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
- 一个分片是一个运行的Lucene的实例
- 主分片数在索引创建时指定,后续不允许修改,除非Reindex
- 副本分片(Replica Shard)
- 用以解决数据高可用的问题。 副本分片是主分片的拷贝
- 副本分片数,可以动态调整
- 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
- 这里注意,副本分片并不是越多越好,es 写操作是,需要将所有副本都写完才会返回,会影响写性能,正常一个副本就够用了
- 类似日志类的,副本分片可以设置为0
创建一个索引,设置 3 个主分片,每个分片两个副本,相当于一共有 9 个分片
# 设置三个主分片,每个分片两个副本
PUT /es_db
{"settings": {"number_of_shards": 3, "number_of_replicas": 2}
}
通过 工具查看:
可以看到 三个实线框就是对应的三个主分片,虚线对应六个副本
这里注意:
全量数据 = 三个主分片相加 = 实线0 + 实线1 + 实线2
虚线0 = 实线0、 虚线1 = 实线1、虚线2 = 实线2
再创建一个索引,有两个主分片,每个主分片有 1 个副本
PUT /test2
{"settings": {"number_of_shards": 2,"number_of_replicas": 1}
}
工具查看如下:
分片的设定
对于生产环境中分片的设定,需要提前做好容量规划
- 分片数设置过小
- 导致后续无法增加节点实现水平扩展
- 单个分片的数据量太大,导致数据重新分配耗时
- 分片数设置过大,7.0 开始,默认主分片设置成1,解决了over-sharding(分片过度)的问题
- 影响搜索结果的相关性打分,影响统计结果的准确性
- 单个节点上过多的分片,会导致资源浪费,同时也会影响性能
CAT API查看集群信息
GET /_cat/nodes?v #查看节点信息
GET /_cat/health?v #查看集群当前状态:红、黄、绿
GET /_cat/shards?v #查看各shard的详细情况
GET /_cat/shards/{index}?v #查看指定分片的详细情况
GET /_cat/master?v #查看master节点信息
GET /_cat/indices?v #查看集群中所有index的详细信息
GET /_cat/indices/{index}?v #查看集群中指定index的详细信息 #查看集群的健康状况
GET _cluster/health
感谢小伙伴们的支持,持续更新中~~~