# 7-3 Dynamo DB Amazon 是世上最大的電商,遇到的最大挑戰就是超大規模的穩定性,即使是最微小的故障,也會導致巨大的財損,且降低用戶的信心。 Amazon.com做為全球服務的平台,底下的基礎設施是由成千上萬的server及網路設備建構而成,在此龐大的規模下,大大小小的故障不停地在發生,而我們應對這些故障所採取的管理持久狀態的方式,驅動著*可靠性(reliability)* 及 *可擴展性(scalability)* 的發展。 本文介紹Dynamo — 一個**High Availability Key-value**資料庫的設計與實現方式,Amazon 部分核心功能就是基於Dynamo提供*always-on*的服務,為了得到如此之高的availability,在特定場景的故障下,必須放棄一致性。此外,Dynamo使用大量的**物件版本化(object versioning)** 及 **應用程式協助的衝突方法(application-assisted conflict resolution**) 機制,提供了開發者一個新穎的介面。 ## Intro > The reliability and scalability of a system is dependent on how its application state is managed. 我們從Amazon的經驗中,歸納出了一個結論,一個系統的可靠性與可擴展性取決於我們如何管理應用程式的狀態。 Amazon 的架構是高度去中心化、鬆耦合、服務導向的,由上百個服務組成的。這樣的環境對always-on有強烈的需求,即使硬碟掛掉、網路路由抖動、資料中心被颶風摧毀,用戶還是能查看、將商品加入購物車。因此,這類服務要隨時能夠讀寫它的**資料倉庫(data store)**,且資料要能夠在多個資料中心讀取。 在此上百萬個設備所組成的基礎設施的故障排除,是相當正常的操作,永遠都會有相當小比例但是總數不少的server和設備故障,因此故障排除是相當正常、可預期的行為。 Dynamo 用於管理對可靠性要求非常高的服務的狀態,这些服務要求對可靠性、一致性、成本效率(cost-effectiveness)和性能有很強的控制能力。 > Dynamo is used to manage the state of services that have very high reliability requirements and need tight control over the tradeoffs between availability, consistency, cost-effectiveness and performance. Amazon 平台有很多類型的應用,不同的類型對儲存的需求差異相當大。 例如,其中某些應用,希望能採取足夠靈活的配置,以便在高成本效率的方式下,由開發者来決定如何在可用性和性能之間取捨。 Amazon 的一些服務只以 primary key 的方式就能存取data store。 很多服務,例如暢銷排行榜、購物車、客户喜好、session 管理、銷售排行、商品目錄等等, 若用RDBMS會很沒效率,而且限制了規模的scalability和availability。Dynamo 提供了使用primary key only的介面来滿足這類應用的需求。 Dynamo 融合幾個知名的技術來實現高擴展性及高可用性 1. Consistent hashing 2. consistency is facilitated by object versioning 3. replica間的一致性由quorum-like和去中心化的replica同步維持 4. 採用gossip based 的分散式故障檢測和成員檢測協議 > Dynamo is a completely decentralized system with minimal need for manual administration. Dynamo 是一個只需要最少人為管理、去中心化的系統,新增或刪除節點不需要人工調整。 本文的貢獻: 1. 評估了如何結合多個不同的技術建構成一個高可用性的平台 2. 示範了一個最終一致(eventually-consistent)儲存系統可以應用於生產環境,滿足高要求的應用 3. 深入探討了調整這些技術以滿足生產系統的嚴苛性能要求 ## Background Amazon平台是由幾百個服務所組成的,這些服務分佈在世界的資料中心內,有些是有狀態的(根據data store內的狀態執行業務邏輯後產生回應),有些無狀態的(收集其他服務的回應)。 - 我們的服務大多都只需要primary key去儲存或者提取資料,不需要關聯型資料庫的特性,這樣操作比較簡單且硬體需求較低。 - 此外,關聯型資料庫複製操作相對受限,往往是犧牲Availability來換取Consistence,且也較難Scale out。 ### 系統假設與需求