Amazon的雲端計算(1)——基礎儲存架構Dynamo
Amazon 依靠在電子商務中積累的大量基礎性設施和各類先進技術,很早地進入了雲端計算領域,並在提供計算、儲存等服務方面處於領先地位。
Amazon 開發並提供了一系列雲端計算服務這些雲端計算服務共同構成了 Amazon Web Service
amazon 提供的服務主要包括:
- 彈性計算雲 EC2
- 簡單儲存服務 S3
- 簡單資料庫服務 Simple DB
- 簡單佇列服務 SQS
- 彈性 MapReduce 服務
- 內容推送服務 CloudFront
- 電子商務服務 DevPay
- FPS
這些服務涉及雲端計算的方方面面,使用者完全可以根據自己的需要選取一個或多個Amazon雲端計算服務。所有的這些服務都是按需獲取資源,具有極強的可擴充套件性和靈活性。
基礎儲存架構Dynamo
Amazon 作為目前世界上最主要的電子商務提供商之一,它的系統每天要接受全球數以百萬計的服務請求,髙效的平臺架構是保證其系統穩定性的根本。下圖是面向服務的Amazon平臺基本架構。
從圖中可以看出整個Amazon平臺的架構是完全的分散式、去中心化的,在Amazon的平臺中處於底層位置的儲存架構Dynamo也是如此。Amazon平臺中有很多服務對儲存的需求只是讀取、寫入,即滿足簡單的鍵/值(key/value)式儲存即可,例如:常用的購物車、資訊會話管理和推薦商品列表等,如果採取傳統的關係資料庫方式,則效率低下。針對這種需求,Dynamo應運而生,雖然Dynamo目前並不直接向公眾提供服務,但是大量的使用者服務資料被儲存在Dynamo中。可以說它為Amazon的電子商務平臺及其雲端計算服務提供了最基礎的支援
Dynamo概況
為了保證其穩定性,Amazon的系統採用完全的分散式、去中心化的架構
- 作為底層儲存架構的Dynamo也同樣採用了無中心的模式
- Dynamo只支援簡單的鍵/值(key/value)方式的資料儲存,不支援複雜的查詢
- Dynamo中儲存的是資料值的原始形式,即按位儲存,並不解析資料的具體內容
Dynamo架構的主要技術
Dynamo需要解決的主要問題及解決方案
Dynamo在設計時被定位為一個基於分散式儲存架構的,高可靠、高可用且具有良好容錯性的系統。下圖列舉了Dynamo設計時面臨的主要問題及所採取的解決方案。
問題 | 採取的相關技術 |
---|---|
資料均衡分佈 | 改進的一致性雜湊演算法 |
資料備份 | 引數可調的弱quorum機制 |
資料衝突處理 | 向量時鐘(Vector Clock) |
成員資格及錯誤檢測 | 基於Gossip協議的成員資格和錯誤檢測 |
臨時故障處理 | Hinted handoff(資料回傳機制) |
永久故障處理 | Merkle雜湊樹 |
Dynamo的儲存節點
Dynamo中的儲存節點呈無中心的環狀分佈。
兩個基本概念:
- preference list (儲存與某個特定鍵值相對應的資料的節點列表)
- coordinator (執行一次讀或寫操作的節點)
通常,coordinator 是 preference list 上的第一個節點;一般情況下, preference list 的長度是5,也就是說第一個節點是資料操作節點,後面4個是備份節點。
資料均衡分佈的問題
Dynamo採用了分散式的資料儲存架構,均衡的資料分佈可以保證負載平衡和系統良好的擴充套件性。
因此,如何保證各個節點上資料的均衡性是影響Dynamo效能的關鍵問題。
Dynamo中使用改進後的一致性雜湊演算法,並在此基礎上進行資料備份,以提高系統的可用性。
一致性雜湊演算法
一致性雜湊演算法是目前主流的分散式雜湊表(Distributed Hash Table,DHT)協議之一,於1997年由麻省理工學院提出。
一致性雜湊演算法通過修正簡單雜湊演算法,解決了網路中的熱點問題,使得DHT可以真正地應用於P2P環境中。
給定一個hash值空間,[0~2^32),假設分佈在一個圓環上,對每個結點算出一個固定hash值,將結點置於環上,對新加入的物件的 key 算出hash值,假設落在節點1和節點2之間,那麼這個資料項< key,Value >就存在節點2開始的結點上。假定副本數為3,那麼就存在節點2和節點2後面兩個結點上面。
一致性雜湊演算法除了能夠保證雜湊運算結果充分分散到整個環上外,還能保證在新增或刪除裝置節點時只會影響到其在雜湊環中的前驅裝置節點,而不會對其他裝置節點產生影響。
一致性雜湊演算法可以大大降低在新增或刪除節點時引起的節點間的資料傳輸開銷
改進的一致性雜湊演算法
因為每臺機器的效能不一樣,所以我們為了能夠充分利用每臺機器的效能,我們需要改進一致性雜湊演算法。於是在Dynamo中引入了虛擬節點的概念
每個虛擬節點都隸屬於某一個實際的物理節點,一個物理節點根據其效能的差異被分為一個或多個虛擬節點。
各個虛擬節點的能力基本相當,並隨機分佈在雜湊環上。
Dynamo將整個雜湊環劃分成Q等份,每個等份稱為一個數據分割槽(Partition)
在儲存資料時,每個資料會被先分配到某個資料分割槽,再根據負責該資料分割槽的虛擬節點,最終確定其所儲存的物理節點。
資料分割槽的好處有:
- 減小資料分佈不均衡的可能性
- 新增或刪除裝置節點時引起較小的資料傳輸
資料備份
在Dynamo中,每個資料的副本備份儲存在雜湊環順時針方向上該資料所在虛擬節點的後繼節點中。
資料備份在儲存資料的同時進行,會使每次寫操作的延時變長。
Dynamo中對寫操作進行了優化,保證一個副本必須寫入硬碟,其他副本只要寫入節點的記憶體即返回寫成功。
每個虛擬節點上實際儲存了分配給它以及分配它的前N-1個前驅虛擬節點的資料。
資料衝突問題
分散式系統架構中通常考慮的三個因素:
- 可靠性(Reliability)
- 可用性(Availability)
- 一致性(Consistency)
Dynamo選擇通過犧牲一致性來保證系統的可靠性和可用性 ,沒有採用強一致性模型 而採用了最終一致性模型。
由於Dynamo中可能出現同一個資料被多個節點同時更新的情況,且無法保證資料副本的更新順序,這有可能會導致資料衝突。
資料衝突問題如何解決?
Dynamo中採用了向量時鐘技術(Vector Clock)
Dynamo中的向量時鐘通過[node, counter]對來表示。其中 node 表示操作節點。 counter是其對應的計數器,初始值為 0 節點每進行一次更新操作則計數器加 1
如上圖所示,D3 和 D4 的操作有衝突,於是,我們會把 D3 和 D4 同時交給應用層,讓應用層來選擇合併策略
既然有版本衝突的問題,衝突版本的合併就只能交給上層應用來做,每次讀操作Dynamo將返回讀到的所有版本,若上層應用無法解決合併,那就只能選擇一個最新版本,從而丟失一部分資料,Dynamo論文只舉了購物車的例子,每個值為一個購物車物品集合,每次更新可以往購物車新增,刪除物品,衝突時合併購物車取並集。這樣新增到購物車的操作不會出問題,但是可能會導致刪除的物品重新出現。
成員資格及錯誤檢測
由於Dynamo採用了無中心的架構,每個成員節點都需要儲存其他節點的路由資訊。
為了保證每個節點都能擁有最新的成員節點資訊,Dynamo中採用了一種類似於Gossip(閒聊)協議的技術
Dynamo中還通過Gossip來實現錯誤檢測任何節點向其他節點發起通訊後,如果對方沒有迴應,則認為對方節點失效
為了避免新加入的節點之間不能及時發現其他節點的存在,Dynamo中設定了一些種子節點(Seed Node)。種子節點和所有的節點都有聯絡。當新節點加入時,它扮演一箇中介的角色,使新加入節點之間互相感知。
錯誤檢測的方法是:
- 自底向上每一層代表一次隨機通訊
- 第一層節點1將資訊交換給節點2
- 第二層節點1和2同時開始隨機選擇
- 其他節點交換資訊
- 直到N個節點全部傳遍
如下圖所示:
結論:
- Dynamo中的節點數不能太多
- Amazon採用了分層Dynamo結構來解決該問題
容錯機制
臨時故障處理機制
為了處理臨時失效的節點,Dynamo中採用了一種帶有監聽的資料回傳機制(Hinted Handoff)
當虛擬節點A失效後,會將資料臨時存放在節點D的臨時空間中,並在節點A重新可用後,由節點D將資料回傳給節點A。
永久性故障處理機制
Dynamo採用Merkle雜湊樹技術來加快檢測和減少資料傳輸量
每個虛擬節點儲存三顆Merkle樹,即每個鍵值區間建立一個Merkle樹。Dynamo中Merkle雜湊樹的葉子節點是儲存每個資料分割槽內所有資料對應的雜湊值,父節點是其所有子節點的雜湊值。下圖是兩棵不同的Merkle雜湊樹A和B。
系統比較兩棵同一鍵值區的Merkle雜湊樹時,首先査看根節點,如果相同則說明資料一致,不需要進行資料同步,否則需要繼續比較,直到雜湊值不同的葉子節點,快速定位差異。例如,上圖中A和B的根節點不同,說明需要進行資料同步。緊接著比較A和B的子節點,發現右子樹的根節點2≠5,繼續比較右予樹根節點的子節點,按同樣的步驟一直進行下去,發現需要同步的資料位置。Merkle樹最大特點是隻要比較某個子樹就可以完成資料同步檢測和定位,進而進行同步,大大減少了同步過程中所需傳輸資料量,提高了系統效率。
相關推薦
Amazon的雲端計算(1)——基礎儲存架構Dynamo
Amazon 依靠在電子商務中積累的大量基礎性設施和各類先進技術,很早地進入了雲端計算領域,並在提供計算、儲存等服務方面處於領先地位。 Amazon 開發並提供了一系列雲端計算服務這些雲端計算服務共同構成了 Amazon Web Service amaz
Java IO(1)基礎知識——字節與字符
tle 大端模式 解密 延伸到 ascii spl 一段 end -a 正所謂怕什麽來什麽,這是知名的“墨菲定律”。Java基礎涵蓋各個方面,敢說Java基礎紮實的人不是剛畢業的學生,就是工作N年的程序員。工作N年的程序員甚至也不敢人人都說Jav
深入解析Java反射(1) - 基礎
java blog OS HR gpo n-1 get pos body http://www.sczyh30.com/posts/Java/java-reflection-1/ http://how2j.cn/k/reflection/reflection-usa
Python學習(1)——基礎資料型別
目錄 1、Python的應用 2、Python的優缺點 2.1 優點 2.2缺點 3.使用者輸入 4、格式化輸出 5、資料型別 5.1 bytes 5.2 字串 5.3 列表 5.4 元組 5.5 字典 5.6 集合 6、綜合例項 1、
JavaScript(1)--基礎
js設定的位置 在渲染元素之前:需要js對元素進行調整和配置等影響元素的渲染的程式碼 在渲染元素之後:通過js對元素進行修改等操作 通過引入js檔案的方式載入js 語法 宣告區域性變數 var a = 10; var b = 20;
shiro學習筆記(1)--基礎定義
一:shiro基礎 (學習地址:https://www.w3cschool.cn/shiro/andc1if0.html) 1、核心概念 Authentication:認證 Authorization:授權 SessionManageMent:session管理 Cryptography:
Neo4j 做推薦 (1)—— 基礎資料
Neo4j 提供了sandbox,開始可以使用3天,到期後可以續7天。只需要註冊一個賬號即可。 登入後,點選Sandbox,可以建立電影推薦相關的,當然也可以自己選擇其他的。 建立好後會收到郵件,也可以網頁上檢視詳細: 點選連結進去,可以看到所有的資料都建立好
python高階(1)—— 基礎回顧
Python基礎回顧 認識變數 在學習了之前的Python零基礎入門系列【洗禮靈魂,修煉Python】(說明一下,這個系列現在回過來再來看這個名字確實好土啊,然後有些知識點感覺還不太精準,後期看如果有時間再調整下,名字的話就這樣了,不想改了,要改的話起碼得改大半天)
git學習(廖雪峰git網站)(1)--基礎 知識
集中式版本控制系統和分散式的區別 Git是什麼? Git是目前世界上最先進的分散式版本控制系統(沒有之一)。 簡單點說就是你每次修改的地方、內容都會記錄,改錯了或者想返回某次改的地方,能精確查到某個檔案。 番外: 集中式版本控制系統和分散式的區別:
邊緣計算(1)
邊緣計算:萬物互聯時代新型計算模型 施巍鬆 主要解決 1.海量的邊緣資料的集中處理 2.邊緣資料傳遞到中心使用的頻寬負載 3.網路邊緣的個人隱私問題 4.傳輸過程中使用電能很大 邊緣計算能做的: 將雲資料中心的一些計算任務進行分解,遷移到邊緣節點進行處理,進而降低資料中心的負
PHP面向物件程式設計(1)基礎
一、面向物件OOP(Oriented Object Programming) 面向過程的程式設計 將要實現的功能描述為一個從一開始到結束的連續的“步驟(過程)”。 一次逐步完成這些步驟。如果步驟比較大,又可以將該步驟細分為子步驟,以此類推。 程式從頭開
解讀Android之Service(1)基礎知識
本文翻譯自Android官方文件 一個Service是一個長期可以在後臺執行(當然不需要提供UI)的應用元件。其它元件可以啟動service,即使切換到另一個應用,該service仍然可以在後臺執行。另外,其它元件可以繫結一個service進行互動,甚至可以進行程序間通訊(interproces
彙編總結(1)——基礎知識
CPU簡介 這部分主要介紹CPU的基本功能、組合語言的概念、資料的表示和儲存。 CPU的基本功能 目的碼: 計算機系統中的cpu只能執行機器指令,而由機器指令組成的程式就叫目標程式(目的碼),事實上無論你用什麼語言程式設計,計算機系統最終執行的都是目標程式(目的碼
實時搜尋引擎Elasticsearch(1)——基礎概念、安裝和執行
Elasticsearch(簡稱ES)是一個基於Apache Lucene(TM)的開源搜尋引擎,無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、效能最好的、功能最全的搜尋引擎庫。 Elasticsearch簡介 Elasticsearch是什麼 Ela
maven歸納:(1)基礎
1.什麼是maven Maven是基於專案物件模型(POM),可以通過一小段描述資訊來管理專案的構建,報告和文件的軟體專案管理工具。 Maven是跨平臺的專案管理工具。主要服務於基於Java平臺的專案構建,依賴管理和專案資訊管理。 Maven主要有兩
vue v-model 繫結表單元素的資料 (1)基礎用法
用法: 可以用 v-model 指令在表單 <input>、<textarea> 及 <select> 元素上建立雙向資料繫結。 它會根據控制元件型別自動選取正確的方法來更新元素。 儘管有些神奇,但 v-model 本質上不過是語
深度學習之PyTorch實戰(1)——基礎學習及搭建環境
最近在學習PyTorch框架,買了一本《深度學習之PyTorch實戰計算機視覺》,從學習開始,小編會整理學習筆記,並部落格記錄,希望自己好好學完這本書,最後能熟練應用此框架。 PyTorch是美國網際網路巨頭Facebook在深度學習框架Torch的基礎上使用Python重寫的一個全新的深度學習框架,
rabbitmq系列(1)—基礎概念
生產者 生產訊息,並將其釋出到訊息代理伺服器中。 消費者 連線到訊息代理伺服器,並訂閱佇列中的訊息 訊息 由有效載荷和標籤組成 有效載荷:生產者要傳送的有效資訊 標籤:描述傳送的有效載荷,以及誰能得到該訊息的拷貝 通道(channel) 建立在真實tcp連線上
Elastic search(1) 基礎命令
索引分片設定 PUT /_template/shard_template { "order" : 1, "index_patterns": [ "dq2_orm*", "dq2_dq_orm*", "d
jmeter學習(1)基礎支援+安裝部署
1. Apache jmeter 是100%的java桌面應用程式 支援的協議有:WEB-HTTP/HTTPS , SOAP, FTP, JDBC, LDAP, MAIL, MongoDB(Nosql)、本地