摘要:節(jié)點(diǎn)使用文檔的確定文檔屬于。將文檔返回給,然后將文檔返回給客戶端。如果文檔已經(jīng)被另一個(gè)進(jìn)程修改沖突,它會(huì)重試步驟,超過(guò)次后放棄。當(dāng)一個(gè)子請(qǐng)求操作成功時(shí),并行轉(zhuǎn)發(fā)新文檔或刪除到,然后執(zhí)行下一個(gè)子請(qǐng)求。
shard
確定shard的公式:
shard = hash(routing) % number_of_primary_shards
routing 默認(rèn)是文檔的 _id ,也可以設(shè)置成一個(gè)自定義的值。
因此要在創(chuàng)建索引的時(shí)候就確定好主分片的數(shù)量,并且永遠(yuǎn)不會(huì)改變這個(gè)數(shù)量,因?yàn)槿绻麛?shù)量變化了,那么所有之前路由的值都會(huì)無(wú)效。
每個(gè)節(jié)點(diǎn)都知道集群中任一文檔位置,所以可以直接將請(qǐng)求發(fā)到任意節(jié)點(diǎn)。當(dāng)然,為了擴(kuò)展負(fù)載,更好的做法是輪詢發(fā)送集群中所有的節(jié)點(diǎn)。
shard、replica同步 新建、索引或者刪除請(qǐng)求步驟:
戶端向 Node 1 發(fā)送新建、索引或者刪除請(qǐng)求。
節(jié)點(diǎn)使用文檔的 _id 確定文檔屬于shard 0 。請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到 Node 3(因?yàn)閟hard 0 被分配在 Node 3 上)。
Node 3 在shard 0上面執(zhí)行請(qǐng)求。如果成功了,它將請(qǐng)求并行轉(zhuǎn)發(fā)到 Node 1 和 Node 2 的replica R0上。一旦所有的R0都報(bào)告成功, Node 3 將向Node 1報(bào)告成功,Node 1向客戶端報(bào)告成功。
查詢請(qǐng)求步驟:
客戶端向 Node 1 發(fā)送查詢請(qǐng)求。
node 1使用文檔的 _id 來(lái)確定文檔屬于shard 0 。replica 0 存在于Node 1、Node 2上。 這種情況下,每次請(qǐng)求都會(huì)輪詢路由Node 1、Node 2,這里假設(shè)路由到Node 2。
Node 2將文檔返回給Node 1 ,然后Node 1將文檔返回給客戶端。
注意:
在文檔被檢索時(shí),已經(jīng)被索引的文檔可能已經(jīng)存在于shard上但是還沒(méi)有復(fù)制到replica。即強(qiáng)一致性無(wú)法保證,但最終一致性可以保證。
POST /{index}/{type}/{id}/_update
步驟略。
注意:
Node 3 從P0檢索文檔,修改 _source 字段中的 JSON ,并且嘗試重新索引主分片的文檔。 如果文檔已經(jīng)被另一個(gè)進(jìn)程修改(_version沖突),它會(huì)重試步驟 3 ,超過(guò) retry_on_conflict 次后放棄。
如果 Node 3 成功地更新文檔,它將新版本的文檔并行轉(zhuǎn)發(fā)(新建、索引或者刪除請(qǐng)求的步驟里轉(zhuǎn)發(fā)的是請(qǐng)求而不是文檔)到 Node 1 和 Node 2 上的R0,重新建立索引。一旦所有R0都返回成功,Node 3 向Node 1返回成功,Node 1向客戶端返回成功。
為什么要轉(zhuǎn)發(fā)文檔而不是請(qǐng)求?
因?yàn)檗D(zhuǎn)發(fā)請(qǐng)求是異步的,不能保證到達(dá)replica的順序,若轉(zhuǎn)發(fā)更新請(qǐng)求,則可能以錯(cuò)誤的順序應(yīng)用更改,導(dǎo)致得到損壞的文檔。而轉(zhuǎn)發(fā)文檔,則replica可以直接根據(jù)_version來(lái)獲取最大版本號(hào)的文檔。
bulk步驟:
客戶端向 Node 1 發(fā)送 bulk 請(qǐng)求。
Node 1 為每個(gè)命中的shard創(chuàng)建一個(gè)批量請(qǐng)求,并將這些請(qǐng)求并行轉(zhuǎn)發(fā)到每個(gè)包含該shard的節(jié)點(diǎn)。
shard按順序(請(qǐng)求報(bào)文體中的子請(qǐng)求順序)執(zhí)行每個(gè)操作。當(dāng)一個(gè)子請(qǐng)求操作成功時(shí),shard并行轉(zhuǎn)發(fā)新文檔(或刪除)到replica,然后執(zhí)行下一個(gè)子請(qǐng)求。 一旦所有的子請(qǐng)求的replica向shard報(bào)告完成(無(wú)論執(zhí)行是否成功),該shard將向node 1報(bào)告,node 1將這些響應(yīng)收集整理并返回給客戶端。
可選的請(qǐng)求參數(shù)
consistency
解決分布式腦裂問(wèn)題,參數(shù)的值可以設(shè)為 one (只要該index的shard狀態(tài) ok 就允許執(zhí)行_寫_操作),all(必須要該index的shard和多個(gè)replica的狀態(tài)沒(méi)問(wèn)題才允許執(zhí)行_寫_操作), 或 quorum (默認(rèn)值)。
# quorum 即大于一半的分片,注意,number_of_replicas是primary shard對(duì)應(yīng)的replica數(shù)量,不是全部replica數(shù)量 int( (primary + number_of_replicas) / 2 ) + 1
注意:新索引默認(rèn)有 1 個(gè)replica,這意味著為了滿足consistency至少需要兩個(gè)活動(dòng)的node。 這就會(huì)阻止我們?cè)趩我籲ode上做任何事情。為了避免這個(gè)問(wèn)題,ES要求只有當(dāng) number_of_replicas 大于1的時(shí)候,consistency策略才會(huì)執(zhí)行。
timeout
如果沒(méi)有足夠的replica,Elasticsearch會(huì)等待,直到滿足consistency策略。默認(rèn)最多等待1分鐘。 你可以使用 timeout 參數(shù) 使它更早終止: 100 是100毫秒,30s 是30秒。
一個(gè)Lucene索引在Elasticsearch稱作shard。 一個(gè)Elasticsearch索引是shard的集合。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70946.html
摘要:序列化被大多數(shù)編程語(yǔ)言所支持,并且已經(jīng)成為領(lǐng)域的標(biāo)準(zhǔn)格式。通過(guò)索引對(duì)文檔的進(jìn)行創(chuàng)建查詢修改和刪除等操作。請(qǐng)求的結(jié)構(gòu)調(diào)整為不再使用請(qǐng)求使用這個(gè)存儲(chǔ)這個(gè)文檔,而是使用請(qǐng)求存儲(chǔ)文檔在這個(gè)命名空間下。 在安裝elasticsearch之后,我們就要開(kāi)始進(jìn)行操作實(shí)踐,那么在實(shí)踐之前,我們首先了解下elasticsearch的幾個(gè)概念 面向文檔 相對(duì)關(guān)系型數(shù)據(jù)庫(kù),是采用行和列的形式進(jìn)行存儲(chǔ)數(shù)據(jù),e...
閱讀 2001·2023-04-25 16:19
閱讀 3116·2021-11-24 09:39
閱讀 837·2021-11-16 11:44
閱讀 1699·2019-08-29 12:52
閱讀 1147·2019-08-26 13:33
閱讀 1081·2019-08-26 10:26
閱讀 2209·2019-08-23 16:42
閱讀 2574·2019-08-23 14:37