吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分布式系統(tǒng)架構(gòu)設(shè)計中異地多活是什么

數(shù)據(jù)分析與開發(fā) ? 來源:水滴與銀彈 ? 作者:Kaito ? 2021-11-12 09:42 ? 次閱讀

在軟件開發(fā)領(lǐng)域,「異地多活」是分布式系統(tǒng)架構(gòu)設(shè)計的一座高峰,很多人經(jīng)常聽過它,但很少人理解其中的原理。

異地多活到底是什么?為什么需要異地多活?它到底解決了什么問題?究竟是怎么解決的?

這些疑問,想必是每個程序看到異地多活這個名詞時,都想要搞明白的問題。

有幸,我曾經(jīng)深度參與過一個中等互聯(lián)網(wǎng)公司,建設(shè)異地多活系統(tǒng)的設(shè)計與實施過程。所以今天,我就來和你聊一聊異地多活背后的的實現(xiàn)原理。

認真讀完這篇文章,我相信你會對異地多活架構(gòu),有更加深刻的理解。

這篇文章干貨很多,希望你可以耐心讀完。

01 系統(tǒng)可用性

要想理解異地多活,我們需要從架構(gòu)設(shè)計的原則說起。

現(xiàn)如今,我們開發(fā)一個軟件系統(tǒng),對其要求越來越高,如果你了解一些「架構(gòu)設(shè)計」的要求,就知道一個好的軟件架構(gòu)應(yīng)該遵循以下 3 個原則:

高性能

高可用

易擴展

其中,高性能意味著系統(tǒng)擁有更大流量的處理能力,更低的響應(yīng)延遲。例如 1 秒可處理 10W 并發(fā)請求,接口響應(yīng)時間 5 ms 等等。

易擴展表示系統(tǒng)在迭代新功能時,能以最小的代價去擴展,系統(tǒng)遇到流量壓力時,可以在不改動代碼的前提下,去擴容系統(tǒng)。

而「高可用」這個概念,看起來很抽象,怎么理解它呢?通常用 2 個指標來衡量:

平均故障間隔 MTBF(Mean Time Between Failure):表示兩次故障的間隔時間,也就是系統(tǒng)「正常運行」的平均時間,這個時間越長,說明系統(tǒng)穩(wěn)定性越高

故障恢復(fù)時間 MTTR(Mean Time To Repair):表示系統(tǒng)發(fā)生故障后「恢復(fù)的時間」,這個值越小,故障對用戶的影響越小

可用性與這兩者的關(guān)系:

可用性(Availability)= MTBF / (MTBF + MTTR) * 100%

這個公式得出的結(jié)果是一個「比例」,通常我們會用「N 個 9」來描述一個系統(tǒng)的可用性。

c35d7f80-427c-11ec-b939-dac502259ad0.png

從這張圖你可以看到,要想達到 4 個 9 以上的可用性,平均每天故障時間必須控制在 10 秒以內(nèi)。

也就是說,只有故障的時間「越短」,整個系統(tǒng)的可用性才會越高,每提升 1 個 9,都會對系統(tǒng)提出更高的要求。

我們都知道,系統(tǒng)發(fā)生故障其實是不可避免的,尤其是規(guī)模越大的系統(tǒng),發(fā)生問題的概率也越大。這些故障一般體現(xiàn)在 3 個方面:

硬件故障:CPU、內(nèi)存、磁盤、網(wǎng)卡、交換機、路由器

軟件問題:代碼 Bug、版本迭代

不可抗力:地震、水災(zāi)、火災(zāi)、戰(zhàn)爭

這些風(fēng)險隨時都有可能發(fā)生。所以,在面對故障時,我們的系統(tǒng)能否以「最快」的速度恢復(fù),就成為了可用性的關(guān)鍵。

可如何做到快速恢復(fù)呢?

這篇文章要講的「異地多活」架構(gòu),就是為了解決這個問題,而提出的高效解決方案。

下面,我會從一個最簡單的系統(tǒng)出發(fā),帶你一步步演化出一個支持「異地多活」的系統(tǒng)架構(gòu)。

在這個過程中,你會看到一個系統(tǒng)會遇到哪些可用性問題,以及為什么架構(gòu)要這樣演進,從而理解異地多活架構(gòu)的意義。

02 單機架構(gòu)

我們從最簡單的開始講起。

假設(shè)你的業(yè)務(wù)處于起步階段,體量非常小,那你的架構(gòu)是這樣的:

這個架構(gòu)模型非常簡單,客戶端請求進來,業(yè)務(wù)應(yīng)用讀寫數(shù)據(jù)庫,返回結(jié)果,非常好理解。

但需要注意的是,這里的數(shù)據(jù)庫是「單機」部署的,所以它有一個致命的缺點:一旦遭遇意外,例如磁盤損壞、操作系統(tǒng)異常、誤刪數(shù)據(jù),那這意味著所有數(shù)據(jù)就全部「丟失」了,這個損失是巨大的。

如何避免這個問題呢?我們很容易想到一個方案:備份。

你可以對數(shù)據(jù)做備份,把數(shù)據(jù)庫文件「定期」cp 到另一臺機器上,這樣,即使原機器丟失數(shù)據(jù),你依舊可以通過備份把數(shù)據(jù)「恢復(fù)」回來,以此保證數(shù)據(jù)安全。

這個方案實施起來雖然比較簡單,但存在 2 個問題:

恢復(fù)需要時間:業(yè)務(wù)需先停機,再恢復(fù)數(shù)據(jù),停機時間取決于恢復(fù)的速度,恢復(fù)期間服務(wù)「不可用」

數(shù)據(jù)不完整:因為是定期備份,數(shù)據(jù)肯定不是「最新」的,數(shù)據(jù)完整程度取決于備份的周期

很明顯,你的數(shù)據(jù)庫越大,意味故障恢復(fù)時間越久。那按照前面我們提到的「高可用」標準,這個方案可能連 1 個 9 都達不到,遠遠無法滿足我們對可用性的要求。

那有什么更好的方案,既可以快速恢復(fù)業(yè)務(wù)?還能盡可能保證數(shù)據(jù)完整性呢?

這時你可以采用這個方案:主從副本。

03 主從副本

你可以在另一臺機器上,再部署一個數(shù)據(jù)庫實例,讓這個新實例成為原實例的「副本」,讓兩者保持「實時同步」,就像這樣:

我們一般把原實例叫作主庫(master),新實例叫作從庫(slave)。這個方案的優(yōu)點在于:

