zoukankan      html  css  js  c++  java
  • document数据路由

    (1)document数据路由的理解:我们知道,一个index的数据会被分为多片,每片都在一个shard中,所以说,一个document,只能存在于一个shard中。当客户端创建document的时候,es此时就需要决定,这个document是放在这个index的哪个shard上。这个过程就称之为document routing,数据路由。

    (2)路由的算法:shard = hash(routing) % number_of_primary_shards
    举例:
    一个index有3个primary shard,P0,P1,P2
    每次增删改查一个document的时候,都会带来一个routing number,默认就是这个document的_id(可能是手动指定,也可能是自动生成)。假设routing = _id,_id =1。es会将这个routing值,传入一个hash函数中,产出一个routing值的hash值,假设这时hash(routing)=27。然后将hash函数产出的值,对这个index的primary shard的数量求余数,27 % 3 = 0。这就决定了这个document放在P0上。
    无论什么数字,对number_of_primary_shards求余数,结果一定是在0~number_of_primary_shards-1之间。

    (3)routing = _id 或 custom routing value
    默认的routing就是 _id
    也可以在发送请求的时候,手动指定一个routing value,比如 PUT /index/type/id?routing=user_id
    手动指定routing value是很有用的,可以保证某一类document一定被路由到一个shard上,那么在后续进行应用级别的负载均衡,以及提升批量读取的性能的时候,是很有帮助的。

    (4)primary shard不可变的原因
    一旦index建立,primary shard是不允许修改的,但是replica shard可以随时修改。
    primary shard不可变的原因是由于路由的算法决定的。在创建一个index的时候,假设_id=1,hash(routing)=21,shard=21%3=0,此时document被路由到P0 shard上。如果此时增加一个primary shard,下次查找该document的时候,shard=21%4=1,此时es会去P1 shard上寻找该document,很显然是找不到的,就会间接导致数据的丢失。

  • 相关阅读:
    centos7安装gitlab
    jenkins 部署k8s-jar包项目
    jenkins部署k8s项目-CICD
    pipeline
    jenkins打包
    jenkins 按角色设置管理权限
    1 jenkins的介绍和安装
    PyTables的下载和安装
    解决python报错:ImportError: No module named shutil_get_terminal_size 的方法
    nodejs安装失败
  • 原文地址:https://www.cnblogs.com/qinjf/p/8511427.html
Copyright © 2011-2022 走看看