跨地域的分布式系統(tǒng)如何做?
多機(jī)房部署意味著在不同的 IDC(Internet Data Center)機(jī)房中設(shè)置多個(gè)服務(wù)實(shí)例,這些服務(wù)共享同一份業(yè)務(wù)數(shù)據(jù),并且都可以處理用戶的請(qǐng)求流量。這種架構(gòu)旨在提高系統(tǒng)的高可用性和災(zāi)備能力,以應(yīng)對(duì)單一機(jī)房或地區(qū)發(fā)生的網(wǎng)絡(luò)故障、自然災(zāi)害等意外情況。
一個(gè)思路是直接跨機(jī)房讀取 A 機(jī)房的從庫:
圖片
另一個(gè)思路是在機(jī)房 B 部署一個(gè)從庫,跨機(jī)房同步主庫的數(shù)據(jù),然后機(jī)房 B 的應(yīng)用就可以讀取這個(gè)從庫的數(shù)據(jù)了:
圖片
涉及跨機(jī)房的數(shù)據(jù)傳輸時(shí),對(duì)機(jī)房之間的延遲有較高的要求,這取決于機(jī)房之間的距離。一些基本的延遲數(shù)字如下:
城市內(nèi)跨機(jī)房: 通常在幾毫秒(ms)到數(shù)十毫秒(ms)之間,取決于城市規(guī)模和網(wǎng)絡(luò)基礎(chǔ)設(shè)施。
地區(qū)間跨機(jī)房: 跨越不同城市或地區(qū)的機(jī)房間的延遲通常在幾十毫秒(ms)到數(shù)百毫秒(ms)之間,具體取決于地理距離和網(wǎng)絡(luò)連接質(zhì)量。
國際跨機(jī)房: 跨越國家或大洲的機(jī)房間的延遲通常在數(shù)百毫秒(ms)到數(shù)秒之間,受到地球的物理距離和國際網(wǎng)絡(luò)連接的影響。
逐步迭代多機(jī)房部署方案
1. 同城雙活
數(shù)據(jù)庫部署: 主數(shù)據(jù)庫部署在一個(gè)機(jī)房中(如A機(jī)房),而A、B兩個(gè)機(jī)房都設(shè)置一個(gè)從數(shù)據(jù)庫,通過主從復(fù)制同步數(shù)據(jù)。這樣可以實(shí)現(xiàn)雙機(jī)房的數(shù)據(jù)一致性,并且降低跨機(jī)房調(diào)用的需求。
緩存部署: 在兩個(gè)機(jī)房都部署緩存,查詢請(qǐng)求優(yōu)先讀取本地緩存,如果緩存不存在則穿透到本地從數(shù)據(jù)庫中加載數(shù)據(jù)。這樣可以減少對(duì)主數(shù)據(jù)庫的直接查詢,提高數(shù)據(jù)訪問速度。
RPC服務(wù)注冊(cè)與調(diào)用: 不同機(jī)房的RPC服務(wù)向不同的注冊(cè)中心注冊(cè)服務(wù)組,并且RPC客戶端(如Web服務(wù))只訂閱同機(jī)房的RPC服務(wù)組。這樣可以最大程度地保證RPC調(diào)用發(fā)生在本機(jī)房?jī)?nèi),避免跨機(jī)房調(diào)用。
其他依賴服務(wù): 確保其他依賴服務(wù)(如審核、搜索等)也采用雙機(jī)房部署,并盡量保證只調(diào)用本機(jī)房的服務(wù),降低調(diào)用延遲。
容災(zāi)處理: 如果某個(gè)機(jī)房發(fā)生故障,可以通過主從切換的方式將另一個(gè)機(jī)房的從數(shù)據(jù)庫提升為主數(shù)據(jù)庫,以達(dá)到容災(zāi)的目的。同時(shí),RPC服務(wù)和其他依賴服務(wù)也可以在另一個(gè)機(jī)房中繼續(xù)提供服務(wù),保證系統(tǒng)的可用性。
2. 異地多活
異地機(jī)房部署位置: 異地機(jī)房應(yīng)選擇與主機(jī)房距離較遠(yuǎn)的位置,例如上海、廣州等城市,以降低自然災(zāi)害對(duì)系統(tǒng)可用性的影響。
數(shù)據(jù)同步方案: 采用兩種同步相結(jié)合的方式,即基于存儲(chǔ)系統(tǒng)的主從復(fù)制和基于消息隊(duì)列的方式。主庫部署在主機(jī)房,從庫部署在異地機(jī)房,并通過主從復(fù)制實(shí)現(xiàn)數(shù)據(jù)同步。同時(shí),對(duì)于緩存數(shù)據(jù)、HBase等,采用基于消息隊(duì)列的方式進(jìn)行同步。
數(shù)據(jù)讀取優(yōu)化: 為了減少跨機(jī)房數(shù)據(jù)傳輸?shù)难舆t,對(duì)用戶進(jìn)行分片,使一個(gè)用戶的讀寫操作盡量在同一個(gè)機(jī)房中進(jìn)行。同時(shí),在服務(wù)調(diào)用和數(shù)據(jù)讀取時(shí),優(yōu)先選擇本機(jī)房的服務(wù)和數(shù)據(jù),確保服務(wù)調(diào)用盡量在本機(jī)房?jī)?nèi)完成。
服務(wù)調(diào)用優(yōu)先級(jí): 對(duì)于一些需要跨機(jī)房讀取數(shù)據(jù)的場(chǎng)景,如用戶查看訂單信息,優(yōu)先保證服務(wù)調(diào)用和數(shù)據(jù)讀取在本機(jī)房中進(jìn)行,即使讀取的是跨機(jī)房從庫的數(shù)據(jù),也可以接受一定的延遲。
圖片
總結(jié):
允許有跨機(jī)房數(shù)據(jù)寫入的發(fā)生,但強(qiáng)調(diào)數(shù)據(jù)的讀取和服務(wù)的調(diào)用應(yīng)盡量在同一個(gè)機(jī)房中進(jìn)行,以確保最低的延遲。這種方案適用于同城多機(jī)房的延遲在1ms~3ms范圍內(nèi)的情況,且相對(duì)簡(jiǎn)單易行。
避免跨機(jī)房同步的數(shù)據(jù)寫入和讀取,采取異步的方式將數(shù)據(jù)從一個(gè)機(jī)房同步到另一個(gè)機(jī)房。這種方案適用于異地機(jī)房的延遲在50ms以下的情況,要求跨機(jī)房數(shù)據(jù)同步的延遲較低。
多機(jī)房部署是一個(gè)在業(yè)務(wù)發(fā)展到一定規(guī)模、對(duì)機(jī)房容災(zāi)有需求時(shí)才考慮的方案,需要謹(jǐn)慎權(quán)衡利弊。在可以避免的情況下盡量不要進(jìn)行多機(jī)房部署,因?yàn)檫@會(huì)增加系統(tǒng)的復(fù)雜性和維護(hù)成本。
異地多活架構(gòu)在實(shí)現(xiàn)時(shí)過于復(fù)雜,很少有公司能夠搭建一套真正的異步多活架構(gòu)。因此,在沒有足夠的技術(shù)實(shí)力和資源支持的情況下,不建議輕易嘗試異地多活架構(gòu)。