數(shù)據(jù)完整性高:主從副本實時同步,數(shù)據(jù)「差異」很小

抗故障能力提升:主庫有任何異常,從庫可隨時「切換」為主庫,繼續(xù)提供服務(wù)

讀性能提升:業(yè)務(wù)應(yīng)用可直接讀從庫,分擔主庫「壓力」讀壓力

這個方案不錯,不僅大大提高了數(shù)據(jù)庫的可用性,還提升了系統(tǒng)的讀性能。

同樣的思路,你的「業(yè)務(wù)應(yīng)用」也可以在其它機器部署一份,避免單點。因為業(yè)務(wù)應(yīng)用通常是「無狀態(tài)」的(不像數(shù)據(jù)庫那樣存儲數(shù)據(jù)),所以直接部署即可,非常簡單。

因為業(yè)務(wù)應(yīng)用部署了多個,所以你現(xiàn)在還需要部署一個「接入層」,來做請求的「負載均衡」(一般會使用 nginx 或 LVS),這樣當一臺機器宕機后,另一臺機器也可以「接管」所有流量,持續(xù)提供服務(wù)。

從這個方案你可以看出,提升可用性的關(guān)鍵思路就是:冗余。

沒錯,擔心一個實例故障,那就部署多個實例,擔心一個機器宕機,那就部署多臺機器。

到這里,你的架構(gòu)基本已演變成主流方案了,之后開發(fā)新的業(yè)務(wù)應(yīng)用,都可以按照這種模式去部署。

但這種方案還有什么風(fēng)險嗎?

04 風(fēng)險不可控

現(xiàn)在讓我們把視角下放,把焦點放到具體的「部署細節(jié)」上來。

按照前面的分析,為了避免單點故障,你的應(yīng)用雖然部署了多臺機器,但這些機器的分布情況,我們并沒有去深究。

而一個機房有很多服務(wù)器,這些服務(wù)器通常會分布在一個個「機柜」上,如果你使用的這些機器,剛好在一個機柜,還是存在風(fēng)險。

如果恰好連接這個機柜的交換機 / 路由器發(fā)生故障,那么你的應(yīng)用依舊有「不可用」的風(fēng)險。

雖然交換機 / 路由器也做了路線冗余,但不能保證一定不出問題。

部署在一個機柜有風(fēng)險,那把這些機器打散,分散到不同機柜上,是不是就沒問題了?

這樣確實會大大降低出問題的概率。但我們依舊不能掉以輕心,因為無論怎么分散,它們總歸還是在一個相同的環(huán)境下:機房。

那繼續(xù)追問,機房會不會發(fā)生故障呢?

一般來講,建設(shè)一個機房的要求其實是很高的,地理位置、溫濕度控制、備用電源等等,機房廠商會在各方面做好防護。但即使這樣,我們每隔一段時間還會看到這樣的新聞:

2015 年 5 月 27 日,杭州市某地光纖被挖斷,近 3 億用戶長達 5 小時無法訪問支付寶

2021 年 7 月 13 日,B 站部分服務(wù)器機房發(fā)生故障,造成整站持續(xù) 3 個小時無法訪問

2021 年 10 月 9 日,富途證券服務(wù)器機房發(fā)生電力閃斷故障,造成用戶 2 個小時無法登陸、交易

...

可見,即使機房級別的防護已經(jīng)做得足夠好,但只要有「概率」出問題,那現(xiàn)實情況就有可能發(fā)生。雖然概率很小,但一旦真的發(fā)生,影響之大可見一斑。

看到這里你可能會想,機房出現(xiàn)問題的概率也太小了吧,工作了這么多年,也沒讓我碰上一次,有必要考慮得這么復(fù)雜嗎?

但你有沒有思考這樣一個問題:不同體量的系統(tǒng),它們各自關(guān)注的重點是什么?

體量很小的系統(tǒng),它會重點關(guān)注「用戶」規(guī)模、增長,這個階段獲取用戶是一切。等用戶體量上來了,這個階段會重點關(guān)注「性能」,優(yōu)化接口響應(yīng)時間、頁面打開速度等等,這個階段更多是關(guān)注用戶體驗。

等體量再大到一定規(guī)模后你會發(fā)現(xiàn),「可用性」就變得尤為重要。像微信、支付寶這種全民級的應(yīng)用,如果機房發(fā)生一次故障,那整個影響范圍可以說是非常巨大的。

所以,再小概率的風(fēng)險,我們在提高系統(tǒng)可用性時,也不能忽視。

分析了風(fēng)險,再說回我們的架構(gòu)。那到底該怎么應(yīng)對機房級別的故障呢?

沒錯,還是冗余。

05 同城災(zāi)備

想要抵御「機房」級別的風(fēng)險,那應(yīng)對方案就不能局限在一個機房內(nèi)了。

現(xiàn)在,你需要做機房級別的冗余方案,也就是說,你需要再搭建一個機房,來部署你的服務(wù)。

簡單起見,你可以在「同一個城市」再搭建一個機房,原機房我們叫作 A 機房,新機房叫 B 機房,這兩個機房的網(wǎng)絡(luò)用一條「專線」連通。

有了新機房,怎么把它用起來呢?這里還是要優(yōu)先考慮「數(shù)據(jù)」風(fēng)險。

為了避免 A 機房故障導(dǎo)致數(shù)據(jù)丟失,所以我們需要把數(shù)據(jù)在 B 機房也存一份。最簡單的方案還是和前面提到的一樣:備份。

A 機房的數(shù)據(jù),定時在 B 機房做備份(拷貝數(shù)據(jù)文件),這樣即使整個 A 機房遭到嚴重的損壞,B 機房的數(shù)據(jù)不會丟,通過備份可以把數(shù)據(jù)「恢復(fù)」回來,重啟服務(wù)。

這種方案,我們稱之為「冷備」。為什么叫冷備呢?因為 B 機房只做備份,不提供實時服務(wù),它是冷的,只會在 A 機房故障時才會啟用。

但備份的問題依舊和之前描述的一樣:數(shù)據(jù)不完整、恢復(fù)數(shù)據(jù)期間業(yè)務(wù)不可用,整個系統(tǒng)的可用性還是無法得到保證。

所以,我們還是需要用「主從副本」的方式,在 B 機房部署 A 機房的數(shù)據(jù)副本,架構(gòu)就變成了這樣:

這樣,就算整個 A 機房掛掉,我們在 B 機房也有比較「完整」的數(shù)據(jù)。

