创建一个测试索引docker,该索引包含2个分片和2个副本,那么1个主分片就存在着2个副本分片,该索引一共存在6个分片:
PUT doctor
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 2
},
"mappings": {
"doctor":{
"properties":{
"id":{
"type":"integer"
},
"name":{
"type":"keyword"
}
}
}
}
}
当前ElasticSearch集群存在着3个node,那么该索引中6个分片的分布状态如下图:
Q1:如果要修改数据,这些分片是如何交互的的?
A1:
1.客户端发出新建、索引、删除请求,请求被发送到node 0 节点;
2.节点使用索引的_id确定文档的分片位置,存储在node 0 节点中的primary shard 0 或者 primary shard 1上,在当前节点node 0 执行请求;
3.请求执行成功后,也就是数据存入主分片后,那么节点node 0就会将该请求并行转发到node 1 和node 2节点上的主分片的对应副本分片上,副本分片执行成功后向node 0节点报告请求成功后,node 0节点向客户端报告请求成功。