我們開(kāi)源啦

高可用之殤

正開(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ù)同步的呢

image.png

內(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)端

大禹也支持高可用部署

image.png

大禹節(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容