數(shù)據(jù)是保住了,但這時你需要考慮另外一個問題:如果 A 機房真掛掉了,要想保證服務(wù)不中斷,你還需要在 B 機房「緊急」做這些事情:

B 機房所有從庫提升為主庫

在 B 機房部署應(yīng)用,啟動服務(wù)

部署接入層,配置轉(zhuǎn)發(fā)規(guī)則

DNS 指向 B 機房,接入流量,業(yè)務(wù)恢復(fù)

看到了么?A 機房故障后,B 機房需要做這么多工作,你的業(yè)務(wù)才能完全「恢復(fù)」過來。

你看,整個過程需要人為介入,且需花費大量時間來操作,恢復(fù)之前整個服務(wù)還是不可用的,這個方案還是不太爽,如果能做到故障后立即「切換」,那就好了。

因此,要想縮短業(yè)務(wù)恢復(fù)的時間,你必須把這些工作在 B 機房「提前」做好,也就是說,你需要在 B 機房提前部署好接入層、業(yè)務(wù)應(yīng)用,等待隨時切換。架構(gòu)就變成了這樣:

這樣的話,A 機房整個掛掉,我們只需要做 2 件事即可:

B 機房所有從庫提升為主庫

DNS 指向 B 機房,接入流量,業(yè)務(wù)恢復(fù)

這樣一來,恢復(fù)速度快了很多。

到這里你會發(fā)現(xiàn),B 機房從最開始的「空空如也」,演變到現(xiàn)在,幾乎是「鏡像」了一份 A 機房的所有東西,從最上層的接入層,到中間的業(yè)務(wù)應(yīng)用,到最下層的存儲。

兩個機房唯一的區(qū)別是,A 機房的存儲都是主庫,而 B 機房都是從庫。

這種方案,我們把它叫做「熱備」。

熱的意思是指,B 機房處于「待命」狀態(tài),A 故障后 B 可以隨時「接管」流量,繼續(xù)提供服務(wù)。熱備相比于冷備最大的優(yōu)點是:隨時可切換。

無論是冷備還是熱備,因為它們都處于「備用」狀態(tài),所以我們把這兩個方案統(tǒng)稱為:同城災(zāi)備。

同城災(zāi)備的最大優(yōu)勢在于,我們再也不用擔心「機房」級別的故障了,一個機房發(fā)生風(fēng)險,我們只需把流量切換到另一個機房即可,可用性再次提高,是不是很爽?(后面還有更爽的)

06 同城雙活

我們繼續(xù)來看這個架構(gòu)。

雖然我們有了應(yīng)對機房故障的解決方案,但這里有個問題是我們不能忽視的:A 機房掛掉,全部流量切到 B 機房,B 機房能否真的如我們所愿,正常提供服務(wù)?

這是個值得思考的問題。

這就好比有兩支軍隊 A 和 B,A 軍隊歷經(jīng)沙場,作戰(zhàn)經(jīng)驗豐富,而 B 軍隊只是后備軍,除了有軍人的基本素養(yǎng)之外,并沒有實戰(zhàn)經(jīng)驗,戰(zhàn)斗經(jīng)驗基本為 0。

如果 A 軍隊喪失戰(zhàn)斗能力,需要 B 軍隊立即頂上時,作為指揮官的你,肯定也會擔心 B 軍隊能否真的擔此重任吧?

我們的架構(gòu)也是如此,此時的 B 機房雖然是隨時「待命」狀態(tài),但 A 機房真的發(fā)生故障,我們要把全部流量切到 B 機房,其實是不敢百分百保證它可以「如期」工作的。

你想,我們在一個機房內(nèi)部署服務(wù),還總是發(fā)生各種各樣的問題,例如:發(fā)布應(yīng)用的版本不一致、系統(tǒng)資源不足、操作系統(tǒng)參數(shù)不一樣等等?,F(xiàn)在多部署一個機房,這些問題只會增多,不會減少。

另外,從「成本」的角度來看,我們新部署一個機房,需要購買服務(wù)器、內(nèi)存、硬盤、帶寬資源,花費成本也是非常高昂的,只讓它當一個后備軍,未免也太「大材小用」了!

因此,我們需要讓 B 機房也接入流量,實時提供服務(wù),這樣做的好處,一是可以實時訓(xùn)練這支后備軍,讓它達到與 A 機房相同的作戰(zhàn)水平,隨時可切換,二是 B 機房接入流量后,可以分擔 A 機房的流量壓力。這才是把 B 機房資源優(yōu)勢,發(fā)揮最大化的最好方案!

那怎么讓 B 機房也接入流量呢?很簡單,就是把 B 機房的接入層 IP 地址,加入到 DNS 中,這樣,B 機房從上層就可以有流量進來了。

但這里有一個問題:別忘了,B 機房的存儲,現(xiàn)在可都是 A 機房的「從庫」,從庫默認可都是「不可寫」的,B 機房的寫請求打到本機房存儲上,肯定會報錯,這還是不符合我們預(yù)期。怎么辦?

這時,你就需要在「業(yè)務(wù)應(yīng)用」層做改造了。

你的業(yè)務(wù)應(yīng)用在操作數(shù)據(jù)庫時,需要區(qū)分「讀寫分離」(一般用中間件實現(xiàn)),即兩個機房的「讀」流量,可以讀任意機房的存儲,但「寫」流量,只允許寫 A 機房,因為主庫在 A 機房。

這會涉及到你用的所有存儲,例如項目中用到了 MySQL、Redis、MongoDB 等等,操作這些數(shù)據(jù)庫,都需要區(qū)分讀寫請求,所以這塊需要一定的業(yè)務(wù)「改造」成本。

因為 A 機房的存儲都是主庫,所以我們把 A 機房叫做「主機房」,B 機房叫「從機房」。

兩個機房部署在「同城」,物理距離比較近,而且兩個機房用「專線」網(wǎng)絡(luò)連接,雖然跨機房訪問的延遲,比單個機房內(nèi)要大一些,但整體的延遲還是可以接受的。

業(yè)務(wù)改造完成后,B 機房可以慢慢接入流量,從 10%、30%、50% 逐漸覆蓋到 100%,你可以持續(xù)觀察 B 機房的業(yè)務(wù)是否存在問題,有問題及時修復(fù),逐漸讓 B 機房的工作能力,達到和 A 機房相同水平。

現(xiàn)在,因為 B 機房實時接入了流量,此時如果 A 機房掛了,那我們就可以「大膽」地把 A 的流量,全部切換到 B 機房,完成快速切換!

