Elasticsearch 学习: 分布式文档路由原理

###Document 文档路由原理

 增删改查一个document 的时候, 会根据路由算法 shard = hash(routing) % number_of_primary_shards 

,结果shard一定是在0~number_of_primary_shards-1之间这个范围内, document 选择放入该shard, 然后放到对应的副本上。
A. routing 也可以手动指定:

a. 增加document 时指定routing参数

PUT /posts/post/1?routing=12
{
  "id":"1",
  "name":"Test document",
  "contents":"Test document",
  "userId":"12"
}

b. 查询时

GET /posts/_search?routing=12&q=userId:12    ### 不能依赖routing 来过滤, 可能不同类型的数据 存在同一个shard上,还是需要根据userId 来过滤

B. 在mapping 中指定 routing

PUT my_index2
{
  "mappings": {
    "_doc": {
      "_routing": {
        "required": true
      }
    }
  }
}
PUT my_index2/_doc/1?routing=12
{
  "text": "No routing value provided"
}

######1. 为什么索引一旦建立,primary shard 就不能改变?

  1. 增加document:
PUT /index/type/1?routing=12    
{}

如果 _id =1 , number_of_primary_shards = 3, hash(_id) = 21, 这时
shard = hash(_id)%number_of_primary = 0
2. 如果增加 1片 primary_shard 数量,这时 如果获取
GET /index/type/1; 通过路由算法计算 shard = 21%4, 就会去shard 1上获取,数据丢失
######2. 考虑到 用户自定义路由,可能分配不均匀,对某个分片压力过大, 创建索引时使用index.routing_partition_size
路由算法变成 shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards
这样routing将路由到一组分片,然后_id字段在决定文档保存到那一个分片上。routing_partition_size的值必须是一个大于1但是小于number_of_shards设置的分片数量的一个整数


###Document 增删改流程
(1)client选择一个node发送请求过去,这个node就是coordinating node(协调节点)
(2)coordinating node 按照上面的路由规则, 计算出shard_num 对document进行路由,将请求转发给对应的node(有primary shard)
(3)实际的node上的primary shard处理请求,然后将数据同步到replica node
(4)coordinating node,如果发现primary node和所有replica node都处理完之后,就返回响应结果给客户端

![这里写图片描述](https://img-blog.csdn.net/20180612165332684?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhaGF5aWtlc2h1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

#####Document 查询流程
Note: 对于读请求,不一定将 请求全部发到 primary shard 所在的node, replica shard 也能处理,会使用round-robin算法 来实现node的负载均衡

1、client发送请求到任意一个node,成为coordinate node
2、coordinate node对document进行路由,路由之后就知道是那个primary shard,此时会使用round-robin随机轮询算法,在primary shard以及其所有replica中随机选择一个,让读请求负载均衡
3、接收请求的node返回document给coordinate node
4、coordinate node返回document给客户端
5、特殊情况:document如果还在建立索引过程中,可能只有primary shard有,任何一个replica shard都没有,此时可能会导致无法读取到document,但是document完成索引建立之后,primary shard和replica shard就都有了


Elasticsearch 的segment 和translog https://blog.csdn.net/lsgqjh/article/details/83022206

你可能感兴趣的:(Elasticsearch学习)