一、索引shard分配
创建索引主shard和副本shard:
PUT /test_index
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
1、index包含多个shard
2、每个shard都是一个最小工作单元同时也是一个lucene实例,承载部分数据
3、增减节点时,shard会自动在nodes中负载均衡
4、primary shard和replica shard,每个document肯定只存在于某一个primary shard以及其对应的replica shard中,不可能存在于多个primary shard中
5、replica shard是primary shard的副本,负责容错,以及承担读请求负载
6、primary shard的数量在创建索引的时候就固定了,replica shard的数量可以随时修改
7、primary shard的默认数量是5,replica默认是1,默认有10个shard,5个primary shard,5个replica shard(5.6.10版本)
目前es最新版本是7.x,在7.0.0版本上测试primary默认是1个,replica是1,即1个primary shard,1个replica shard
8、primary shard不能和自己的replica shard放在同一个节点上(否则节点宕机,primary shard和副本都丢失,起不到容错的作用),但是可以和其他primary shard的replica shard放在同一个节点上。
二、手动指定_id和自动生成_id
手动指定:
一般来说,是从某些其他的系统中,导入一些数据到es时,会采取这种方式,就是使用系统中已有数据的唯一标识,作为es中document的id。如果将数据导入到es中,此时就比较适合采用数据在数据库中已有的primary key。
自动生成:
自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能会发生冲突
三、document更新
1、document的全量替换
(1)语法与创建文档是一样的,如果document id不存在,那么就是创建;如果document id已经存在,那么就是全量替换操作,替换document的json串内容
(2)document是不可变的,如果要修改document的内容,第一种方式就是全量替换,直接对document重新建立索引,替换里面所有的内容
(3)es会将老的document标记为deleted,然后新增我们给定的一个document,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除标记为deleted的document
2、document的强制创建
(1)创建文档与全量替换的语法是一样的,有时只是想新建文档,不想替换文档,如果强制进行创建呢?
(2)PUT /index/_doc/id?op_type=create,PUT /index/_doc/id/_create
3、document的删除
(1)DELETE /index/_doc/id
(2)不会立马物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除
四、document路由(routing默认是_id)
路由算法:shard = hash(routing) % number_of_primary_shards
设置自定义routing
put /index/_doc/id?routing=user_id
五、写一致性原理以及quorum机制
1、consistency
发送任何一个增删改操作的时候,比如说put /index/_doc/id,都可以带上一个consistency参数,指明想要的使用哪一种写一致性
put /index/_doc/id?consistency=quorum
(1)one
要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行
(2)all
要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作
(3)quorum
默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作
quroum = int( (primary + number_of_replicas) / 2 ) + 1 ,当number_of_replicas>1时才生效
举个例子,3个primary shard,number_of_replicas=1,总共有3 + 3 * 1 = 6个shard
quorum = int( (3 + 1) / 2 ) + 1 = 3
所以,要求6个shard中至少有3个shard是active状态的,才可以执行这个写操作
如果节点数少于quorum数量,可能导致quorum不齐全,进而导致无法执行任何写操作