到這里你可以看到,我們部署的 B 機房,在物理上雖然與 A 有一定距離,但整個系統(tǒng)從「邏輯」上來看,我們是把這兩個機房看做一個「整體」來規(guī)劃的,也就是說,相當于把 2 個機房當作 1 個機房來用。

這種架構(gòu)方案,比前面的同城災(zāi)備更「進了一步」,B 機房實時接入了流量,還能應(yīng)對隨時的故障切換,這種方案我們把它叫做「同城雙活」。

因為兩個機房都能處理業(yè)務(wù)請求,這對我們系統(tǒng)的內(nèi)部維護、改造、升級提供了更多的可實施空間(流量隨時切換),現(xiàn)在,整個系統(tǒng)的彈性也變大了,是不是更爽了?

那這種架構(gòu)有什么問題呢?

07 兩地三中心

還是回到風(fēng)險上來說。

雖然我們把 2 個機房當做一個整體來規(guī)劃,但這 2 個機房在物理層面上,還是處于「一個城市」內(nèi),如果是整個城市發(fā)生自然災(zāi)害,例如地震、水災(zāi)(河南水災(zāi)剛過去不久),那 2 個機房依舊存在「全局覆沒」的風(fēng)險。

真是防不勝防啊?怎么辦?沒辦法,繼續(xù)冗余。

但這次冗余機房,就不能部署在同一個城市了,你需要把它放到距離更遠的地方,部署在「異地」。

通常建議兩個機房的距離要在 1000 公里以上,這樣才能應(yīng)對城市級別的災(zāi)難。

假設(shè)之前的 A、B 機房在北京,那這次新部署的 C 機房可以放在上海。

按照前面的思路,把 C 機房用起來,最簡單粗暴的方案還就是做「冷備」,即定時把 A、B 機房的數(shù)據(jù),在 C 機房做備份,防止數(shù)據(jù)丟失。

這種方案,就是我們經(jīng)常聽到的「兩地三中心」。

兩地是指 2 個城市,三中心是指有 3 個機房,其中 2 個機房在同一個城市,并且同時提供服務(wù),第 3 個機房部署在異地,只做數(shù)據(jù)災(zāi)備。

這種架構(gòu)方案,通常用在銀行、金融、政企相關(guān)的項目中。它的問題還是前面所說的,啟用災(zāi)備機房需要時間,而且啟用后的服務(wù),不確定能否如期工作。

所以,要想真正的抵御城市級別的故障,越來越多的互聯(lián)網(wǎng)公司,開始實施「異地雙活」。

08 偽異地雙活

這里,我們還是分析 2 個機房的架構(gòu)情況。我們不再把 A、B 機房部署在同一個城市,而是分開部署,例如 A 機房放在北京,B 機房放在上海。

前面我們講了同城雙活,那異地雙活是不是直接「照搬」同城雙活的模式去部署就可以了呢?

事情沒你想的那么簡單。

如果還是按照同城雙活的架構(gòu)來部署,那異地雙活的架構(gòu)就是這樣的:

注意看,兩個機房的網(wǎng)絡(luò)是通過「跨城專線」連通的。

此時兩個機房都接入流量,那上海機房的請求,可能要去讀寫北京機房的存儲,這里存在一個很大的問題:網(wǎng)絡(luò)延遲。

因為兩個機房距離較遠,受到物理距離的限制,現(xiàn)在,兩地之間的網(wǎng)絡(luò)延遲就變成了「不可忽視」的因素了。

北京到上海的距離大約 1300 公里,即使架設(shè)一條高速的「網(wǎng)絡(luò)專線」,光纖以光速傳輸,一個來回也需要近 10ms 的延遲。

況且,網(wǎng)絡(luò)線路之間還會經(jīng)歷各種路由器、交換機等網(wǎng)絡(luò)設(shè)備,實際延遲可能會達到 30ms ~ 100ms,如果網(wǎng)絡(luò)發(fā)生抖動,延遲甚至?xí)_到 1 秒。

不止是延遲,遠距離的網(wǎng)絡(luò)專線質(zhì)量,是遠遠達不到機房內(nèi)網(wǎng)絡(luò)質(zhì)量的,專線網(wǎng)絡(luò)經(jīng)常會發(fā)生延遲、丟包、甚至中斷的情況。總之,不能過度信任和依賴「跨城專線」。

你可能會問,這點延遲對業(yè)務(wù)影響很大嗎?影響非常大!

試想,一個客戶端請求打到上海機房,上海機房要去讀寫北京機房的存儲,一次跨機房訪問延遲就達到了 30ms,這大致是機房內(nèi)網(wǎng)網(wǎng)絡(luò)(0.5 ms)訪問速度的 60 倍(30ms / 0.5ms),一次請求慢 60 倍,來回往返就要慢 100 倍以上。

而我們在 App 打開一個頁面,可能會訪問后端幾十個 API,每次都跨機房訪問,整個頁面的響應(yīng)延遲有可能就達到了秒級,這個性能簡直慘不忍睹,難以接受。

看到了么,雖然我們只是簡單的把機房部署在了「異地」,但「同城雙活」的架構(gòu)模型,在這里就不適用了,還是按照這種方式部署,這是「偽異地雙活」!

那如何做到真正的異地雙活呢?

09 真正的異地雙活

既然「跨機房」調(diào)用延遲是不容忽視的因素,那我們只能盡量避免跨機房「調(diào)用」,規(guī)避這個延遲問題。

也就是說,上海機房的應(yīng)用,不能再「跨機房」去讀寫北京機房的存儲,只允許讀寫上海本地的存儲,實現(xiàn)「就近訪問」,這樣才能避免延遲問題。

還是之前提到的問題:上海機房存儲都是從庫,不允許寫入啊,除非我們只允許上海機房接入「讀流量」,不接收「寫流量」,否則無法滿足不再跨機房的要求。

很顯然,只讓上海機房接收讀流量的方案不現(xiàn)實,因為很少有項目是只有讀流量,沒有寫流量的。所以這種方案還是不行,這怎么辦?

此時,你就必須在「存儲層」做改造了。

要想上海機房讀寫本機房的存儲,那上海機房的存儲不能再是北京機房的從庫,而是也要變?yōu)椤钢鲙臁埂?/p>

你沒看錯,兩個機房的存儲必須都是「主庫」,而且兩個機房的數(shù)據(jù)還要「互相同步」數(shù)據(jù),即客戶端無論寫哪一個機房,都能把這條數(shù)據(jù)同步到另一個機房。

