高可用之殤
正開(kāi)心地刷著手機(jī),突然APP無(wú)法使用,正焦急地不知所措時(shí),收到公告:“因施工意外挖斷光纜,某某云數(shù)據(jù)中心故障,導(dǎo)致APP服務(wù)不可用”。
你是否經(jīng)歷過(guò)這種遭遇,或聽(tīng)說(shuō)別人吐槽過(guò)?
在今天的全球化和分布式計(jì)算的大環(huán)境中,無(wú)論是企業(yè)級(jí)應(yīng)用、云計(jì)算服務(wù)還是大規(guī)模網(wǎng)絡(luò)平臺(tái),跨數(shù)據(jù)中心部署變得越來(lái)越重要。
那僅僅是將服務(wù)部署到多個(gè)數(shù)據(jù)中心就解決問(wèn)題了嗎?服務(wù)可以是無(wú)狀態(tài)部署,那么數(shù)據(jù)呢?跨數(shù)據(jù)中心訪問(wèn)數(shù)據(jù)帶來(lái)的延遲顯然會(huì)影響用戶體驗(yàn)。當(dāng)今越來(lái)越多的服務(wù)都用redis來(lái)存儲(chǔ)數(shù)據(jù)或緩存數(shù)據(jù),那么如何將redis部署到不同的數(shù)據(jù)中心,不同數(shù)據(jù)中心的redis又如何進(jìn)行數(shù)據(jù)同步,是很多企業(yè)必然要面臨的問(wèn)題。
數(shù)據(jù)是有狀態(tài)的
我們的服務(wù)都進(jìn)行跨數(shù)據(jù)中心的部署,避免由于數(shù)據(jù)中心故障而影響用戶的事情發(fā)生。我們同樣面臨跨數(shù)據(jù)中心數(shù)據(jù)同步的難題,在經(jīng)過(guò)我們基礎(chǔ)架構(gòu)團(tuán)隊(duì)的努力后,自研了一個(gè)高可用的跨數(shù)據(jù)中心實(shí)時(shí)同步redis數(shù)據(jù)的工具。讓有狀態(tài)的redis數(shù)據(jù)可以在不同的數(shù)據(jù)中心之間進(jìn)行同步,服務(wù)可以訪問(wèn)最近節(jié)點(diǎn)的數(shù)據(jù),極大提高了用戶體驗(yàn)。
我們的愿景是將工具建設(shè)成一個(gè)redis數(shù)據(jù)治理的分布式系統(tǒng),以解決redis數(shù)據(jù)的“水患”問(wèn)題,所以我們將其取名為“鯀禹”,為了簡(jiǎn)單起見(jiàn),我們一般稱(chēng)為“大禹”。
大禹有哪些功能
從產(chǎn)品需求上,對(duì)redis-GunYu和幾個(gè)主流工具進(jìn)行比較
| 功能點(diǎn) | redis-shake/v2 | DTS | xpipe | redis-GunYu |
|---|---|---|---|---|
| 斷點(diǎn)續(xù)傳 | Y(無(wú)本地緩存) | Y | Y | Y |
| 支持分片不對(duì)稱(chēng) | N | Y | N | Y |
| 拓?fù)渥兓?/td> | N | N | N | Y |
| 高可用 | N | N | Y | Y |
| 過(guò)濾 | Y | Y | Y | Y |
| 數(shù)據(jù)一致性 | 最終 | 弱 | 弱 | 最終(分片對(duì)稱(chēng)) + 弱(不對(duì)稱(chēng)) |
大禹還有哪些優(yōu)勢(shì)呢?
-
對(duì)穩(wěn)定性影響更小
- 復(fù)制優(yōu)先級(jí):可指定優(yōu)先從從庫(kù)進(jìn)行復(fù)制或主庫(kù)復(fù)制
- 本地緩存 + 斷點(diǎn)續(xù)傳:最大程度減少對(duì)源端redis的影響
- 可以對(duì)RDB中的大key進(jìn)行拆分同步
- 更低的復(fù)制延遲:在保證一致性的前提下,并發(fā)地進(jìn)行數(shù)據(jù)回放
-
數(shù)據(jù)安全性與高可用
- 本地緩存支持?jǐn)?shù)據(jù)校驗(yàn)
- 工具高可用:支持主從模式,以最新記錄進(jìn)行自主選舉,自動(dòng)和手動(dòng)failover;工具本身P2P架構(gòu),將宕機(jī)影響降低到最小
-
對(duì)redis限制更少
- 支持源和目標(biāo)端不同的redis部署方式,如cluster或單實(shí)例
- 兼容源和目的redis不同版本,支持從redis4.0到redis7.2
-
數(shù)據(jù)一致性策略更加靈活,自動(dòng)切換
- 當(dāng)源端和目標(biāo)端分片信息一致時(shí),采用偽事務(wù)方式批量寫(xiě)入,實(shí)時(shí)更新快照信息,最大可能地保證一致性
- 當(dāng)源端和目標(biāo)端分片不一致時(shí),采用定期更新快照信息
-
運(yùn)維更加友好
- API:可以通過(guò)http API進(jìn)行運(yùn)維操作,如強(qiáng)制全量復(fù)制、同步狀態(tài)、暫停同步等
- 監(jiān)控:監(jiān)控指標(biāo)更豐富,如時(shí)間與空間維度的復(fù)制延遲指標(biāo)
- 數(shù)據(jù)過(guò)濾:可以對(duì)key、db、命令等進(jìn)行過(guò)濾
- 拓?fù)渥兓O(jiān)控:實(shí)時(shí)監(jiān)聽(tīng)源和目標(biāo)端redis拓?fù)渥兏ㄈ缂訙p節(jié)點(diǎn),主從切換等等),以更改一致性策略和調(diào)整其他功能策略
大禹是怎么做數(shù)據(jù)同步的呢

內(nèi)部實(shí)現(xiàn)可以簡(jiǎn)單的看成是上圖的三個(gè)模塊。針對(duì)每一個(gè)源端redis的節(jié)點(diǎn),大禹都會(huì)有一條對(duì)應(yīng)的pipeline,每條pipeline結(jié)構(gòu)如下:
- 輸入端:偽裝成redis slave,從源端redis實(shí)例同步數(shù)據(jù)
- 通道端:本地緩存
- 輸出端:將數(shù)據(jù)寫(xiě)入到目標(biāo)端
大禹也支持高可用部署

大禹節(jié)點(diǎn)之間是P2P架構(gòu),互為主備,每個(gè)pipeline都會(huì)獨(dú)立地選舉緩存數(shù)據(jù)最新的節(jié)點(diǎn)為領(lǐng)導(dǎo)者,由領(lǐng)導(dǎo)者偽裝成redis 從庫(kù),從源端redis節(jié)點(diǎn)同步數(shù)據(jù)再寫(xiě)到目標(biāo)端,同時(shí)將數(shù)據(jù)發(fā)送到此pipeline的跟隨者。這種P2P結(jié)構(gòu),可以將工具本身故障的影響降到最低。
行動(dòng)起來(lái)吧
歡迎大家使用大禹,完善大禹,一起將大禹建設(shè)成一個(gè)完善的數(shù)據(jù)治理解決方案吧。
【請(qǐng)github上點(diǎn)個(gè)star吧】源代碼地址 : https://github.com/mgtv-tech/redis-GunYu