跨叢集複製CCR(Cross-Cluster Replication)支援將Leader叢集的索引資料近即時複製到Follower叢集,實現異地容災、讀寫分離和就近訪問。本文介紹ES常見容災方案的對比分析和CCR的工作原理,協助選擇適合的容災方案。
方案選型
Elasticsearch(ES)異地容災主要有以下方案:
OSS快照備份與恢複:通過將索引資料備份到阿里雲Object Storage Service,實現資料持久化儲存。首次快照為全量備份,後續為增量備份。通過跨叢集OSS倉庫,可將快照資料恢複到目標ES執行個體。詳情請參見設定跨叢集OSS倉庫。
Logstash:通過配置管道(Pipeline),從源端ES叢集讀取資料,經過處理後寫入目的地組群。適用於版本跨度較大的資料移轉和需要資料過濾轉換的情境。詳情請參見快速入門。
Reindex:通過ES內建的Reindex API,將全量或合格資料從一個索引複製到另一個索引,支援跨叢集操作。適用於資料量較小的一次性遷移情境。詳情請參見通過Reindex API遷移資料。
跨叢集複製(CCR):將Leader叢集的可寫索引,以非同步、增量的方式自動複製到一個或多個Follower叢集。支援近即時同步,適用於對RPO和RTO要求較高的容災情境。
方案對比
方案 | 適用情境 | RPO | RTO | 主要限制 |
OSS快照 | 大規模資料(GB~PB層級)的定期備份與恢複 | 小時級到天級(取決於快照間隔) | 數小時(取決於資料量和分區恢復) | 無法實現持續同步;恢複期間可能需要停止服務 |
Logstash | 對即時性要求不高的資料移轉;需要資料過濾轉換的情境;版本跨度較大的遷移 | 秒級到分鐘級(取決於同步頻率) | 數小時(取決於資料量和執行個體效能) | 批量同步,無法即時;不支援同步delete操作 |
Reindex | 資料量較小的一次性索引遷移 | 不適用(一次性操作) | 分鐘級到數小時(取決於資料量) | 無法持續同步;大規模資料移轉效率低 |
CCR | 異地容災、讀寫分離、就近訪問 | 近零(秒級) | 秒級到分鐘級 | Follower索引唯讀;需要相同的mapping和分區數 |
對於RPO和即時性要求高的異地容災情境,CCR是最佳選擇:
CCR實現秒級資料同步,資料丟失最小化。
主叢集故障時,業務流量切換到Follower叢集即可恢複服務,無需等待快照恢複。
雖然初始部署成本較高,但長期來看避免了資料丟失導致的業務損失,性價比更高。
CCR工作原理
基本架構
CCR採用主動-被動(Active-Passive)架構。Leader叢集負責接收所有寫操作,Follower叢集為唯讀狀態,僅從Leader叢集複製資料。
Leader叢集:源端叢集,承擔所有寫操作。
Follower叢集:目標端叢集,唯讀狀態,通過CCR從Leader叢集同步資料。
資料複製流程
CCR的資料複製分為兩個階段:
初始化階段
Follower叢集向Leader發起初始化請求,Leader將索引的所有Lucene segment檔案傳輸到Follower索引,類似於快照恢複機制。
增量同步處理階段
Follower索引的分區定期(預設每秒)向Leader發起提取要求,擷取自上次同步點之後的最新操作。具體過程如下:
定位拉取起點:Follower本地維護一個
remote_checkpoint,表示已成功應用到本地的最新操作位置,對應Leader Translog(交易記錄)中的global_checkpoint。從Leader Translog讀取操作:Leader根據Follower提供的
from_seq_no定位Translog中的起始位置,讀取後續所有操作(index、update、delete),返回巨集指令清單。Follower本地重放:Follower在本地按順序重放這些操作,更新
remote_checkpoint。如果重放失敗(如版本衝突),會暫停同步並記錄錯誤。持續輪詢:Follower以固定間隔持續拉取新操作,通常延遲小於1秒。
Translog的核心作用
Translog(交易記錄)是CCR增量同步處理的資料來源,在ES中承擔以下作用:
防止資料丟失:ES預設每秒refresh一次,將記憶體緩衝區資料產生新的Lucene可搜尋段,但這些段尚未同步到磁碟。Translog記錄了所有寫操作,可在節點崩潰後通過重放恢複資料。
保障副本一致性:寫操作先寫入Translog,再轉寄給副本分區。只有主副分區都確認寫入後,才返回成功。
支援CCR增量同步處理:CCR通過ES內部的Translog API讀取動作記錄,擷取指定序號之後的所有變更,實現近即時資料複製。
Translog按分區隔離儲存,每個分區擁有獨立的Translog目錄,儲存路徑為indices/{index_uuid}/{shard_id}/translog/。Translog檔案(.tlog)以二進位格式儲存,採用Generation機制滾動管理:每次flush或檔案達到大小上限(預設512MB)時,建立新一代檔案。
阿里雲ES叢集的CCR網路方案
阿里雲ES執行個體部署在獨立的管控VPC內,而非使用者VPC中。即使兩個叢集在同一地區或已通過CEN打通跨地區VPC,也無法直接實現叢集間的私網互連。需要藉助NLB和PrivateLink打通管控VPC網路。
根據兩個叢集是否在同一地區,選擇對應的操作文檔:
情境 | 說明 | 操作文檔 |
同地區 | Leader和Follower叢集在同一地區,通過NLB+PrivateLink打通管控VPC | |
跨地區 | Leader和Follower叢集在不同地區,需先通過CEN打通使用者VPC,再通過NLB+PrivateLink打通管控VPC |
使用限制
兩個叢集的管控部署模式均需為雲原生新管控(v3)。如果叢集為v1或v2架構,需先完成架構升級,請參見執行個體架構升級。
如何識別ES叢集架構版本:登入ES控制台,在執行個體基本資料頁面查看管控部署模式:雲原生新管控(v3)或者基礎管控(v2)。
兩個叢集的版本均需為7.10.0及以上,且Follower叢集版本不低於Leader叢集版本。
Follower索引為唯讀狀態,不支援寫入操作。如需寫入,需對目標索引執行以下操作,恢複索引的可讀寫狀態:
暫停跟隨任務:
POST /<index>/_ccr/pause_follow關閉索引:
POST /<index>/_close解除跟隨關係:
POST /<index>/_ccr/unfollow重新開啟索引,使其可讀寫:
POST /<index>/_open
Leader叢集索引的mapping和分區數必須與Follower叢集索引一致,Follower叢集的分區數不能更改。