用極限網(wǎng)關(guān)實(shí)現(xiàn) ES 容災(zāi),簡單!
身為 IT 人士,大伙身邊的各種系統(tǒng)肯定不少吧。系統(tǒng)雖多,但最最最重要的那套、那幾套,大伙肯定是捧在手心,關(guān)懷備至。如此重要的系統(tǒng),萬一發(fā)生故障了且短期無法恢復(fù),該如何保障業(yè)務(wù)持續(xù)運(yùn)行? 有過這方面思考或經(jīng)驗(yàn)的同學(xué),肯定脫口而出--切災(zāi)備啊。 是的,接下來我來介紹下我們的 ES 災(zāi)備方案。當(dāng)然如果你有更好的,請(qǐng)使用各種可用的渠道聯(lián)系我們。
總體設(shè)計(jì)
通過極限網(wǎng)關(guān)?將應(yīng)用對(duì)主集群的寫操作,復(fù)制到災(zāi)備集群。應(yīng)用發(fā)送的讀請(qǐng)求則直接轉(zhuǎn)發(fā)到主集群,并將響應(yīng)結(jié)果轉(zhuǎn)發(fā)給應(yīng)用。應(yīng)用對(duì)網(wǎng)關(guān)無感知,訪問方式與訪問 ES 集群一樣。
方案優(yōu)勢
輕量級(jí)
極限網(wǎng)關(guān)使用 Golang 編寫,安裝包很小,只有 10MB 左右,沒有任何外部環(huán)境依賴,部署安裝都非常簡單,只需要下載對(duì)應(yīng)平臺(tái)的二進(jìn)制可執(zhí)行文件,啟動(dòng)網(wǎng)關(guān)程序的二進(jìn)制程序文件執(zhí)行即可。
跨版本支持
極限網(wǎng)關(guān)針對(duì)不同的 Elasticsearch 版本做了兼容和針對(duì)性處理,能夠讓業(yè)務(wù)代碼無縫的進(jìn)行適配,后端 Elasticsearch 集群版本升級(jí)能夠做到無縫過渡,降低版本升級(jí)和數(shù)據(jù)遷移的復(fù)雜度。
高可用
極限網(wǎng)關(guān)內(nèi)置多種高可用解決方案,前端請(qǐng)求入口支持基于虛擬 IP 的雙機(jī)熱備,后端集群支持集群拓?fù)涞淖詣?dòng)感知,節(jié)點(diǎn)上下線能自動(dòng)發(fā)現(xiàn),自動(dòng)處理后端故障,自動(dòng)進(jìn)行請(qǐng)求的重試和遷移。
靈活性
主備集群都是可讀可寫,切換迅速,只需切換網(wǎng)關(guān)到另一套配置即可?;厍徐`活,恢復(fù)使用原配置即可。
架構(gòu)圖

.*
網(wǎng)關(guān)程序部署
下載
根據(jù)操作系統(tǒng)和平臺(tái)選擇下面相應(yīng)的安裝包: 解壓到指定目錄:
修改網(wǎng)關(guān)配置
在此?下載?網(wǎng)關(guān)配置,默認(rèn)網(wǎng)關(guān)會(huì)加載配置文件 gateway.yml ,如果要指定其他配置文件使用 -config 選項(xiàng)指定。 網(wǎng)關(guān)配置文件內(nèi)容較多,下面展示必要部分。
PRIMARY_ENDPOINT:配置主集群地址和端口 PRIMARY_USERNAME、PRIMARY_PASSWORD: 訪問主集群的用戶信息 BACKUP_ENDPOINT:配置備集群地址和端口 BACKUP_USERNAME、BACKUP_PASSWORD: 訪問備集群的用戶信息
運(yùn)行網(wǎng)關(guān)
前臺(tái)運(yùn)行?直接運(yùn)行網(wǎng)關(guān)程序即可啟動(dòng)極限網(wǎng)關(guān)了,如下:
后臺(tái)運(yùn)行
卸載服務(wù)
災(zāi)備功能測試
在災(zāi)備場景下,為保證數(shù)據(jù)一致性,對(duì)集群的訪問操作都通過網(wǎng)關(guān)進(jìn)行。注意只有 bulk API 的操作才會(huì)被復(fù)制到備集群。 在此次測試中,網(wǎng)關(guān)災(zāi)備配置功能為:
主備集群正常時(shí)
讀寫請(qǐng)求正常執(zhí)行; 寫請(qǐng)求被記錄到隊(duì)列,備集群實(shí)時(shí)消費(fèi)隊(duì)列數(shù)據(jù)。
當(dāng)主集群故障時(shí)
寫入請(qǐng)求報(bào)錯(cuò),主備集群都不寫入數(shù)據(jù); 查詢請(qǐng)求轉(zhuǎn)到備集群執(zhí)行,并返回結(jié)果給客戶端。
當(dāng)備集群故障時(shí)
讀寫請(qǐng)求都正常執(zhí)行; 寫操作記錄到磁盤隊(duì)列,待備集群恢復(fù)后,自動(dòng)消費(fèi)隊(duì)列數(shù)據(jù)直到兩個(gè)集群一致。
主備集群正常時(shí)寫入、查詢測試
寫入數(shù)據(jù)

查詢數(shù)據(jù)



主備集群都已寫入數(shù)據(jù),且數(shù)據(jù)一致。通過網(wǎng)關(guān)查詢,也正常返回。
刪除和更新文檔

查詢數(shù)據(jù)


兩個(gè)集群都已執(zhí)行刪除和更新操作,數(shù)據(jù)一致。
主集群故障時(shí)寫入、查詢測試
為模擬主集群故障,直接關(guān)閉主集群。
寫入數(shù)據(jù)
寫入數(shù)據(jù)報(bào)錯(cuò)

查詢數(shù)據(jù)

正常查詢到數(shù)據(jù),說明請(qǐng)求被轉(zhuǎn)發(fā)到了備集群執(zhí)行。
備集群故障時(shí)寫入、查詢測試
為模擬備集群故障,直接關(guān)閉備集群。
寫入數(shù)據(jù)

數(shù)據(jù)正常寫入。
查詢數(shù)據(jù)

查詢成功返回。主集群成功寫入了兩條新數(shù)據(jù)。同時(shí)此數(shù)據(jù)會(huì)被記錄到備集群的隊(duì)列中,待備集群恢復(fù)后,會(huì)消費(fèi)此隊(duì)列追數(shù)據(jù)。
恢復(fù)備集群
啟動(dòng)備集群。
查詢數(shù)據(jù)
等待片刻或通過?INFINI Console?確定網(wǎng)關(guān)隊(duì)列消費(fèi)完畢后,查詢備集群的數(shù)據(jù)。 (生產(chǎn)和消費(fèi) offset 相同,說明消費(fèi)完畢。)?

備集群啟動(dòng)后自動(dòng)消費(fèi)隊(duì)列數(shù)據(jù),消費(fèi)完后備集群數(shù)據(jù)達(dá)到與主集群數(shù)據(jù)一致。
災(zāi)備切換
測試了這么多,終于到切換的時(shí)刻了。切換前我們判斷下主系統(tǒng)是否短期無法修復(fù)。?

如果我們判斷主用系統(tǒng)無法短時(shí)間恢復(fù),要執(zhí)行切換。非常簡單,我們直接將配置文件中定義的主備集群互換,然后重啟網(wǎng)關(guān)程序就行了。但我們推薦在相同主機(jī)上另部署一套網(wǎng)關(guān)程序--網(wǎng)關(guān) B,先前那套用網(wǎng)關(guān) A 指代。網(wǎng)關(guān) B 中的配置文件把原備集群定義為主集群,原主集群定義為備集群。若要執(zhí)行切換,我們先停止網(wǎng)關(guān) A,然后啟動(dòng)網(wǎng)關(guān) B,此時(shí)應(yīng)用連接到網(wǎng)關(guān)(端口不變),就把原備系統(tǒng)當(dāng)作主系統(tǒng)使用,把原主系統(tǒng)當(dāng)作備系統(tǒng),也就完成了主備系統(tǒng)的切換。
災(zāi)備回切
當(dāng)原主集群修復(fù)后,正常啟動(dòng),就會(huì)從消費(fèi)隊(duì)列追寫修復(fù)期間產(chǎn)生數(shù)據(jù)直到主備數(shù)據(jù)一致,同樣我們可通過 INFINI Console 查看消費(fèi)的進(jìn)度。如果大家還是擔(dān)心數(shù)據(jù)的一致性,INFINI Console 還能幫大家做校驗(yàn)數(shù)據(jù)任務(wù),做到數(shù)據(jù)完全一致后(文檔數(shù)量及文檔內(nèi)容一致),才進(jìn)行回切。?

回切也非常簡單,停止網(wǎng)關(guān) B,啟動(dòng)網(wǎng)關(guān) A 即可。
網(wǎng)關(guān)高可用
網(wǎng)關(guān)自帶浮動(dòng) IP 模塊,可進(jìn)行雙機(jī)熱備。客戶端通過 VIP 連接網(wǎng)關(guān),網(wǎng)關(guān)出現(xiàn)故障時(shí),VIP 漂移到備網(wǎng)關(guān)。 視頻教程戳這里。?

這樣的優(yōu)點(diǎn)是簡單,不足是只有一個(gè)網(wǎng)關(guān)在線提供服務(wù)。如果想多個(gè)網(wǎng)關(guān)在線提供服務(wù),則需搭配分布式消息系統(tǒng)一起工作,架構(gòu)如下。?

前端通過負(fù)載均衡將流量分散到多個(gè)在線網(wǎng)關(guān),網(wǎng)關(guān)將消息存入分布式消息系統(tǒng)。此時(shí),網(wǎng)關(guān)可看作無狀態(tài)應(yīng)用,可根據(jù)需要擴(kuò)縮規(guī)模。
以上就是我介紹的 ES 災(zāi)備方案,是不是相當(dāng)靈活了。有問題還是那句話 Call me 。
原文網(wǎng)址:http://www.infinilabs.com/blog/2023/backup-system-with-gateway/