亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Elasticsearch索引的分片分配Recovery使用講解

 更新時間:2022年04月19日 18:12:35   作者:Zhangkai's  
這篇文章主要為大家介紹了Elasticsearch索引的分片分配Recovery使用講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

什么是recovery?

在elasticsearch中,recovery指的是一個索引的分片分配到另外一個節(jié)點的過程,一般在快照恢復(fù)、索引復(fù)制分片的變更、節(jié)點故障或重啟時發(fā)生,由于master節(jié)點保存整個集群相關(guān)的狀態(tài)信息,因此可以判斷哪些分片需要再分配及分配到哪個節(jié)點,例如:

  • 如果某個主分片在,而復(fù)制分片所在的節(jié)點掛掉了,那么master需要另行選擇一個可用節(jié)點,將這個主分片的復(fù)制分片分配到可用節(jié)點上,然后進行主從分片的數(shù)據(jù)復(fù)制。
    如果某個主分片所在的節(jié)點掛掉了,復(fù)制分片還在,那么master會主導(dǎo)將復(fù)制分片升級為主分片,然后再做主從分片數(shù)據(jù)復(fù)制。
  • 如果某個分片的主副分片都掛掉了,則暫時無法恢復(fù),而是要等持有相關(guān)數(shù)據(jù)的節(jié)點重新加入集群后,master才能主持?jǐn)?shù)據(jù)恢復(fù)相關(guān)操作。

但是,recovery過程要消耗額外的資源,CPU、內(nèi)存、節(jié)點間的網(wǎng)絡(luò)帶寬等??赡軐?dǎo)致集群的服務(wù)性能下降,甚至部分功能暫時無法使用,所以,有必要了解在recovery的過程和其相關(guān)的配置,來減少不必要的消耗和問題。

減少集群full restart造成的數(shù)據(jù)來回拷貝

有時候,可能會遇到es集群整體重啟的情況,比如硬件升級、不可抗力的意外等,那么再次重啟集群會帶來一個問題:某些節(jié)點優(yōu)先起來,并優(yōu)先選舉出了主節(jié)點,有了主節(jié)點,該主節(jié)點會立刻主持recovery的過程。

但此時,這個集群數(shù)據(jù)還不完整(還有其他的節(jié)點沒有起來),例如A節(jié)點的主分片對應(yīng)的復(fù)制分片所在的B節(jié)點還沒起來,但主節(jié)點會將A節(jié)點的幾個沒有復(fù)制分片的主分片重新拷貝到可用的C節(jié)點上。而當(dāng)B節(jié)點成功起來了,自檢時發(fā)現(xiàn)在自己節(jié)點存儲的A節(jié)點主分片對應(yīng)的復(fù)制分片已經(jīng)在C節(jié)點上出現(xiàn)了,就會直接刪除自己節(jié)點中“失效”的數(shù)據(jù)(A節(jié)點的那幾個復(fù)制分片),這種情況很可能頻繁出現(xiàn)在有多個節(jié)點的集群中。

而當(dāng)整個集群恢復(fù)后,其各個節(jié)點的數(shù)據(jù)分布,顯然是不均衡的(先啟動的節(jié)點把數(shù)據(jù)恢復(fù)了,后起來的節(jié)點內(nèi)刪除了無效的數(shù)據(jù)),這時,master就會觸發(fā)Rebalance的過程,將數(shù)據(jù)在各個節(jié)點之間挪動,這個過程又消耗了大量的網(wǎng)絡(luò)流量。所以,我們需要合理的設(shè)置recovery相關(guān)參數(shù)來優(yōu)化recovery過程。

  • 在集群啟動過程中,一旦有了多少個節(jié)點成功啟動,就執(zhí)行recovery過程,這個命令將master節(jié)點(有master資格的節(jié)點)和data節(jié)點都算在內(nèi)。
gateway.expected_nodes: 3
  • 有幾個master節(jié)點啟動成功,就執(zhí)行recovery的過程。
gateway.expected_master_nodes: 3
  • 有幾個data節(jié)點啟動成功,就執(zhí)行recovery的過程。
gateway.expected_data_nodes: 3

當(dāng)集群在期待的節(jié)點數(shù)條件滿足之前,recovery過程會等待gateway.recover_after_time指定的時間,一旦等待超時,則會根據(jù)以下條件判斷是否執(zhí)行recovery的過程:

gateway.recover_after_nodes: 3    # 3個節(jié)點(master和data節(jié)點都算)啟動成功
gateway.recover_after_master_nodes: 3  # 3個有master資格的節(jié)點啟動成功
gateway.recover_after_data_nodes: 3   # 3個有data資格的節(jié)點啟動成功

上面三個配置滿足一個就會執(zhí)行recovery的過程。
如果有以下配置的集群:

gateway.expected_data_nodes: 10
gateway.recover_after_time: 5m
gateway.recover_after_data_nodes: 8

此時的集群在5分鐘內(nèi),有10個data節(jié)點都加入集群,或者5分鐘后有8個以上的data節(jié)點加入集群,都會啟動recovery的過程。

