Riak - 背景篇(1)
分布式高可用鍵值對(duì)數(shù)據(jù)庫(kù)Riak - 背景篇(1)
Riak簡(jiǎn)介
典型的現(xiàn)代關(guān)系數(shù)據(jù)庫(kù)在某些類型的應(yīng)用程序中表現(xiàn)平平,難以滿足如今的互聯(lián)網(wǎng)應(yīng)用程序的性能和可擴(kuò)展性要求。因此,需要采用不同的方法。在過(guò)去幾年中,一種新的數(shù)據(jù)存儲(chǔ)類型變得非常流行,通常稱為 NoSQL,因?yàn)樗梢灾苯咏鉀Q關(guān)系數(shù)據(jù)庫(kù)的一些缺陷。Riak 就是這類數(shù)據(jù)存儲(chǔ)類型中的一種。
Riak 并不是惟一的一種 NoSQL 數(shù)據(jù)存儲(chǔ)。另外兩種較流行的數(shù)據(jù)存儲(chǔ)是 MongoDB 和 Cassandra。盡管在許多方面十分相似,但是它們之間也存在明顯的不同。例如,Riak 是一種分布式系統(tǒng),而 MongoDB 是一種單獨(dú)的系統(tǒng)數(shù)據(jù)庫(kù),也就是說(shuō),Riak 沒(méi)有主節(jié)點(diǎn)的概念,因此在處理故障方面有更好的彈性。盡管 Cassandra 同樣是基于 Amazon 的 Dynamo 描述,但是它在組織數(shù)據(jù)方面摒棄了向量時(shí)鐘和相容散列等特性。Riak 的數(shù)據(jù)模型更加靈活。在 Riak 中,在第一次訪問(wèn) bucket 時(shí)會(huì)動(dòng)態(tài)創(chuàng)建這些 bucket;Cassandra 的數(shù)據(jù)模型是在 XML 文件中定義的,因此在修改它們過(guò)后需要重啟整個(gè)集群。
Riak 是用 Erlang 編寫(xiě)的。而 MongoDB 和 Cassandra 是用通用語(yǔ)言(分別為 C++和 Java)編寫(xiě),因此 Erlang 從一開(kāi)始就支持分布式、容錯(cuò)應(yīng)用程序,所以更加適用于開(kāi)發(fā) NoSQL 數(shù)據(jù)存儲(chǔ)等應(yīng)用程序,這些應(yīng)用程序與使用 Erlang 編寫(xiě)的應(yīng)用程序有一些共同的特征。
Riak支持Map/Reduce 作業(yè),但是Map/Reduce 作業(yè)只能使用 Erlang 或 JavaScript 編寫(xiě)。
分布式存儲(chǔ)?一個(gè)頭疼的問(wèn)題
目前,基于互聯(lián)網(wǎng)的業(yè)務(wù)都處于量級(jí)高速變化的狀態(tài)(要么增長(zhǎng)特別快,要么萎縮特別快)。一個(gè)比較頭疼的問(wèn)題就是如何存儲(chǔ)并保持高速訪問(wèn)業(yè)務(wù)數(shù)據(jù)。很多公司采用了分布式存儲(chǔ)的解決方案,這帶來(lái)了一些更令人頭疼的問(wèn)題:
接下來(lái)我們將針對(duì)每個(gè)問(wèn)題將Dynamo的解決方案展示給大家。
Dynamo擴(kuò)容與一致性哈希
我們運(yùn)用快遞員與運(yùn)單的場(chǎng)景,假設(shè)我們的數(shù)據(jù)庫(kù)存儲(chǔ)每個(gè)快遞員的所有運(yùn)單記錄。現(xiàn)在有A,B,C,D,E這五臺(tái)機(jī)器,有200個(gè)快遞員,有2000條運(yùn)單記錄。我們很容易想到通過(guò)哈希取模來(lái)平均分配這200個(gè)快遞員與2000個(gè)運(yùn)單對(duì)應(yīng)關(guān)系。通過(guò)快遞員對(duì)5取模,即A(1,6,11,16…), B(2,7,12,17…), C(3,8,13,18…), D(4,9,14,19…), E(5,10,15,20…),保存對(duì)應(yīng)的快遞員與運(yùn)單關(guān)系(其實(shí)就是快遞員為key運(yùn)單為value)。
如果這時(shí),我們想擴(kuò)容到六臺(tái),那么變成A(1,7,13,19…), B(2,8,14,20…), C(3,9,15…), D(4,10,16…), E(5,11,17…), F(6,12,18…). 遷移量非常大。如何減少遷移量呢?
Dynamo采用一致性哈希的方法,首先,我們假設(shè)有S=20個(gè)邏輯分片。然后200個(gè)快遞員的哈希值處理之后落到的區(qū)域正好如下圖所示:
每個(gè)快遞員的鍵值對(duì)都會(huì)落到這個(gè)環(huán)上,假設(shè)我們這里一致哈希算法是按快遞員號(hào)碼進(jìn)行的。Shard1負(fù)責(zé)1-10,Shard2負(fù)責(zé)11-20,以此類推。因?yàn)榭爝f員的能力是差不多的,所以當(dāng)資源節(jié)點(diǎn)的數(shù)量足夠多的時(shí)候,可以認(rèn)為每個(gè)節(jié)點(diǎn)的負(fù)載基本是均衡的。這是原始的consistent hashing。
Dynamo并沒(méi)有采用這個(gè)模型。這個(gè)理想的理論模型跟現(xiàn)實(shí)之間有一個(gè)問(wèn)題,在這個(gè)理論模型上,每個(gè)資源節(jié)點(diǎn)的能力是一樣的。我的意思是,他們有相同的cpu,內(nèi)存,硬盤(pán)等,也就是有相同的處理能力。可現(xiàn)實(shí)世界,我們使用的資源卻各有不同,新買的n核機(jī)器和老的奔騰主機(jī)一起為了節(jié)約成本而合作。如果只是這么簡(jiǎn)單的把機(jī)器直接分布上去,性能高的機(jī)器得不到充分利用,性能低的機(jī)器處理不過(guò)來(lái)。
所以,Dynamo使每個(gè)物理機(jī)器按照能力包含不同個(gè)分片節(jié)點(diǎn)。假設(shè)還是剛才那5臺(tái)機(jī)器, 一種分配方案就是:
這樣,即是一臺(tái)機(jī)器掛了,所做的遷移量也只是那臺(tái)機(jī)器上的數(shù)據(jù)。新加入的機(jī)器所要遷移的數(shù)據(jù)也只是他所要保存的數(shù)據(jù)。但是,這種方案還是有問(wèn)題,假設(shè)A機(jī)器掛了,那么他的所有數(shù)據(jù)全都跑到了B上,而從上圖可以看出,B的性能不是很好。所以,最好還是采用下種方案避免這種現(xiàn)象:
采用這種方法的前提是邏輯分片個(gè)數(shù)S要大于物理機(jī)個(gè)數(shù)P(如果P>S,不是不可以,就是多余出來(lái)機(jī)器沒(méi)有分片需要它去承載)。這里就是20>5. 假設(shè)考慮到高可用一份數(shù)據(jù)要復(fù)制n份,那么我們就要保證S>n*P.
總結(jié)
以上是生活随笔為你收集整理的Riak - 背景篇(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何监控cpu温度(代替鲁大师) cor
- 下一篇: 计算机网络自考第一章知识点,完整版18版