因為只有兩個機房都擁有「全量數(shù)據(jù)」,才能支持任意切換機房,持續(xù)提供服務(wù)。

怎么實現(xiàn)這種「雙主」架構(gòu)呢?它們之間如何互相同步數(shù)據(jù)?

如果你對 MySQL 有所了解,MySQL 本身就提供了雙主架構(gòu),它支持雙向復(fù)制數(shù)據(jù),但平時用的并不多。而且 Redis、MongoDB 等數(shù)據(jù)庫并沒有提供這個功能,所以,你必須開發(fā)對應(yīng)的「數(shù)據(jù)同步中間件」來實現(xiàn)雙向同步的功能。

此外,除了數(shù)據(jù)庫這種有狀態(tài)的軟件之外,你的項目通常還會使用到消息隊列,例如 RabbitMQ、Kafka,這些也是有狀態(tài)的服務(wù),所以它們也需要開發(fā)雙向同步的中間件,支持任意機房寫入數(shù)據(jù),同步至另一個機房。

看到了么,這一下子復(fù)雜度就上來了,單單針對每個數(shù)據(jù)庫、隊列開發(fā)同步中間件,就需要投入很大精力了。

業(yè)界也開源出了很多數(shù)據(jù)同步中間件,例如阿里的 Canal、RedisShake、MongoShake,可分別在兩個機房同步 MySQL、Redis、MongoDB 數(shù)據(jù)。

很多有能力的公司,也會采用自研同步中間件的方式來做,例如餓了么、攜程、美團都開發(fā)了自己的同步中間件。

我也有幸參與設(shè)計開發(fā)了 MySQL、Redis/Codis、MongoDB 的同步中間件,有時間寫一篇文章詳細聊聊實現(xiàn)細節(jié),歡迎持續(xù)關(guān)注。:)

現(xiàn)在,整個架構(gòu)就變成了這樣:

注意看,兩個機房的存儲層都互相同步數(shù)據(jù)的。有了數(shù)據(jù)同步中間件,就可以達到這樣的效果:

北京機房寫入 X = 1

上海機房寫入 Y = 2

數(shù)據(jù)通過中間件雙向同步

北京、上海機房都有 X = 1、Y = 2 的數(shù)據(jù)

這里我們用中間件雙向同步數(shù)據(jù),就不用再擔心專線問題,專線出問題,我們的中間件可以自動重試,直到成功,達到數(shù)據(jù)最終一致。

但這里還會遇到一個問題,兩個機房都可以寫,操作的不是同一條數(shù)據(jù)那還好,如果修改的是同一條的數(shù)據(jù),發(fā)生沖突怎么辦?

用戶短時間內(nèi)發(fā)了 2 個修改請求,都是修改同一條數(shù)據(jù)

一個請求落在北京機房,修改 X = 1(還未同步到上海機房)

另一個請求落在上海機房,修改 X = 2(還未同步到北京機房)

兩個機房以哪個為準?

也就是說,在很短的時間內(nèi),同一個用戶修改同一條數(shù)據(jù),兩個機房無法確認誰先誰后,數(shù)據(jù)發(fā)生「沖突」。

這是一個很嚴重的問題,系統(tǒng)發(fā)生故障并不可怕,可怕的是數(shù)據(jù)發(fā)生「錯誤」,因為修正數(shù)據(jù)的成本太高了。我們一定要避免這種情況的發(fā)生。解決這個問題,有 2 個方案。

第一個方案,數(shù)據(jù)同步中間件要有自動「合并」數(shù)據(jù)、解決「沖突」的能力。

這個方案實現(xiàn)起來比較復(fù)雜,要想合并數(shù)據(jù),就必須要區(qū)分出「先后」順序。我們很容易想到的方案,就是以「時間」為標尺,以「后到達」的請求為準。

但這種方案需要兩個機房的「時鐘」嚴格保持一致才行,否則很容易出現(xiàn)問題。例如:

第 1 個請求落到北京機房,北京機房時鐘是 10:01,修改 X = 1

第 2 個請求落到上海機房,上海機房時鐘是 10:00,修改 X = 2

因為北京機房的時間「更晚」,那最終結(jié)果就會是 X = 1。但這里其實應(yīng)該以第 2 個請求為準,X = 2 才對。

可見,完全「依賴」時鐘的沖突解決方案,不太嚴謹。

所以,通常會采用第二種方案,從「源頭」就避免數(shù)據(jù)沖突的發(fā)生。

10 如何實施異地雙活

既然自動合并數(shù)據(jù)的方案實現(xiàn)成本高,那我們就要想,能否從源頭就「避免」數(shù)據(jù)沖突呢?

這個思路非常棒!

從源頭避免數(shù)據(jù)沖突的思路是:在最上層接入流量時,就不要讓沖突的情況發(fā)生。

具體來講就是,要在最上層就把用戶「區(qū)分」開,部分用戶請求固定打到北京機房,其它用戶請求固定打到上海 機房,進入某個機房的用戶請求,之后的所有業(yè)務(wù)操作,都在這一個機房內(nèi)完成,從根源上避免「跨機房」。

所以這時,你需要在接入層之上,再部署一個「路由層」(通常部署在云服務(wù)器上),自己可以配置路由規(guī)則,把用戶「分流」到不同的機房內(nèi)。

但這個路由規(guī)則,具體怎么定呢?有很多種實現(xiàn)方式,最常見的我總結(jié)了 3 類:

按業(yè)務(wù)類型分片

直接哈希分片

按地理位置分片

1、按業(yè)務(wù)類型分片

這種方案是指,按應(yīng)用的「業(yè)務(wù)類型」來劃分。

舉例:假設(shè)我們一共有 4 個應(yīng)用,北京和上海機房都部署這些應(yīng)用。但應(yīng)用 1、2 只在北京機房接入流量,在上海機房只是熱備。應(yīng)用 3、4 只在上海機房接入流量,在北京機房是熱備。

這樣一來,應(yīng)用 1、2 的所有業(yè)務(wù)請求,只讀寫北京機房存儲,應(yīng)用 3、4 的所有請求,只會讀寫上海機房存儲。

這樣按業(yè)務(wù)類型分片,也可以避免同一個用戶修改同一條數(shù)據(jù)。

