越來越多現代分布式云服務,通過解耦計算與存儲,以及跨越多節點復制的方式實現了彈性與可伸縮性。這樣做,可以讓我們進行某些操作,例如替換失誤或者不可達的主機,添加復制節點,寫入節點與復制節點的故障轉移,拓展或者收縮數據庫實例的大小等等。在這種環境下,傳統的數據庫系統所面臨的IO瓶頸發生改變。因為IO可以分散到多租戶集群中的多個節點和多個磁盤中,導致單個磁盤和節點不在是熱點。相反,瓶頸轉移到發起這些IO請求的數據庫層與執行這些IO請求的存儲層之間的網絡中。除了每秒包數(packets per second , PPS)以及帶寬這種基本瓶頸外,一個高性能的數據庫會向發起存儲機群并行的寫入,從而放大了網絡流量。某個異常存儲節點的性能,磁盤或者網絡通路,都會嚴重影響響應時間。
現在我們考慮AZ+1情況是否能提供足夠的持久性問題。在這個模型中要提供足夠的持久性,就必須保證兩次獨立故障發生的概率(平均故障時間,Mean Time to Failure, MTTF)足夠低于修復這些故障的時間(Mean Time to Repair, MTTR)。如果兩次故障的概率夠高,我們可能看到可用區失效,打破了沖裁。減少獨立失效的MTTF,哪怕是一點點,都是很困難的。相反,我們更關注減少MTTR,縮短兩次故障的脆弱的時間窗口。我們是這樣做的:將數據庫卷切分成小的固定大小的段,目前是10G大小。每份數據項以6路復制到保護組(protection Group,PG)中,每個保護組由6個10GB的段組成,分散在3個可用區中。每個可用區持有2個段。一個存儲卷是一組相連的PG集合,在物理上的實現是,采用亞馬遜彈性計算云(ES2)提供的虛擬機附加SSD,組成的大型存儲節點機群。組成存儲卷PG隨著卷的增長而分配。目前我們支持的卷沒有開啟復制的情況下可增長達64TB。
考慮到數據庫知道那些讀操作沒有完成,可以在任何時間在每個PG的基礎上計算出最小的讀取點LSN(Minimum Read Point LSN). 如果有存儲節點交流寫的可讀副本,用來建立所有節點每個PG的最小讀取點,那么這個值就叫做保護組最小讀取點LSN(Protection Group Min Read Point LSN, PGMRPL). PGMRPL用來標識“低位水線”,低于這個“低位水線”的PG日志記錄都是不必要的。換句話說,每個存儲段必須保證沒有低于PGMRPL的讀取點的頁讀請求。每個存儲節點可以從數據庫了解到PGMRPL,因此,可以收集舊日志,物化這些頁到磁盤中,再安全回收日志垃圾。
現代web應用框架,如Ruby on Rails,都整合了ORM(object-relational mapping, 對象-關系映射)。導致對于應用開發人員來說,數據庫模式改變非常容易,但是對DBA來說,如何升級數據庫模式就成為一種挑戰。在Rail應用中,我們有關于DBA的第一手資料:“數據庫遷移“,對于DBA來說是"一周做大把的遷移“,或者是采用一些回避策略,用以保證將來遷移的不那么痛苦。而Mysql提供了自由的模式升級語義,大部分的修改的實現方式是全表復制。頻繁的DDL操作是一個務實的現實,我們實現了一種高效的在線DDL,使用(a)基于每頁的數據庫版本化模式,使用模式歷史信息,按需對單獨頁進行解碼。(b)使用寫時修改(modify-on-write)原語,實現對單頁的最新模式懶更新。
Brailis等人研究了高可用事務系統(Highly Available Transactions, HATs)的問題。他們已經證明分區或者高網絡延遲,并不會導致不可用性??纱谢?、snapshot隔離級、可重復讀隔離級與HAT不兼容。然而其他的隔離級可以達到高可用性。Aurora提供了所有的隔離級,它給了一個簡單的假設,即任何時候都只有一個寫節點產生日志,日志更新的LSN,是在單個有序域中分配的。