天天看点

elasticsearch索引管理详解

一、索引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不齐全,进而导致无法执行任何写操作

继续阅读