這里按業(yè)務(wù)類型在不同機房接入流量,還需要考慮多個應(yīng)用之間的依賴關(guān)系,要盡可能的把完成「相關(guān)」業(yè)務(wù)的應(yīng)用部署在同一個機房,避免跨機房調(diào)用。

例如,訂單、支付服務(wù)有依賴關(guān)系,會產(chǎn)生互相調(diào)用,那這 2 個服務(wù)在 A 機房接入流量。社區(qū)、發(fā)帖服務(wù)有依賴關(guān)系,那這 2 個服務(wù)在 B 機房接入流量。

2、直接哈希分片

這種方案就是,最上層的路由層,會根據(jù)用戶 ID 計算「哈希」取模,然后從路由表中找到對應(yīng)的機房,之后把請求轉(zhuǎn)發(fā)到指定機房內(nèi)。

舉例:一共 200 個用戶,根據(jù)用戶 ID 計算哈希值,然后根據(jù)路由規(guī)則,把用戶 1 - 100 路由到北京機房,101 - 200 用戶路由到上海機房,這樣,就避免了同一個用戶修改同一條數(shù)據(jù)的情況發(fā)生。

3、按地理位置分片

這種方案,非常適合與地理位置密切相關(guān)的業(yè)務(wù),例如打車、外賣服務(wù)就非常適合這種方案。

拿外賣服務(wù)舉例,你要點外賣肯定是「就近」點餐,整個業(yè)務(wù)范圍相關(guān)的有商家、用戶、騎手,它們都是在相同的地理位置內(nèi)的。

針對這種特征,就可以在最上層,按用戶的「地理位置」來做分片,分散到不同的機房。

舉例:北京、河北地區(qū)的用戶點餐,請求只會打到北京機房,而上海、浙江地區(qū)的用戶,請求則只會打到上海機房。這樣的分片規(guī)則,也能避免數(shù)據(jù)沖突。

提醒:這 3 種常見的分片規(guī)則,第一次看不太好理解,建議配合圖多理解幾遍。搞懂這 3 個分片規(guī)則,你才能真正明白怎么做異地多活。

總之,分片的核心思路在于,讓同一個用戶的相關(guān)請求,只在一個機房內(nèi)完成所有業(yè)務(wù)「閉環(huán)」,不再出現(xiàn)「跨機房」訪問。

阿里在實施這種方案時,給它起了個名字,叫做「單元化」。

當然,最上層的路由層把用戶分片后,理論來說同一個用戶只會落在同一個機房內(nèi),但不排除程序 Bug 導(dǎo)致用戶會在兩個機房「漂移」。

安全起見,每個機房在寫存儲時,還需要有一套機制,能夠檢測「數(shù)據(jù)歸屬」,應(yīng)用層操作存儲時,需要通過中間件來做「兜底」,避免不該寫本機房的情況發(fā)生。(篇幅限制,這里不展開講,理解思路即可)

現(xiàn)在,兩個機房就可以都接收「讀寫」流量(做好分片的請求),底層存儲保持「雙向」同步,兩個機房都擁有全量數(shù)據(jù),當任意機房故障時,另一個機房就可以「接管」全部流量,實現(xiàn)快速切換,簡直不要太爽。

不僅如此,因為機房部署在異地,我們還可以更細化地「優(yōu)化」路由規(guī)則,讓用戶訪問就近的機房,這樣整個系統(tǒng)的性能也會大大提升。

這里還有一種情況,是無法做數(shù)據(jù)分片的:全局數(shù)據(jù)。例如系統(tǒng)配置、商品庫存這類需要強一致的數(shù)據(jù),這類服務(wù)依舊只能采用寫主機房,讀從機房的方案,不做雙活。

雙活的重點,是要優(yōu)先保證「核心」業(yè)務(wù)先實現(xiàn)雙活,并不是「全部」業(yè)務(wù)實現(xiàn)雙活。

至此,我們才算實現(xiàn)了真正的「異地雙活」!

到這里你可以看出,完成這樣一套架構(gòu),需要投入的成本是巨大的。

路由規(guī)則、路由轉(zhuǎn)發(fā)、數(shù)據(jù)同步中間件、數(shù)據(jù)校驗兜底策略,不僅需要開發(fā)強大的中間件,同時還要業(yè)務(wù)配合改造(業(yè)務(wù)邊界劃分、依賴拆分)等一些列工作,沒有足夠的人力物力,這套架構(gòu)很難實施。

11 異地多活

理解了異地雙活,那「異地多活」顧名思義,就是在異地雙活的基礎(chǔ)上,部署多個機房即可。架構(gòu)變成了這樣:

這些服務(wù)按照「單元化」的部署方式,可以讓每個機房部署在任意地區(qū),隨時擴展新機房,你只需要在最上層定義好分片規(guī)則就好了。

但這里還有一個小問題,隨著擴展的機房越來越多,當一個機房寫入數(shù)據(jù)后,需要同步的機房也越來越多,這個實現(xiàn)復(fù)雜度會比較高。

所以業(yè)界又把這一架構(gòu)又做了進一步優(yōu)化,把「網(wǎng)狀」架構(gòu)升級為「星狀」:

這種方案必須設(shè)立一個「中心機房」,任意機房寫入數(shù)據(jù)后,都只同步到中心機房,再由中心機房同步至其它機房。

這樣做的好處是,一個機房寫入數(shù)據(jù),只需要同步數(shù)據(jù)到中心機房即可,不需要再關(guān)心一共部署了多少個機房,實現(xiàn)復(fù)雜度大大「簡化」。

但與此同時,這個中心機房的「穩(wěn)定性」要求會比較高。不過也還好,即使中心機房發(fā)生故障,我們也可以把任意一個機房,提升為中心機房,繼續(xù)按照之前的架構(gòu)提供服務(wù)。

至此,我們的系統(tǒng)徹底實現(xiàn)了「異地多活」!

多活的優(yōu)勢在于,可以任意擴展機房「就近」部署。任意機房發(fā)生故障,可以完成快速「切換」,大大提高了系統(tǒng)的可用性。

同時,我們也再也不用擔心系統(tǒng)規(guī)模的增長,因為這套架構(gòu)具有極強的「擴展能力」。

怎么樣?我們從一個最簡單的應(yīng)用,一路優(yōu)化下來,到最終的架構(gòu)方案,有沒有幫你徹底理解異地多活呢?

總結(jié)

好了,總結(jié)一下這篇文章的重點。

1、一個好的軟件架構(gòu),應(yīng)該遵循高性能、高可用、易擴展 3 大原則,其中「高可用」在系統(tǒng)規(guī)模變得越來越大時,變得尤為重要

