新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能復(fù)制到相關(guān)的復(fù)制分片上。
下面我們羅列在主分片和復(fù)制分片上成功新建、索引或刪除一個(gè)文檔必要的順序步驟:
Node 1
發(fā)送新建、索引或刪除請求。_id
確定文檔屬于分片0
。它轉(zhuǎn)發(fā)請求到Node 3
,分片0
位于這個(gè)節(jié)點(diǎn)上。Node 3
在主分片上執(zhí)行請求,如果成功,它轉(zhuǎn)發(fā)請求到相應(yīng)的位于Node 1
和Node 2
的復(fù)制節(jié)點(diǎn)上。當(dāng)所有的復(fù)制節(jié)點(diǎn)報(bào)告成功,Node 3
報(bào)告成功到請求的節(jié)點(diǎn),請求的節(jié)點(diǎn)再報(bào)告給客戶端。客戶端接收到成功響應(yīng)的時(shí)候,文檔的修改已經(jīng)被應(yīng)用于主分片和所有的復(fù)制分片。你的修改生效了。
有很多可選的請求參數(shù)允許你更改這一過程。你可能想犧牲一些安全來提高性能。這一選項(xiàng)很少使用因?yàn)镋lasticsearch已經(jīng)足夠快,不過為了內(nèi)容的完整我們將做一些闡述。
replication
復(fù)制默認(rèn)的值是sync
。這將導(dǎo)致主分片得到復(fù)制分片的成功響應(yīng)后才返回。
如果你設(shè)置replication
為async
,請求在主分片上被執(zhí)行后就會返回給客戶端。它依舊會轉(zhuǎn)發(fā)請求給復(fù)制節(jié)點(diǎn),但你將不知道復(fù)制節(jié)點(diǎn)成功與否。
上面的這個(gè)選項(xiàng)不建議使用。默認(rèn)的sync
復(fù)制允許Elasticsearch強(qiáng)制反饋傳輸。async
復(fù)制可能會因?yàn)樵诓坏却渌制途w的情況下發(fā)送過多的請求而使Elasticsearch過載。
consistency
默認(rèn)主分片在嘗試寫入時(shí)需要規(guī)定數(shù)量(quorum)或過半的分片(可以是主節(jié)點(diǎn)或復(fù)制節(jié)點(diǎn))可用。這是防止數(shù)據(jù)被寫入到錯(cuò)的網(wǎng)絡(luò)分區(qū)。規(guī)定的數(shù)量計(jì)算公式如下:
int( (primary + number_of_replicas) / 2 ) + 1
consistency
允許的值為one
(只有一個(gè)主分片),all
(所有主分片和復(fù)制分片)或者默認(rèn)的quorum
或過半分片。
注意number_of_replicas
是在索引中的的設(shè)置,用來定義復(fù)制分片的數(shù)量,而不是現(xiàn)在活動的復(fù)制節(jié)點(diǎn)的數(shù)量。如果你定義了索引有3個(gè)復(fù)制節(jié)點(diǎn),那規(guī)定數(shù)量是:
int( (primary + 3 replicas) / 2 ) + 1 = 3
但如果你只有2個(gè)節(jié)點(diǎn),那你的活動分片不夠規(guī)定數(shù)量,也就不能索引或刪除任何文檔。
timeout
當(dāng)分片副本不足時(shí)會怎樣?Elasticsearch會等待更多的分片出現(xiàn)。默認(rèn)等待一分鐘。如果需要,你可以設(shè)置timeout
參數(shù)讓它終止的更早:100
表示100毫秒,30s
表示30秒。
注意:
新索引默認(rèn)有
1
個(gè)復(fù)制分片,這意味著為了滿足quorum
的要求需要兩個(gè)活動的分片。當(dāng)然,這個(gè)默認(rèn)設(shè)置將阻止我們在單一節(jié)點(diǎn)集群中進(jìn)行操作。為了避開這個(gè)問題,規(guī)定數(shù)量只有在number_of_replicas
大于一時(shí)才生效。