很多全球化的産品, 比如facebook、twitter, 它們的使用者遍布世界各地。 工程師們往往會在全球設立多個資料中心(DC)供使用者通路, 我們可以稱之為異地多活。在後續一段時間裡, 我會寫一系列的部落格,和大家一起探索異地多活架構。
這篇文章主要是讨論我們為什麼需要異地多活, 以及實作這種架構所需要解決的問題。
一、異地多活的好處
1. 提升使用者體驗
一個産品最重要的是提供良好的使用者體驗,這對後端服務提出了幾個要求:
-
服務的高可用
對于一些服務而言, 需要提供6個9甚至以上的可用性。 高可用的原則就是避免單點+自動故障轉移。 為了避免機房粒度的單點, 我們需要提供多個DC, 彼此做災備。
-
良好的響應速度
如果全球隻有一個DC,那麼所有的使用者都隻能通路這一個。 這種情況下,跨洲級别的RTT(一般來說>200ms),對于使用者體驗而言是個災難。 是以全球級的産品需要在世界各地部署DC,供使用者就近通路。
2. 降低成本
廉價的機器
我們都知道, 很多商品在不同地方的價格是不一樣的,伺服器也不例外。 如果能讓非洲使用者通路本地廉價的後端服務, 為什麼要讓他們的流量跑到美東去呢?
流量的分攤
一般而言,我們需要控制機器資源大于峰值流量的某個百分比, 比如為1w日活備好2w日活的機器。
如果你的DC已經遍布世界各地, 那麼如果某地的流量瘋漲時,你不需要擔心機器資源不能及時到位、為高峰期擴容後的資源浪費這種問題。 比如過萬聖節、聖誕節時,facebook美國流量瘋長, 這時候我們可以選擇把一部分流量切到亞洲地區的DC。
二、如何做到異地多活
要做到異地多活, 有幾個問題我們必須解決:
-
接入層流量控制
使用者預設通路哪個DC? 什麼時候做切換? 如何控制這個切換過程?
-
各DC業務邏輯一緻
對于使用者來說, 他的流量被排程前後,業務邏輯是一緻的。 比如facebook上有一些内容對于亞洲使用者是不可見的,不能因為亞洲使用者的流量被遷移到了美洲機房,這個限制就失效了。
-
跨DC的實時資料同步與沖突處理
還是以fb為例, 如果通路非洲機房的使用者A給通路南美洲機房的使用者B的一個文章點了贊, 那麼B應該能及時收到相關的通知。這背後就依賴資料的實時同步。
在多活情況下, 多DC的資料寫入勢必會引入資料的沖突, 比如facebook位于美東的的稽核系統和位于東南亞的使用者同時操作了一條文章, 就會産生資料的沖突。
-
提供全球級别的強一緻性
對于大多數業務而言, 我們隻需要最終一緻性即可(比如點贊之類的計數)。 但是某些業務,需要全球的強一緻保障(比如下單、支付之類的操作)。
在後續的文章中, 我會陸續讨論這些話題, 歡迎持續關注我的部落格: https://blog.csdn.net/u012422829/ 。