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