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