天天看點

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不齊全,進而導緻無法執行任何寫操作

繼續閱讀