- 文章名稱:Elasticsearch Reference[2.2]
- 原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-replication.html
- 譯者:code4j
讀寫文檔
介紹
每個 Elasticsearch 中的索引都會被分成多個分片钝鸽,并且每個分片都有多個副本幔嗦。這些副本被稱作 副本組,當有文檔添加或刪除,副本組必須要保持同步噪馏。如果做不到這點,從一個分片讀取到的數(shù)據(jù)會和其它分片讀取的數(shù)據(jù)有很大差異。保持分片副本同步并提供可靠地讀服務的這一過程,我們稱之為數(shù)據(jù)復制模型恢氯。
(譯者批注:其實副本組這個描述感覺不太好,應該叫分片組鼓寺,因為文中的副本組不光只副本勋拟,還有主分片)
Elasticsearch 的數(shù)據(jù)復制模型是基于主備模型的,這一理論在微軟的 PacificA paper 這篇論文中有深入的說明妈候。主備模型基于一個單主分片敢靡,其他的拷貝叫做副本苦银。主分片提供所有索引操作的服務的入口醋安,他主要掌管數(shù)據(jù)校驗確保正確的工作。一旦主分片接受的索引操作墓毒,他還負責將數(shù)據(jù)同步到其他副本中亲怠。
這一章節(jié)的目的是介紹 Elasticsearch 中關于復制模型的高階概述,并討論它對讀寫操作之間的相互作用所帶來的影響团秽。
基本的寫模型
每個文檔操作首先要通過路由選擇副本組主胧。通常采用文檔的 ID 來路由。一旦確定了在哪個副本組執(zhí)行习勤,操作就會從內部轉發(fā)到當前組的主分片踪栋。主分片負責校驗操作是否合法并把它轉發(fā)到組內其它分片。由于副本可能會有下線的狀態(tài)(譯者批注:副本未分配或副本所在節(jié)點宕機等)图毕,不要求主分片復制到所有副本中夷都。Elasticsearch 中維護了一組分片列表記錄了操作應該到哪個分片,這個列表維護在主節(jié)點中予颤,叫做 同步分片組囤官。正如名字中暗示的,這是一組確保能夠所有的索引和刪除操作并且能響應給用戶的 好的 分片冬阳,主分片負責維護這組不變的(譯者批注:不變的 這一描述感覺不好,因為副本數(shù)是可變的党饮,只是主分片數(shù)是不可變的)列表并向列表中的分片復制所有的操作肝陪。
主分片遵循以下基本流程:
- 校驗所有進入主分片的操作,并拒絕請求結構上有誤的操作(例如:數(shù)字類型的字段使用對象值)刑顺。
- 在本地執(zhí)行操作氯窍,也就是索引或刪除相關文檔。這一過程也會校驗字段的內容蹲堂,有必要的話拒絕操作(例如:一個分詞字段的值太長無法存儲到Lucene索引中)
- 將操作轉發(fā)到當前 同步列表 中的每個副本中狼讨, 如果列表中包含多個副本,這一操作是并行的贯城。
- 當這一操作在所有副本都執(zhí)行完畢熊楼,并響應給主分片,主分片將執(zhí)行完畢的結果反饋給客戶端能犯。
失敗處理
當索引文檔的時候鲫骗,有很多情況可能導致出錯 —— 磁盤損壞,節(jié)點之間無法連接踩晶,或者因為配置錯誤的原因導致操作盡管在主分片執(zhí)行成功卻在副本上執(zhí)行失敗了执泰,這些情況比較少見,但是主分片需要給予回應渡蜻。
在主分片失敗的情況下术吝。持有主分片的節(jié)點將會給 master 節(jié)點發(fā)送一個消息,索引操作將會等待(默認
情況下1分鐘左右)master 節(jié)點從副本中提升其中一個作為新的主分片茸苇,然后操作將會被轉發(fā)到新的主分片上執(zhí)行排苍。注意 master 也會監(jiān)控節(jié)點健康狀況并決定主動降級主分片,通常這個過程在主分片所在節(jié)點出現(xiàn)網(wǎng)絡故障的時候發(fā)生学密。詳見這里淘衙。
一旦操作在主分片上執(zhí)行成功彤守,主分片需要在副本執(zhí)行的時候處理潛在的失敗具垫,可能由于在副本上確實執(zhí)行失敗了或者由于網(wǎng)絡故障阻止操作抵達副本所在節(jié)點(或阻止副本節(jié)點發(fā)送響應)试幽。所有這些都會有相同的結果:同步列表 中的副本錯過了這個操作。為了避免影響這個不變的列表饰及,主分片發(fā)送請求到 master 節(jié)點燎含,要求 master 從同步列表刪除有問題的分片。master 一次只處理主分片發(fā)送的一個刪除操作屏箍。注意
master 也會使另一個節(jié)點構建新的分片赴魁,從而恢復系統(tǒng)健康狀態(tài)颖御。
當主分片向副本轉發(fā)操作時,主分片會借助副本的響應驗證自己是否還是活躍的潘拱,如果主分片由于網(wǎng)絡問題(或GC太久)被隔離在系統(tǒng)外芦岂,可能它意識到被降級之前他還會接收索引操作禽最。這些來自被隔離的分片的操作將會被副本拒絕,當主分片收到了拒絕的響應呛占,因為他不再是主分片了懦趋,之后他會去 master 中得知自己被其他副本替換了愕够,操作將會路由到新的主分片惑芭。
如果沒有副本會怎樣继找?
沒有副本的情況可能是索引配置副本數(shù)為0或者僅僅是所有副本分配失敗了,這個時候主分片執(zhí)行操作時不會執(zhí)行額外的檢驗凯亮,這樣肯能會有問題哄尔。另一方面主分片自己無法告知副本失敗岭接,而請求 master 替它做,意味著 master 知道主分片是唯一可用的分片啃沪,因此我們可以保證 master 不會提升其它分片為主分片创千,并且所有在主分片執(zhí)行的操作都不會丟失入偷。當然因為我們的數(shù)據(jù)跑在一個節(jié)點上盯串,硬件問題可能會導致數(shù)據(jù)丟失」谏悖看這里使用緩解方案几缭。
(譯者批注:說白了單節(jié)點不會存在數(shù)據(jù)一致性問題年栓,但是也放棄了高可用)
基本的讀模型
Elasticsearch 中的讀請求可以是 很輕量級的通過 ID 查找,也可能是比較重的復雜的占用巨大CPU的聚合搜索請求纸兔。主備模式的好處在于它讓所有分片數(shù)據(jù)一致否副,因此备禀,一個副本也可以用來提供搜索服務奈揍。
當節(jié)點收到讀請求后男翰,該節(jié)點將負責把請求轉發(fā)到所有相關的分片上蛾绎,并整理響應結果迫淹,返回給客戶端敛熬。我們稱這個節(jié)點叫做協(xié)調節(jié)點应民,下面是基本流程:
- 相關分片解析讀請求。注意因為大多數(shù)搜索將會被發(fā)送到一個或多個索引上繁仁,它們通常需要從多個分片進行讀取黄虱,每個分片代表數(shù)據(jù)的不同子集捻浦。
- 從每個相關的分片的分片組中選擇一個活躍的分片朱灿,這個分片可以是主分片也可以是副本盗扒,默認情況下 elasticsearch 通過輪詢的方式選擇一個分片侣灶。
- 發(fā)送分片級別的讀請求到被選中的分片。
- 聚合搜索結果響應褥影,注意如果使用 get ID 的查找方式伪阶,因為只有一個相關分片因此這一步可以跳過栅贴。
失敗處理
當一個分片響應讀請求失敗了檐薯,那么協(xié)調節(jié)點將選擇分片組中的另一個分片并發(fā)送分片級搜索請求到這個分片上。重復多次的失敗將導致沒有可用分片返回結果注暗,在某些情況下坛缕,例如 _search
請求,elasticsearch 將會盡快返回結果捆昏,盡管只有部分結果赚楚,而不是等待問題解決(響應部分結果將在響應頭部的 _shard
中體現(xiàn))。
一些簡單的含義
下面每個基本的流程都決定了 elasticsearch 作為讀寫系統(tǒng)的是如何工作的骗卜。進一步說宠页,因為讀寫請求是可以并發(fā)執(zhí)行的,這兩個基本的流程相互影響著寇仓,這里有一些內在的暗示:
有效的讀:在正常情況下举户,每個分片組只對每個讀操作執(zhí)行一次。只有在失敗的時候才會在多個分片下執(zhí)行同一個搜索
未響應讀:因為主分片首先現(xiàn)在本地索引然后在拷貝到其他副本遍烦,所以在收到索引響應答復之前并發(fā)讀是有可能看到文檔改動的俭嘁。
默認兩個分片:這個模型可以保證容錯,同時只需要維護兩個分片的數(shù)據(jù)服猪。相比基于半數(shù)以上原則的系統(tǒng)供填,其容錯的最小分片數(shù)為3(譯者批注:使用大于2的單數(shù)防止系統(tǒng)腦裂)
失敗
發(fā)生故障是,可能是以下情況:
單個節(jié)點降低索引速度:由于主分片上每個操作都要等待同步分片組中所有副本,因此一個分片如果慢了就會導致整個分片組變慢晌端。這就是上面提到的讀效率的代價泻骤。當然單個分片的緩慢也可能會影響一個被路由到該分片上的查詢速度。
臟讀:因故障被隔離的主分片可以對外暴露寫操作惦蚊,但是不會有響應欧芽。這是由于因故障而孤立的主分片只有在向它的副本發(fā)送請求或請求主節(jié)點時昏鹃,才會意識到自己失聯(lián)了。在這時索引操作已經寫到主分片并可以被讀請求并發(fā)讀到了。Elasticsearch 通過每秒鐘(默認) ping 主節(jié)點一次魂迄,如果無法發(fā)現(xiàn)主節(jié)點就拒絕索引操作這一方法來降低風險。
冰山一角
這篇文檔介紹了elasticsearch對數(shù)據(jù)處理的高階概述推溃,當然它底層還有很多很多細節(jié)例如 集群狀態(tài)發(fā)布,主節(jié)點選舉,都是來保證系統(tǒng)正常的短曾,文檔中并沒有完全涵蓋已知的和重要的bug哩都,在下面這個文檔中能夠讓你掌握第一手es的動態(tài) resiliency page儒鹿。