2、系統(tǒng)發(fā)生故障并不可怕,能以「最快」的速度恢復(fù),才是高可用追求的目標,異地多活是實現(xiàn)高可用的有效手段

3、提升高可用的核心是「冗余」,備份、主從副本、同城災(zāi)備、同城雙活、兩地三中心、異地雙活,異地多活都是在做冗余

4、同城災(zāi)備分為「冷備」和「熱備」,冷備只備份數(shù)據(jù),不提供服務(wù),熱備實時同步數(shù)據(jù),并做好隨時切換的準備

5、同城雙活比災(zāi)備的優(yōu)勢在于,兩個機房都可以接入「讀寫」流量,提高可用性的同時,還提升了系統(tǒng)性能。雖然物理上是兩個機房,但「邏輯」上還是當做一個機房來用

6、兩地三中心是在同城雙活的基礎(chǔ)上,額外部署一個異地機房做「災(zāi)備」,用來抵御「城市」級別的災(zāi)害,但啟用災(zāi)備機房需要時間

7、異地雙活才是抵御「城市」級別災(zāi)害的更好方案,兩個機房同時提供服務(wù),故障隨時可切換,可用性高。但實現(xiàn)也最復(fù)雜,理解了異地雙活,才能徹底理解異地多活

8、異地多活是在異地雙活的基礎(chǔ)上,任意擴展多個機房,不僅又提高了可用性,還能應(yīng)對更大規(guī)模的流量的壓力,擴展性最強,是實現(xiàn)高可用的最終方案

后記

這篇文章我從「宏觀」層面,向你介紹了異地多活架構(gòu)的「核心」思路,整篇文章的信息量還是很大的,如果不太好理解,我建議你多讀幾遍。

因為篇幅限制,很多細節(jié)我并沒有展開來講。這篇文章更像是講異地多活的架構(gòu)之「道」,而真正實施的「術(shù)」,要考慮的點其實也非常繁多,因為它需要開發(fā)強大的「基礎(chǔ)設(shè)施」才可以完成實施。

不僅如此,要想真正實現(xiàn)異地多活,還需要遵循一些原則,例如業(yè)務(wù)梳理、業(yè)務(wù)分級、數(shù)據(jù)分類、數(shù)據(jù)最終一致性保障、機房切換一致性保障、異常處理等等。同時,相關(guān)的運維設(shè)施、監(jiān)控體系也要能跟得上才行。

宏觀上需要考慮業(yè)務(wù)(微服務(wù)部署、依賴、拆分、SDK、Web 框架)、基礎(chǔ)設(shè)施(服務(wù)發(fā)現(xiàn)、流量調(diào)度、持續(xù)集成、同步中間件、自研存儲),微觀上要開發(fā)各種中間件,還要關(guān)注中間件的高性能、高可用、容錯能力,其復(fù)雜度之高,只有親身參與過之后才知道。

我曾經(jīng)有幸參與過,存儲層同步中間件的設(shè)計與開發(fā),實現(xiàn)過「跨機房」同步 MySQL、Redis、MongoDB 的中間件,踩過的坑也非常多。當然,這些中間件的設(shè)計思路也非常有意思,有時間單獨分享一下這些中間件的設(shè)計思路。

值得提醒你的是,只有真正理解了「異地雙活」,才能徹底理解「異地多活」。在我看來,從同城雙活演變?yōu)楫惖仉p活的過程,是最為復(fù)雜的,最核心的東西包括,業(yè)務(wù)單元化劃分、存儲層數(shù)據(jù)雙向同步、最上層的分片邏輯,這些是實現(xiàn)異地多活的重中之重。

希望我分享的架構(gòu)經(jīng)驗,對你有所啟發(fā)。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 分布式
    +關(guān)注

    關(guān)注

    1

    文章

    924

    瀏覽量

    74610
  • 架構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    519

    瀏覽量

    25551

