一直以來實現數據庫的零數據丟失都是非常有挑戰,尤其是跨可用區的場景下。很多核心繫統爲了實現這一點都投入了大量的智慧和金錢。Amazon RDS在文檔都明確的寫到,數據庫在多AZ之間的數據是保持同步的(注:同步是指數據寫入兩邊要同時寫成功,即使一邊不可用,已經提交的事務在另一邊一定是成功的)。一直以來,我也很好奇Amazon RDS在哪個層面實現的同步複製。

這個問題原本也是沒有太大疑問的,可以推測應該是通過EBS層面的塊複製來下。依據有兩方面,有一些公開的Amazon RDS一些架構圖中可以看到有EBS複製的箭頭說明。另外,還有一點,只有通過EBS的複製實現跨可用區數據一致性,纔可能在RDS支持的多種數據庫,如MySQL、SQL Server、Oracle等,上保持架構上一致。否則,不同數據庫類型的高可用和複製架構可能相差很大。

但是,之前很長時間我還是有一個疑問,Amazon RDS複製到底是在數據庫邏輯層實現的還是在EBS物理層實現的。

既然有上面的猜測,那爲什麼產生了這個疑問呢?是因爲,在Aurora很多的對外介紹材料(包括論文、架構介紹的slide)中,會放一個MySQL架構來突出Aurora的架構優勢。這個圖一直讓我誤以爲Amazon RDS使用了數據庫的binlog的複製。在瞭解Aurora的時候大家經常會看到如下架構圖作爲反面案例( 參考 ):

因爲這幅圖的誤導,讓我一度以爲Amazon RDS MySQL用了這種複製方式。但是仔細一想,應該是不可能的,使用EBS實現多可用區複製是一種更加一致、通用的方案。爲了找到這一點的實錘證據,就稍微做了一些搜索。最終,在Youtube上AWS Re:Invent大會上的演講找到了AWS同學詳細關於這個點的闡述,具體的描述如下(參考: AWS re:Invent 2017: Deep Dive on Amazon Relational Database Service (RDS) (DAT302) ):

...They're replicating synchronously now that replication is at the block level.It's not a logical replication. It's actually physically replication the storage blocks...

另外,還有明確表示EBS複製關係的膠片如下:

好了,這個問題的疑問就到此爲止了,各種證據已經實錘。

那麼,Aurora論文中的架構圖是怎麼回事呢?事實上,當用戶在EC2/ECS自建數據庫的時候,架構應該就是上面Figure 2。

相關文章