使用極限網(wǎng)關(guān)助力 ES 集群無縫升級、遷移上/下云
在工作中大家可能會遇到以下這些場景:
- 自建 ES 集群需要平滑遷移到 XX 云;
- 從 XX 云將 ES 集群遷移到自建機(jī)房;
- ES 集群進(jìn)行跨版本升級,同時保留回退能力;
這些場景往往都還有個共同的需求:遷移過程要保證業(yè)務(wù)的最小停機(jī)時間。 ?
幸運(yùn)的是,在這三個場景中,我們都能使用極限網(wǎng)關(guān)來幫助我們進(jìn)行更絲滑的遷移或升級。下面,我們以遷移 ES 集群上云為例,介紹下整個工作過程。
- 自建版本: 5.4.2
- 云上版本: 5.6.16
- Gateway 和 Console 建議用最新版本
遷移架構(gòu)
通過將應(yīng)用端流量走網(wǎng)關(guān)的方式,請求同步轉(zhuǎn)發(fā)給自建 ES,網(wǎng)關(guān)記錄所有的寫入請求,并確保順序在 XX 云 ES 上重放請求,兩側(cè)集群的各種故障都妥善進(jìn)行了處理,從而實(shí)現(xiàn)透明的集群雙寫,實(shí)現(xiàn)安全無縫的數(shù)據(jù)遷移。
業(yè)務(wù)端如果已經(jīng)部署在云上,可以使用云上的 SLB 服務(wù)來訪問網(wǎng)關(guān),確保后端網(wǎng)關(guān)的高可用,如果業(yè)務(wù)端和極限網(wǎng)關(guān)還在企業(yè)內(nèi)網(wǎng),可以使用極限網(wǎng)關(guān)自帶的 4 層浮動 IP 來確保網(wǎng)關(guān)的 高可用 。
執(zhí)行步驟
部署 INFINI Gateway
為了保證數(shù)據(jù)的無縫透明遷移,通過網(wǎng)關(guān)來進(jìn)行雙寫。
修改網(wǎng)關(guān)配置 ?
在此 下載 網(wǎng)關(guān)雙寫配置,默認(rèn)網(wǎng)關(guān)會加載配置文件 gateway.yml 。如果要指定其他配置文件使用 -config 選項(xiàng)。 ?
配置文件內(nèi)容較多,下面僅展示必要部分。
??#primary
??PRIMARY_ENDPOINT:?http://192.168.56.3:7171
??PRIMARY_USERNAME:?elastic
??PRIMARY_PASSWORD:?password
??PRIMARY_MAX_QPS_PER_NODE:?10000
??PRIMARY_MAX_BYTES_PER_NODE:?104857600?#100MB/s
??PRIMARY_MAX_CONNECTION_PER_NODE:?200
??PRIMARY_DISCOVERY_ENABLED:?false
??PRIMARY_DISCOVERY_REFRESH_ENABLED:?false
??#backup
??BACKUP_ENDPOINT:?http://192.168.56.3:9200
??BACKUP_USERNAME:?admin
??BACKUP_PASSWORD:?admin
??BACKUP_MAX_QPS_PER_NODE:?10000
??BACKUP_MAX_BYTES_PER_NODE:?104857600?#100MB/s
??BACKUP_MAX_CONNECTION_PER_NODE:?200
??BACKUP_DISCOVERY_ENABLED:?false
??BACKUP_DISCOVERY_REFRESH_ENABLED:?false
PRIMARY_ENDPOINT:配置主集群地址和端口 ?
PRIMARY_USERNAME、PRIMARY_PASSWORD: 訪問主集群的用戶信息 ?
BACKUP_ENDPOINT:配置備集群地址和端口 ?
BACKUP_USERNAME、BACKUP_PASSWORD: 訪問備集群的用戶信息
- 啟動網(wǎng)關(guān) ?
啟動網(wǎng)關(guān)并指定剛剛創(chuàng)建的配置,如下: ?./gateway-linux-amd64 -config replication_via-disk.yml.yml
部署 INFINI Console
為了方便在多個集群之間快速切換,管理網(wǎng)關(guān)消費(fèi)任務(wù)、查看隊(duì)列等。使用 INFINI Console 來進(jìn)行管理。
啟動服務(wù) ?
./console-linux-amd64 -service install
?./console-linux-amd64 -service start
注冊資源 ?
將 ES 集群、極限網(wǎng)關(guān)都注冊到 Console 中。
- 注冊 ES 集群:方便切換集群,執(zhí)行命令。除了新舊集群外,將網(wǎng)關(guān)也在此注冊一次,方便驗(yàn)證網(wǎng)關(guān)功能。
- 注冊 Gateway:管理網(wǎng)關(guān)任務(wù)、隊(duì)列。
測試 INFINI Gateway
為了驗(yàn)證網(wǎng)關(guān)是否正常工作,我們通過 INFINI Console 來快速驗(yàn)證一下。 ?
首先通過走網(wǎng)關(guān)的接口來創(chuàng)建一個索引,并寫入一個文檔,如下:
查看 5.4.2 集群的數(shù)據(jù)情況,如下:
查看集群 5.6.16 的數(shù)據(jù)情況,如下:
數(shù)據(jù)一致,說明網(wǎng)關(guān)配置都正常,驗(yàn)證結(jié)束。
調(diào)整網(wǎng)關(guān)的消費(fèi)策略
因?yàn)槲覀冃枰谌繑?shù)據(jù)遷移之后,才能進(jìn)行增量數(shù)據(jù)的追加,在全量數(shù)據(jù)遷移完成之前,我們應(yīng)該暫停增量數(shù)據(jù)的消費(fèi)。修改網(wǎng)關(guān)配置里面 Pipeline consume-queue_backup-bulk_request_ingestion-to-backup
的參數(shù) auto_start
為 false
,表示不自動啟動該任務(wù),具體配置方法如下:
修改完配置之后,需要重新啟動網(wǎng)關(guān)。 ?
由于之前已經(jīng)注冊了網(wǎng)關(guān),待全量遷移完成之后,可以通過后臺的 Task 管理來進(jìn)行后續(xù)的任務(wù)啟動、停止,如下:
切換流量
接下來,將業(yè)務(wù)正常寫的流量切換到網(wǎng)關(guān),也就是需要把之前指向 ES 5.4.2 的地址指向網(wǎng)關(guān)的地址,如果 5.4.2 集群開啟了身份驗(yàn)證,業(yè)務(wù)端代碼同樣需要傳遞身份信息,和 5.4.2 之前的用法保持不變。
切換流量到網(wǎng)關(guān)之后,用戶的請求還是以同步的方式正常訪問自建集群,網(wǎng)關(guān)記錄到的請求會按順序記錄到 MQ 里面,但是消費(fèi)是暫停狀態(tài)。
如果業(yè)務(wù)端代碼使用的 ES 的 SDK 支持 Sniff,并且業(yè)務(wù)代碼開啟了 Sniff,那么應(yīng)該關(guān)閉 Sniff,避免業(yè)務(wù)端通過 Sniff 直接鏈接到后端的 ES 節(jié)點(diǎn),所有的流量現(xiàn)在應(yīng)該都只通過網(wǎng)關(guān)來進(jìn)行訪問。
全量數(shù)據(jù)遷移
在流量遷移到網(wǎng)關(guān)之后,我們開始對自建 Elasticsearch 集群的數(shù)據(jù)進(jìn)行全量遷移到 XX 云 Elasticsearch 集群。
全量遷移已有的數(shù)據(jù)的方式有很多種:
- 通過快照的方式進(jìn)行恢復(fù)
- 使用 INFINI Console 進(jìn)行數(shù)據(jù)遷移
增量數(shù)據(jù)遷移
在全量導(dǎo)入的過程中,可能存在數(shù)據(jù)的增量修改,不過這部分請求都已經(jīng)完整記錄下來了,我們只需要開啟網(wǎng)關(guān)的消費(fèi)任務(wù)即可將積壓的請求應(yīng)用到云端的 ES 集群。
示例操作如下:
通過觀察隊(duì)列是否消費(fèi)完成來判斷增量數(shù)據(jù)是否做完,如下:
執(zhí)行數(shù)據(jù)比對
由于集群內(nèi)部的數(shù)據(jù)可能比較多,我們需要進(jìn)行一個完整的比對才能確保數(shù)據(jù)的完整性,可以通過 INFINI Console 的數(shù)據(jù)比對 工具來進(jìn)行。
切換集群
如果驗(yàn)證完之后,兩個集群的數(shù)據(jù)已經(jīng)完全一致了,可以將程序切換到新集群,或者將網(wǎng)關(guān)的配置里面的主備進(jìn)行互換,仍舊寫兩個集群,先寫云端集群,再寫自建集群。
雙集群在線運(yùn)行一段時間,待業(yè)務(wù)完全驗(yàn)證之后,再安全下線老集群,如遇到問題,也可以隨時回切到老集群。
小結(jié)
通過使用極限網(wǎng)關(guān),自建 ES 集群可以安全無縫的遷移上云,在遷移的過程中,兩套集群通過網(wǎng)關(guān)進(jìn)行了解耦,兩套集群的版本也可以不一樣,在遷移的過程中還能實(shí)現(xiàn)版本的無縫升級。
工作流程圖