分片与节点
在讲整个集群操作之前,首先要理解分片是什么以及它的一些功能。
# 分片
分片是拆解索引下的文档的结果,是一种分布式思想,通过将数据较为均衡地分解到不同的分片上,来缓解存储与查询的压力。
# 分片的设置
分片分为主分片 shard 和副本分片 replica,副本分片是对主分片的完整复制,通过数据冗余备份来保证数据的完整性。
它们的数量是在一个索引创建之初设定好的,语法如下
PUT /${索引名}
{
"settings": {
"number_of_shards": ${(Number) 主分片数量},
"number_of_replicas": ${(Number) 每个主分片具备的副本分片数量}
}
}
2
3
4
5
6
7
注意好这里的定义,实际的副本分片数量是 。
并且所有的主分片形成一套完整数据,那么副本分片就形成了 套完整的数据。
# 分片的寻址
既然上面说了文档是分布式存储在分片上的,它肯定有分配规则。
无论是查询还是插入都是按照这样的规则,其中 函数的参数默认是文档id,也可以自己进行变更。
# 分片的可用性
上面也看到一个主分片对应了几个副本分片,那当一个主分片挂了之后,剩下的副本分片会选举出一个新的主分片(和集群类似)。
而此时就少了一个副本分片,集群状态会变为 yellow (这个下面会讲),如果原本只有一个副本分片,变为主分片后就没有副本分片可用了,集群就会变为 red(这个下面也会说)状态。
# 节点
节点是集群中的概念,可以视为一台主机,多个节点互相协作保证了 elasticsearch 服务的稳定性,提高了高并发下整体的 QPS。
# 节点类型
节点分为下面几种
- Master节点 (主节点)
- 执行集群维度的操作
- 索引新增或删除时管理分片的分配情况,有节点宕机后会把该节点分片(从内存中或者磁盘中拿)转移到其他节点,等恢复了再转移回来
- 监控集群的健康状态
集群健康状态
获取集群健康状态可以通过 GET /_cluster/health
进行获取,结果位于响应的 status
字段中
status | 含义 | 影响 |
---|---|---|
green | 所有主分片和副本分片都可用 | 集群功能完全正常 |
yellow | 所有主分片可用,至少有一个副本分片不可用 | 查询写入正常,但丢失主分片可能会丢失数据 |
red | 至少一个主分片以及其所有副本分片不可用 | 部分数据不可用,搜索结果可能不完整,写入操作可能失败 |
Data节点 (数据节点)
- 存储数据
- 被调度在其所存储的分片上执行 CRUD、聚合等
Coordinating节点 (协调节点)
- 路由客户端请求到对应的多个数据节点
- 读:向数据节点广播请求,并将收到的结果存在 大小的优先队列中返回给客户端
- 写:将请求发送给含写对应分片的数据节点,写入完成后并发地发送给含有其副本的节点,使用乐观锁保证数据一致性
- 汇总数据节点的结果返回给客户端
- 路由客户端请求到对应的多个数据节点
Ingest节点 (预处理节点)
- 配置管道
- 在文档被索引前进行预处理,如变更字段值、生成新字段等
Machine Learning节点 (机器学习节点)
- 执行机器学习作业
Transform节点 (转换节点)
- 执行转换操作,进行数据处理和分析
- 与Ingest节点的区别是,转换节点针对旧的已存在数据进行汇总和分析并生成新的索引下的新文档
Voting-only节点 (仅投票节点)
- 参与主节点选举
- 不竞选主节点
Remote Client节点 (远程客户端节点)
- 跨数据中心搜索时,连接不同地理位置的ES集群
# 搭配分片
上面介绍节点的时候也说过分片是由 Master 节点调控的,它们会被均衡地分在不同的节点上以保证整个集群的稳定性。
同时还有一个原则:主分片和副本分片不能在同一个节点上,这是为了节点挂掉的时候不至于无从恢复。