您好,登錄后才能下訂單哦!
本篇內容主要講解“Elasticsearch索引的分片分配Recovery怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Elasticsearch索引的分片分配Recovery怎么使用”吧!
在elasticsearch中,recovery指的是一個索引的分片分配到另外一個節點的過程,一般在快照恢復、索引復制分片的變更、節點故障或重啟時發生,由于master節點保存整個集群相關的狀態信息,因此可以判斷哪些分片需要再分配及分配到哪個節點,例如:
如果某個主分片在,而復制分片所在的節點掛掉了,那么master需要另行選擇一個可用節點,將這個主分片的復制分片分配到可用節點上,然后進行主從分片的數據復制。
如果某個主分片所在的節點掛掉了,復制分片還在,那么master會主導將復制分片升級為主分片,然后再做主從分片數據復制。
如果某個分片的主副分片都掛掉了,則暫時無法恢復,而是要等持有相關數據的節點重新加入集群后,master才能主持數據恢復相關操作。
但是,recovery過程要消耗額外的資源,CPU、內存、節點間的網絡帶寬等。可能導致集群的服務性能下降,甚至部分功能暫時無法使用,所以,有必要了解在recovery的過程和其相關的配置,來減少不必要的消耗和問題。
有時候,可能會遇到es集群整體重啟的情況,比如硬件升級、不可抗力的意外等,那么再次重啟集群會帶來一個問題:某些節點優先起來,并優先選舉出了主節點,有了主節點,該主節點會立刻主持recovery的過程。
但此時,這個集群數據還不完整(還有其他的節點沒有起來),例如A節點的主分片對應的復制分片所在的B節點還沒起來,但主節點會將A節點的幾個沒有復制分片的主分片重新拷貝到可用的C節點上。而當B節點成功起來了,自檢時發現在自己節點存儲的A節點主分片對應的復制分片已經在C節點上出現了,就會直接刪除自己節點中“失效”的數據(A節點的那幾個復制分片),這種情況很可能頻繁出現在有多個節點的集群中。
而當整個集群恢復后,其各個節點的數據分布,顯然是不均衡的(先啟動的節點把數據恢復了,后起來的節點內刪除了無效的數據),這時,master就會觸發Rebalance的過程,將數據在各個節點之間挪動,這個過程又消耗了大量的網絡流量。所以,我們需要合理的設置recovery相關參數來優化recovery過程。
在集群啟動過程中,一旦有了多少個節點成功啟動,就執行recovery過程,這個命令將master節點(有master資格的節點)和data節點都算在內。
gateway.expected_nodes: 3
有幾個master節點啟動成功,就執行recovery的過程。
gateway.expected_master_nodes: 3
有幾個data節點啟動成功,就執行recovery的過程。
gateway.expected_data_nodes: 3
當集群在期待的節點數條件滿足之前,recovery過程會等待gateway.recover_after_time指定的時間,一旦等待超時,則會根據以下條件判斷是否執行recovery的過程:
gateway.recover_after_nodes: 3 # 3個節點(master和data節點都算)啟動成功 gateway.recover_after_master_nodes: 3 # 3個有master資格的節點啟動成功 gateway.recover_after_data_nodes: 3 # 3個有data資格的節點啟動成功
上面三個配置滿足一個就會執行recovery的過程。
如果有以下配置的集群:
gateway.expected_data_nodes: 10 gateway.recover_after_time: 5m gateway.recover_after_data_nodes: 8
此時的集群在5分鐘內,有10個data節點都加入集群,或者5分鐘后有8個以上的data節點加入集群,都會啟動recovery的過程。
如果不是full restart,而是重啟單個節點,也會造成不同節點之間來復制,為了避免這個問題,可以在重啟之前,關閉集群的shard allocation。
PUT _cluster/settings { "transient": { "cluster.routing.allocation.enable":"none" } }
當節點重啟后,再重新打開:
PUT _cluster/settings { "transient": { "cluster.routing.allocation.enable":"all" } }
這樣,節點重啟后,盡可能的從本節點直接恢復數據。但是在es1.6版本之前,既使做了以上措施,仍然會出現大量主副分片之間的數據拷貝,從面上看,這點讓人很不理解,主副分片數據是完全一致的,在節點重啟后,直接從本節點的副本重恢復數據就好了呀,為什么還要再從主分片再復制一遍呢?原因是在于recovery是簡單的對比主副分片的segment file(分段文件)來判斷哪些數據一致是可以本地恢復,哪些不一致的需要重新拷貝的。而不同節點的segment file是完全獨立運行的,這可能導致主副本merge的深度不完全一致,從而造成即使文檔集完全一樣,而產生的segment file卻不完全一樣。
為了解決這個問題,在es1.6版本之后,加入了synced flush(同步刷新)新特性,對于5分鐘沒有更新過的shard,會自動synced flush一下,其實就是為對應的shard加入一個synced flush id,這樣在節點重啟后,先對比主副shard的synced flush id,就可以知道兩個shard是否完全相同,避免了不必要的segment file拷貝。
需要注意的是synced flush只對冷索引有效,對于熱索引(5分鐘內有更新的索引)無效,如果重啟的節點包含有熱索引,那還是免不了大量的拷貝。如果要重啟一個包含大量熱索引的節點,可以按照以下步驟執行重啟過程,可以讓recovery過程瞬間完成:
暫停數據寫入
關閉集群的shard allocation
手動執行 POST /_flush/synced
重啟節點
重新開啟集群的shard allocation
等待recovery完成,當集群的health status是green后
重新開啟數據寫入
對于冷索引,由于數據不再更新(對于elasticsearch來說,5分鐘,很久了),利用synced flush可以快速的從本地恢復數據,而對于熱索引,特別是shard很大的熱索引,除了synced flush派不上用場,從而需要大量跨節點拷貝segment file以外,translog recovery可能是導致慢的更重要的原因。
我們來研究下這個translog recovery是什么鬼!
當節點重啟后,從主分片恢復數據到復制分片需要經歷3個階段:
第一階段,對于主分片上的segment file做一個快照,然后拷貝到復制分片所在的節點,在數據拷貝期間,不會阻塞索引請求,新增的索引操作會記錄到translog中(理解為于臨時文件)。
第二階段,對于translog做一個快照,此快照包含第一階段新增的索引請求,然后重放快照里的索引操作,這個階段仍然不會阻塞索引請求,新增索引操作記錄到translog中。
第三階段,為了能達到主副分片完全同步,阻塞新索引請求,然后重放上一階段新增的translog操作。
由此可見,在recovery過程完成之前,translog是不能被清除掉的。如果shard比較大,第一階段會耗時很長,會導致此階段產生的translog很大,重放translog要比簡單的文件拷貝耗時更長,因此第二階段的translog耗時也顯著的增加了。等到了第三階段,需要重放的translog可能會比第二階段更多。要命的是,第三階段是會阻塞新索引(寫入)請求的,在對寫入實時性要求很高的場合,這就會導致性能下降,非常影響用戶體驗。因此,要加快特大熱索引恢復速度,最好是參照上一節中的方式:
暫停數據寫入。
手動synced flush。
等待數據恢復完成后。
重新恢復數據寫入。
這樣就會把數據延遲影響降到最低。
到此,相信大家對“Elasticsearch索引的分片分配Recovery怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。