继续上一篇《Elasticsearch入门1笔记》
这一篇主要记录 Elastic的集群、节点和分片
集群
节点Node
- 运行中的 Elasticsearch 实例称为一个 节点
- 集群是由一个或者多个拥有相同
cluster.name
配置的节点组成 - 主节点负责管理集群范围内的
所有变更
(索引和节点) - 主节点并不需要涉及到文档级别的变更和搜索等操作
分片
- 一个 分片 是一个底层的 工作单元 ,它仅保存了 全部数据中的一部分
- 分片是一个 Lucene 的实例(本身就是一个完整的搜索引擎)
- 文档被存储和索引到分片内(应用程序是直接与索引交互)
- 利用分片将数据分发到集群内各处,集群规模扩大或者缩小时, 数据仍然均匀分布在集群里
- 主分片的数目决定着索引能够保存的最大数据量(主分片最大能够存储 Integer.MAX_VALUE - 128 个文档)
- 副本分片只是一个主分片的拷贝(冗余备份, 读写分离)
- 索引建立的时候就已经确定了主分片数(无法修改),但是副本分片数可以随时修改
1 |
# 修改副本分片数量 |
分片数据存储
分片数据存储规则
1 |
shard = hash(routing) % number_of_primary_shards |
routing
是一个可变值,默认是文档的 _id
,也可以设置成一个自定义的值。
通过routing
的路由参数 ,通过这个参数我们可以自定义文档到分片的映射。
主分片副本分片交互
发送请求到集群中的任一节点,每个节点都有能力处理任意请求。每个节点都知道集群中任一文档位置。
新建、索引和删除文档
- 客户端向
Node 1
发送新建、索引或者删除请求。 - 节点使用文档的
_id
确定文档属于分片 0 。请求会被转发到Node 3
,因为分片 0 的主分片目前被分配在Node 3
上。 Node 3
在主分片上面执行请求。如果成功了,它将请求并行转发到Node 1
和Node 2
的副本分片上。一旦所有的副本分片都报告成功,Node 3
将向协调节点报告成功,协调节点向客户端报告成功。
客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成。
取回一个文档
1、客户端向 Node 1
发送获取请求。
2、节点使用文档的 _id
来确定文档属于分片 0
。分片 0
的副本分片存在于所有的三个节点上。 在这种情况下,它将请求转发到 Node 2
(负载均衡)。
3、Node 2
将文档返回给 Node 1
,然后将文档返回给客户端。
局部更新文档
- 客户端向
Node 1
发送更新请求。 - 它将请求转发到主分片所在的
Node 3
。 Node 3
从主分片检索文档,修改_source
字段中的 JSON ,并且尝试重新索引主分片的文档。 如果文档已经被另一个进程修改,它会重试步骤 3 ,超过retry_on_conflict
次后放弃。- 如果
Node 3
成功地更新文档,它将新版本的文档并行转发到Node 1
和Node 2
上的副本分片,重新建立索引。 一旦所有副本分片都返回成功,Node 3
向协调节点也返回成功,协调节点向客户端返回成功。
PS: 当发送请求的时候, 为了扩展负载,更好的做法是轮询集群中所有的节点。
集群健康
包含了许多的统计数据
1 |
GET请求 |
1 |
{ |
status:存在3种状态
- green(所有分片正常)
- yellow(主分片区正常)
- red(无法运行)
乐观并发控制
当文档创建、更新或删除时, 新版本的文档必须复制到集群中的其他节点。
Elasticsearch利用 _version
号来确保 应用中相互冲突的变更不会导致数据丢失。