Elasticsearch 跨集群同步

2021-09-20 11:16:20 字數 2557 閱讀 4276

zsearch是目前公司內最大的elasticsearch服務平台,隨著業務的深入,越來越多的關鍵鏈路使用者對資料的可用性和容災能力提出更高的需求,而在這塊領域 社群一直沒有完整的解決策略,原生的 snapshot and restore 只能做快照的恢復,不能做到實時同步;業內主流的佇列分發模式(通過訊息佇列快取請求資料,多個集群消費資料實現請求複製)也只能做到請求的同步,乙個不可預期的操作如delete_by_query 集群間便會產生資料差異。歸根到底我們需要乙個類似mysql的binlog同步方案, 從底層機制上保證資料的最終一致性,為此 zsearch核心團隊經過數月原始碼研究 精心打造了elasticsearch-xdcr,一款基於translog原生複製協議的跨集群同步產品。

elasticsearch-xdcr 採用外掛程式形式,產品形態上依然保留了es社群一貫的簡單風格。

安裝簡單,只要在兩個集群安裝外掛程式重啟即可。

使用簡單,兩個restful操作完成資料同步。

資料一致,基於原生複製協議,支援實時同步。

第一步 在主集群建立備份集群倉庫

put _xdcr/ -d , , ... ]}}

第二步 開啟索引同步
_xdcr// -d '

'

本文將通過elasticsearch原始碼分析,結合其原生複製處理過程來講解xdcr的設計思路,首先我們了解es的一些基礎概念。

elasticsearch-xdcr的實現思路便是分析primary到replica的內部複製處理流程,將複製目標擴充套件到外部集群達成跨集群資料同步效果。

當我們為乙個索引建立乙個新的副本,master節點便會發布乙個新的集群狀態,被分配的work節點根據shardrouting找到主分片位置並建立恢復任務,此過程在es中被稱之為peer_recovery。

核心原始碼指引: org.elasticsearch.indices.cluster.indicesclusterstateservice

了解了總的處理流程,我們可以把關注點聚焦到主-副間的具體恢復流程。es採用的是一種推模式,主分片在接收到副本節點發來的start_recovery請求,會源源不斷的往目標分片推送索引資料,直到全部結束後,備節點將shard更新到可服務狀態 完成peer_recovery流程,推的過程分為三個階段:

原始碼及呼叫關係參照下圖

核心原始碼指引

org.elasticsearch.indices.recovery.*

es的原生peerrecovery過程只能在索引的建立初始化階段(init),而跨集群方案中外部集群通常已經建好了對等的索引,處於服務狀態(started)的shard不允許做任何後台任務。最初的方案我們是想設計一種新的shardrouting,在索引核心載入層擴充套件新的recovery型別支援遠端recovery,但這樣的改動會侵入到es core層原始碼,不利於後續的版本迭代。如果想無侵入以外掛程式形式實現跨集群複製,只能利用二階段的translog recovery,shard在服務狀態translog可偽裝成primary操作寫入引擎,但是純translog recovery在速度上遠不及索引檔案拷貝,經過各種利弊權衡,我們最終還是採用零侵入的translog方式,畢竟不綁架使用者的產品更具生命力。

**片段

engine.operation.origin.peer_recovery -> engine.operation.origin.primary 

for (translog.operation operation : operations) );

}

es 6.0之後引入了乙個非常重要的特性 sequncenumber,shard上任何型別的寫操作,包括index、create、update和delete,都會生成乙個連續遞增的_seq_no。這使得node異常或重啟時,能夠從最後的位點(checkpoint)快速恢復,這個特性同樣也使的跨集群複製具備了第二個重要條件 - 斷點續傳 。利用該特性,在多機房容場景抵禦各種不可預知的問題,如網路抖動、網路故障、集群宕機等等,恢復後的recovery流依然可以通過seqno快速恢復。

**片段

translog.snapshot snapshot = translog.newsnapshotfromminseqno(startingseqno);
由於篇幅有限,本文介紹了實現es跨集群同步的兩個重要條件和實現思路,後期可結合思路詳細講解實現的過程。

elasticsearch備份恢復(單機 集群)

參考 版本 7.3 1 伺服器上建立 var backups資料夾,chmod 777 許可權 2 修改elasticsearch.yml檔案,新增 path.repo var backups 3 重啟es 4 建立快照倉庫 5 備份 put6 恢復 post restore7 檢視備份資訊 get...

Elasticsearch實際資料集搜尋操作

載入並建立索引 curl xpost 192.168.110.130 9200 bank account bulk?pretty refresh data binary account.json 1 rest請求uri傳送搜尋引數 curl xget 192.168.110.130 9200 ban...

Elasticsearch 面試題集綿

問題1 elasticsearch為啥是近實時搜尋?答 a.新增的文件會被收集到indexing buffer中,然後文件從indexing buffer寫入到檔案系統快取中,是需要每秒自動重新整理分片,這時索引文件的變化並不是立即對搜尋可見。問題2 elasticsearch深分頁查詢有什麼問題?...