減少主副本之間的數(shù)據(jù)復(fù)制

如果不是full restart,而是重啟單個節(jié)點,也會造成不同節(jié)點之間來復(fù)制,為了避免這個問題,可以在重啟之前,關(guān)閉集群的shard allocation。

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable":"none"
  }
}

當(dāng)節(jié)點重啟后,再重新打開:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable":"all"
  }
}

這樣,節(jié)點重啟后,盡可能的從本節(jié)點直接恢復(fù)數(shù)據(jù)。但是在es1.6版本之前,既使做了以上措施,仍然會出現(xiàn)大量主副分片之間的數(shù)據(jù)拷貝,從面上看,這點讓人很不理解,主副分片數(shù)據(jù)是完全一致的,在節(jié)點重啟后,直接從本節(jié)點的副本重恢復(fù)數(shù)據(jù)就好了呀,為什么還要再從主分片再復(fù)制一遍呢?原因是在于recovery是簡單的對比主副分片的segment file(分段文件)來判斷哪些數(shù)據(jù)一致是可以本地恢復(fù),哪些不一致的需要重新拷貝的。而不同節(jié)點的segment file是完全獨立運行的,這可能導(dǎo)致主副本merge的深度不完全一致,從而造成即使文檔集完全一樣,而產(chǎn)生的segment file卻不完全一樣。

為了解決這個問題,在es1.6版本之后,加入了synced flush(同步刷新)新特性,對于5分鐘沒有更新過的shard,會自動synced flush一下,其實就是為對應(yīng)的shard加入一個synced flush id,這樣在節(jié)點重啟后,先對比主副shard的synced flush id,就可以知道兩個shard是否完全相同,避免了不必要的segment file拷貝。

需要注意的是synced flush只對冷索引有效,對于熱索引(5分鐘內(nèi)有更新的索引)無效,如果重啟的節(jié)點包含有熱索引,那還是免不了大量的拷貝。如果要重啟一個包含大量熱索引的節(jié)點,可以按照以下步驟執(zhí)行重啟過程,可以讓recovery過程瞬間完成:

  • 暫停數(shù)據(jù)寫入
  • 關(guān)閉集群的shard allocation
  • 手動執(zhí)行 POST /_flush/synced
  • 重啟節(jié)點
  • 重新開啟集群的shard allocation
  • 等待recovery完成,當(dāng)集群的health status是green后
  • 重新開啟數(shù)據(jù)寫入

特大熱索引為何恢復(fù)慢

對于冷索引,由于數(shù)據(jù)不再更新(對于elasticsearch來說,5分鐘,很久了),利用synced flush可以快速的從本地恢復(fù)數(shù)據(jù),而對于熱索引,特別是shard很大的熱索引,除了synced flush派不上用場,從而需要大量跨節(jié)點拷貝segment file以外,translog recovery可能是導(dǎo)致慢的更重要的原因。
我們來研究下這個translog recovery是什么鬼!
當(dāng)節(jié)點重啟后,從主分片恢復(fù)數(shù)據(jù)到復(fù)制分片需要經(jīng)歷3個階段:

  • 第一階段,對于主分片上的segment file做一個快照,然后拷貝到復(fù)制分片所在的節(jié)點,在數(shù)據(jù)拷貝期間,不會阻塞索引請求,新增的索引操作會記錄到translog中(理解為于臨時文件)。
  • 第二階段,對于translog做一個快照,此快照包含第一階段新增的索引請求,然后重放快照里的索引操作,這個階段仍然不會阻塞索引請求,新增索引操作記錄到translog中。
  • 第三階段,為了能達(dá)到主副分片完全同步,阻塞新索引請求,然后重放上一階段新增的translog操作。

由此可見,在recovery過程完成之前,translog是不能被清除掉的。如果shard比較大,第一階段會耗時很長,會導(dǎo)致此階段產(chǎn)生的translog很大,重放translog要比簡單的文件拷貝耗時更長,因此第二階段的translog耗時也顯著的增加了。等到了第三階段,需要重放的translog可能會比第二階段更多。要命的是,第三階段是會阻塞新索引(寫入)請求的,在對寫入實時性要求很高的場合,這就會導(dǎo)致性能下降,非常影響用戶體驗。因此,要加快特大熱索引恢復(fù)速度,最好是參照上一節(jié)中的方式:

  • 暫停數(shù)據(jù)寫入。
  • 手動synced flush。
  • 等待數(shù)據(jù)恢復(fù)完成后。
  • 重新恢復(fù)數(shù)據(jù)寫入。

這樣就會把數(shù)據(jù)延遲影響降到最低。

歡迎斧正,that's all see also:[本文主要參考:Elasticsearch Recovery詳解]

(https://blog.csdn.net/u012450329/article/details/52881045) | [cat recovery]

(https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-recovery.html) | [Indices Recovery]

(https://www.elastic.co/guide/en/elasticsearch/reference/current/recovery.html)

以上就是Elasticsearch索引的分片分配Recovery使用講解的詳細(xì)內(nèi)容,更多關(guān)于Elasticsearch索引的分片分配Recovery 的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論