原文標題:搞懂異地多活,看這篇就夠了

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于ptp的分布式系統(tǒng)設(shè)計

    。 PTP概述 PTP是一種網(wǎng)絡(luò)時間同步協(xié)議,它允許網(wǎng)絡(luò)的設(shè)備同步它們的時鐘。PTP基于IEEE 1588標準,旨在提供亞微秒級別的時間同步精度。PTP通過在網(wǎng)絡(luò)傳播時間信息,并使用這些信息來校正本地時鐘,從而實現(xiàn)精確的時間同步。
    的頭像 發(fā)表于 12-29 10:09 ?165次閱讀

    分布式、域控及SOA架構(gòu)車身功能測試方案

    北匯信息推出分布式、域控以及SOA架構(gòu)的車身功能測試解決方案,支持在實驗室環(huán)境下完成車身單部件、系統(tǒng)級功能自動化測試,可以極大地提升車身功能的可靠性和穩(wěn)定性。
    的頭像 發(fā)表于 12-27 09:05 ?1659次閱讀
    <b class='flag-5'>分布式</b>、域控及SOA<b class='flag-5'>架構(gòu)</b>車身功能測試方案

    HarmonyOS Next 應(yīng)用元服務(wù)開發(fā)-分布式數(shù)據(jù)對象遷移數(shù)據(jù)權(quán)限與基礎(chǔ)數(shù)據(jù)

    提供了async版本供該場景使用。 當前,wantParams“sessionId”字段在遷移流程中被系統(tǒng)占用,建議開發(fā)者在wantParams定義其他key值存儲該分布式數(shù)據(jù)對象
    發(fā)表于 12-24 09:40

    安科瑞Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在8.3MWp分布式光伏發(fā)電的應(yīng)用

    安科瑞分布式光伏監(jiān)控系統(tǒng)在上海汽車變速器有限公司 8.3MWp分布式光伏發(fā)電項目中的應(yīng)用
    發(fā)表于 12-16 15:03 ?0次下載

    分布式輸電線路故障定位分布式是指什么

    所謂分布式指的是產(chǎn)品的部署方式,是相對于集中式而言的。 一、部署方式 分散安裝:分布式輸電線路故障定位系統(tǒng)的采集裝置需要安裝在輸電線路的多個位置,通常是每隔一定距離設(shè)置一個監(jiān)測點,以
    的頭像 發(fā)表于 10-16 11:39 ?340次閱讀
    <b class='flag-5'>分布式</b>輸電線路故障定位<b class='flag-5'>中</b>的<b class='flag-5'>分布式</b>是指什么

    TI PLCLite在分布式太陽能并網(wǎng)通信系統(tǒng)的應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《TI PLCLite在分布式太陽能并網(wǎng)通信系統(tǒng)的應(yīng)用.pdf》資料免費下載
    發(fā)表于 09-26 09:07 ?0次下載
    TI PLCLite在<b class='flag-5'>分布式</b>太陽能并網(wǎng)通信<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>中</b>的應(yīng)用

    一體式IO與分布式IO:工業(yè)控制系統(tǒng)的兩種架構(gòu)

    一體式IO與分布式IO架構(gòu)各有優(yōu)勢和局限性。選擇合適的IO架構(gòu)需要根據(jù)實際的生產(chǎn)需求、系統(tǒng)規(guī)模、成本預(yù)算和維護能力綜合考慮。隨著工業(yè)自動化技術(shù)的發(fā)展,
    的頭像 發(fā)表于 07-17 16:12 ?1188次閱讀
    一體式IO與<b class='flag-5'>分布式</b>IO:工業(yè)控制<b class='flag-5'>系統(tǒng)</b>的兩種<b class='flag-5'>架構(gòu)</b>

    分布式SCADA系統(tǒng)的特點的組成

    在工業(yè)自動化和能源管理領(lǐng)域,SCADA(Supervisory Control And Data Acquisition)系統(tǒng)扮演著至關(guān)重要的角色。其中,分布式SCADA系統(tǒng)憑借其獨特的結(jié)構(gòu)和功能
    的頭像 發(fā)表于 06-07 14:43 ?608次閱讀

    訊維分布式KVM坐席管理系統(tǒng)在數(shù)據(jù)中心管理的應(yīng)用與案例分析

    訊維分布式KVM坐席管理系統(tǒng)在數(shù)據(jù)中心管理的應(yīng)用,極大地提高了數(shù)據(jù)中心的運維效率和安全性。該系統(tǒng)通過其獨特的分布式
    的頭像 發(fā)表于 05-16 16:27 ?568次閱讀

    分布式能源是什么意思?分布式能源有什么優(yōu)勢?

    分布式能源指的是在用戶端或靠近用戶端的小型能源供應(yīng)系統(tǒng),它能夠直接滿足用戶的多種能源需求,如電力、熱能和冷能。
    的頭像 發(fā)表于 04-29 17:26 ?2495次閱讀

    分布式光伏監(jiān)控系統(tǒng)解決方案

    分布式光伏發(fā)電系統(tǒng)的發(fā)電量,提高分布式光伏發(fā)電系統(tǒng)的利用率。發(fā)展分布式光伏發(fā)電對優(yōu)化能源結(jié)構(gòu)、實現(xiàn)“雙碳目標”、推動節(jié)能減排、實現(xiàn)經(jīng)濟可持續(xù)
    的頭像 發(fā)表于 04-22 15:56 ?1080次閱讀
    <b class='flag-5'>分布式</b>光伏監(jiān)控<b class='flag-5'>系統(tǒng)</b>解決方案

    HarmonyOS實戰(zhàn)案例:【分布式賬本】

    Demo基于Open Harmony系統(tǒng)使用ETS語言進行編寫,本Demo主要通過設(shè)備認證、分布式拉起、分布式數(shù)據(jù)管理等功能來實現(xiàn)。
    的頭像 發(fā)表于 04-12 16:40 ?1392次閱讀
    HarmonyOS實戰(zhàn)案例:【<b class='flag-5'>分布式</b>賬本】

    分布式KVM坐席管理系統(tǒng):打造智慧化城市運營新引擎

    訊維分布式KVM坐席管理系統(tǒng),以其獨特的分布式架構(gòu)和智能化管理特性,正在成為智慧化城市運營的新引擎。該系統(tǒng)通過高效的信息共享和處理,不僅提升
    的頭像 發(fā)表于 03-18 16:15 ?635次閱讀

    分布式系統(tǒng)在交通監(jiān)控工程的創(chuàng)新應(yīng)用案例

    應(yīng)用,為交通管理帶來了革命性的改變。 在某大型城市的交通監(jiān)控工程,訊維分布式系統(tǒng)成功應(yīng)用,實現(xiàn)了對全市交通監(jiān)控設(shè)備的統(tǒng)一接入和管理。通過該系統(tǒng)
    的頭像 發(fā)表于 03-18 16:14 ?579次閱讀

    Redis實現(xiàn)分布式規(guī)則限流的方式介紹

    市面上很多介紹 Redis 如何實現(xiàn)限流的,但是大部分都有一個缺點,就是只能實現(xiàn)單一的限流,比如 1 分鐘訪問 1 次或者 60 分鐘訪問 10 次這種,但是如果想一個接口兩種規(guī)則都需要滿足呢,我們的項目又是分布式項目,應(yīng)該如何解決,下面就介紹一下 Redis 實現(xiàn)分布式
    的頭像 發(fā)表于 02-26 10:07 ?562次閱讀
    Redis實現(xiàn)<b class='flag-5'>分布式</b><b class='flag-5'>多</b>規(guī)則限流的方式介紹
    赌场百家乐玩法介绍| 百家乐怎么玩最保险| 百家乐官网神仙道官网| 圣保罗百家乐的玩法技巧和规则 | 郯城县| 金冠百家乐的玩法技巧和规则| 十六浦百家乐官网的玩法技巧和规则| 澳门足球博彩| 真人游戏视频| 博彩百家乐网址| 网上真人娱乐场| 菲律宾太阳城88| 七胜百家乐娱乐网| 做生意门朝向什么方向| 现场百家乐官网玩法| 百家乐官网视频软件| 亿酷棋牌世界下载手机版| 试玩百家乐的玩法技巧和规则| 百家乐2号干扰| 百家乐官网平预测软件| 百家乐官网赌场筹码| 百家乐官网怎么下注能赢| 澳门百家乐| 棋牌评测网站| 水果机遥控器多少钱| 皇冠百家乐的玩法技巧和规则| 百家乐台布21点| 百家乐投注方式| 红宝石百家乐官网的玩法技巧和规则 | 威尼斯人娱乐代理注| 優博百家乐客服| 澳门百家乐娱乐城送彩金| JJ百家乐官网的玩法技巧和规则 | 加州百家乐官网娱乐城| 长城百家乐官网游戏| 德州扑克排名| 大发888游戏平台 送1688元现金礼金领取 | 武强县| 百家乐官网洗码方法| 百家乐官网实战技术| 网上百家乐官网网站导航|