1.一个index会被分成多个分片, 所以一个document只能放在一个shard中,当document创建的时候决定把这个document放在哪个shard上,这个就是路由
路由算法 shard = hash(routing) % number of primary_shard
举个例子:一个index有3个primary shard
一个请求会带过来一个 routing,默认是id
手动指定routing是很有用的,可以保证某个document落在某个shard上
根据这个路由公式可以得出primary shard是不可变的
2.增删改操作,
如果有个请求随机到了一个shard上,这个shard就变成coordernate node,此时这个coordernate node会根据路由规则转发给我相应的primary shard,相应的pramry shard节点更新之后会同步replication shard,最后coordernate node 会把结果反馈给client
以上的路由规则有点类似redis cluster的规则
3.关键词quorum
put /index/type/id?consistency= ()
()有三种情况{1.one:只要有一个prmary shard 活跃,就可以执行 2.all:必须所有的primary shard和replica shard 都活跃才可以 3. quorum:默认,要求(pramry+number_of_replication)/2+1个shard活跃才可以使用}
如果节点少于quorum的数量,可能导致quorum不齐全,导致不能执行任何写操作
quorum不齐全时,wait,默认1分钟
put /index/type/id?timeout=30 # 默认毫秒
put /index/type/id?timeout=30s # 指定单位为30秒
是不是有点类似kafka的partition写入的ack参数?
4.读请求
当客户端有个读请求分到coordinate node上时,转发不一定要到primary shard上,会根据round-robin决定到primary shard上还是replication shard上
5.deep paging
deep paging指的事搜索特别深,比如有60000条数据,现在每个shard上有20000条数据,如果现在要全局搜索10001-10010之间的10条数据,如果一个请求到了一个coordinate node上,请求会被转发到三个shard上,三个shard都会返回10010条数据,那么coordinate node上游30030条数据,然后还要进行排序,这样很消耗cpu和网络带宽