RebornDB:下一代分布式Key-Value数据库
from:http://mp.weixin.qq.com/s?__biz=MzA3MjY1MTQwNQ==&mid=207091653&idx=1&sn=c39023d8b865ebb780d2d81cf595df36&scene=5#rd
摘要:RebornDB是一個(gè)基于代理的分布式Redis集群解決方案,有點(diǎn)像twemproxy。它有一個(gè)殺手锏:動(dòng)態(tài)的切分?jǐn)?shù)據(jù)集,即透明的重新切分?jǐn)?shù)據(jù)而不影響目前正在運(yùn)行的服務(wù)。
現(xiàn)實(shí)世界有許多的Key-Value數(shù)據(jù)庫(kù),它們都被廣泛應(yīng)用于很多系統(tǒng)。比如,我們能夠用Memcached數(shù)據(jù)庫(kù)存儲(chǔ)一個(gè)MySQL查詢結(jié)果集給后續(xù)相同的查詢使用,用MongoDB存儲(chǔ)文檔以得到更好的查詢性能等等。
針對(duì)不同的場(chǎng)景,我們應(yīng)該選不同的Key-Value數(shù)據(jù)庫(kù),沒有一個(gè)Key-Value數(shù)據(jù)庫(kù)適用于所有解決方案,但是如果你僅僅想要一個(gè)簡(jiǎn)單、易于使用、快速、支持多種強(qiáng)大數(shù)據(jù)結(jié)構(gòu)的Key-Value數(shù)據(jù)庫(kù),Redis可能是你作為開始的一個(gè)很好的選擇。
Redis是一個(gè)先進(jìn)的Key-Value緩存和數(shù)據(jù)庫(kù),它基于BSD許可證。它的速度很快,支持許多數(shù)據(jù)類型(String、Hash、List、Set、Sorted Set……),使用RDB或AOF持久化和復(fù)制來(lái)保證數(shù)據(jù)的安全性,并且支持多種語(yǔ)言的客戶端庫(kù)。
最重要的是市場(chǎng)選擇了Redis,有許多公司正在使用Redis并且它證明了自身的價(jià)值。
雖然redis是相當(dāng)不錯(cuò)的,它仍然有一些缺點(diǎn),最大的缺點(diǎn)就是內(nèi)存限制,Redis將所有數(shù)據(jù)駐留內(nèi)存,這就限制了整個(gè)數(shù)據(jù)集的大小,讓我們不可能保存更多的數(shù)據(jù)。
官方的Redis集群通過將數(shù)據(jù)分發(fā)到多個(gè)Redis服務(wù)器來(lái)解決這個(gè)問題,但是這個(gè)方法并沒有在許多實(shí)際環(huán)境中被證明。同時(shí),它需要我們改變自己的客戶端庫(kù)來(lái)支持“MOVED”重定向和其它特殊命令,而這在正在運(yùn)行的生產(chǎn)環(huán)境同樣是不可接受的。所以,Redis集群現(xiàn)在看來(lái)并不是一個(gè)好的解決方案。
QDB
我們喜歡Redis,并且希望超越它的局限,因此我們創(chuàng)建了一個(gè)服務(wù)叫做QDB,它兼容Redis,將數(shù)據(jù)保存在磁盤來(lái)越過內(nèi)存大小的限制并且將熱點(diǎn)數(shù)據(jù)保存在內(nèi)存中以提高性能。
介紹
QDB是一個(gè)類似Redis的快速Key-Value數(shù)據(jù)庫(kù),它有以下優(yōu)點(diǎn):
-
兼容Redis:如果你對(duì) Redis很熟悉,你就能輕松使用QDB,它支持大多數(shù)的Redis命令和數(shù)據(jù)結(jié)構(gòu)(String、Hash、List、Set、Sorted Set等);
-
將數(shù)據(jù)保存在磁盤:(超越內(nèi)存大小限制)可以將熱點(diǎn)數(shù)據(jù)在內(nèi)存中保存,利用了后端存儲(chǔ);
-
支持多種后端存儲(chǔ):你可以選擇 RocksDB、LevelDB 或者 GoLevelDB(稍后,我們將用RocksDBs作為例子講解);
-
和Redis雙向同步:我們可以作為一個(gè)從節(jié)點(diǎn)從 Redis同步數(shù)據(jù),也可以作為一個(gè)主節(jié)點(diǎn)復(fù)制數(shù)據(jù)到Redis。
后端存儲(chǔ)
QDB使用LevelDB、RocksDB、GoLevelDB作為后端存儲(chǔ)。這些存儲(chǔ)都是基于有著很好的快速讀寫性能的日志結(jié)構(gòu)的合并樹(LSM樹),同時(shí)他們都使用布隆過濾器和LRU緩存(LRU:最少使用頁(yè)面置換算法)來(lái)提高讀的性能。
LevelDB是由Google開發(fā)的最早的版本,RocksDB是由Facebook維護(hù)的一個(gè)優(yōu)化版本,GoLevelDB是一個(gè)純粹用GO語(yǔ)言實(shí)現(xiàn)的LevelDB。如果你僅僅想要一個(gè)快速試驗(yàn)并且不想構(gòu)建和安裝RocksDB或者LevelDB,你可以直接使用GoLevelDB,但是我們不推薦你將其使用在生產(chǎn)環(huán)境中,因?yàn)樗男阅鼙容^差。
LevelDB和RocksDB對(duì)于你的生產(chǎn)環(huán)境來(lái)說都是非常不錯(cuò)的,但是鑒于RocksDB絕佳的性能,我們更喜歡RocksDB,之后我們將只支持RocksDB和GoLevelDB,一個(gè)用于生產(chǎn)環(huán)境,另一個(gè)用于試驗(yàn)和測(cè)試環(huán)境中。
RebirnDB
QDB是很棒的,我們能夠在一個(gè)機(jī)器上存儲(chǔ)巨大的數(shù)據(jù),并且獲得較好的讀寫性能,但是隨著數(shù)據(jù)集的增長(zhǎng),我們?nèi)匀粫?huì)面臨這樣的問題,即:我們不能將所有數(shù)據(jù)都保存在一個(gè)機(jī)器上。同時(shí),QDB服務(wù)器將變成一個(gè)瓶頸并且面臨單點(diǎn)失敗的風(fēng)險(xiǎn)。
現(xiàn)在我們必須要考慮集群解決方案了。
介紹
RebornDB是一個(gè)基于代理的分布式Redis集群解決方案。它有點(diǎn)像twemproxy,一個(gè)幾乎是最早的、最著名的基于代理的Redis集群解決方案。
但是twemproxy有它自己的問題,它僅僅支持靜態(tài)的集群拓?fù)?#xff0c;因此我們不能動(dòng)態(tài)的添加或者刪除redis節(jié)點(diǎn)來(lái)重新切分?jǐn)?shù)據(jù)。如果我們運(yùn)行著許多的twemproxy并且希望添加一個(gè)Redis后端節(jié)點(diǎn),另一個(gè)問題是如何讓所有的twemproxy安全的更新配置,而這將增加IT操作的復(fù)雜性。同時(shí),Twitter(正在開發(fā)twemproxy的公司)目前已經(jīng)放棄并不再將其應(yīng)用于生產(chǎn)環(huán)境。
不同于twemproxy,RebornDB有一個(gè)殺手锏:動(dòng)態(tài)的切分?jǐn)?shù)據(jù)集,這將非常有用,特別是在你的數(shù)據(jù)集增長(zhǎng)很快,你不得不增加更多的存儲(chǔ)節(jié)點(diǎn)來(lái)擴(kuò)展集群的情況下。總之,RebornDB將會(huì)透明的重新切分?jǐn)?shù)據(jù)而不影響目前正在運(yùn)行的服務(wù)。
架構(gòu)
我們可以將RebornDB想象成一個(gè)黑盒,像一個(gè)單節(jié)點(diǎn)的Redis服務(wù)器一樣用任何現(xiàn)有的Redis客戶端去和它通信。下面的圖片展示了RebornDB的架構(gòu)。
RebornDB有以下組件: reborn-proxy, backend store, coordinator, reborn-config, and reborn-agent.
-
Reborn-proxy
reborn-proxy為客戶端提供單一的外部服務(wù)。任何redis客戶端都能連接到任一reborn-proxy并運(yùn)行命令。
reborn-proxy用RESP解析來(lái)自客戶端的命令,將其分發(fā)至對(duì)應(yīng)的后端存儲(chǔ),接收到后端存儲(chǔ)的答復(fù)并返回客戶端。
Reborn-proxy 是無(wú)狀態(tài)的,意思是說你可以很容易的水平擴(kuò)展redis-proxy來(lái)處理更多的服務(wù)請(qǐng)求。
我們可以有許多的Reborn-proxy,在分布式系統(tǒng)設(shè)計(jì)的時(shí)候怎么讓客戶端發(fā)現(xiàn)它們是另一個(gè)主題,但是我們不會(huì)在這里深入探討這個(gè)問題,一些實(shí)用的方法是使用DNS,LVS,HAProxy等等。
-
后端存儲(chǔ)器(Backend store )
后端存儲(chǔ)器是reborn-server(一個(gè)修改的redis版本)或者QDB。我們引入一個(gè)概念叫做組(group)來(lái)管理一個(gè)或者多個(gè)后端存儲(chǔ)。一個(gè)組(group)必須有一個(gè)主節(jié)點(diǎn)和零個(gè)、一個(gè)或者多個(gè)從節(jié)點(diǎn)形成復(fù)制拓?fù)浣Y(jié)構(gòu)。
我們將整個(gè)數(shù)據(jù)集分成1024個(gè)slots(我們用hash(key)24來(lái)決定這個(gè)key屬于哪個(gè)slot),并且將不同的slot保存到不同的組。如果你想重新切分?jǐn)?shù)據(jù),你可以增加一個(gè)新的組并讓RebornDB 從另一個(gè) 組遷移一個(gè)slot的所有數(shù)據(jù)到新的組。
我們也可以讓不同的組采用不同的后端存儲(chǔ)器。例如:我們希望group1來(lái)保存熱點(diǎn)數(shù)據(jù),group2來(lái)保存大量的冷數(shù)據(jù),那么我們就能使用reborn-server構(gòu)成group1,QDB構(gòu)成group2.Reborn-server比QDB快很多,因此我們能夠保證熱點(diǎn)數(shù)據(jù)的讀寫性能。
-
協(xié)調(diào)器(Coordinator )
我們使用zookeeper或者etcd作為協(xié)調(diào)服務(wù)器,當(dāng)我們需要做一些寫操作的時(shí)候,例如重新切分,故障轉(zhuǎn)移等,它們會(huì)協(xié)調(diào)所有的服務(wù)。
所有RebornDB的信息都被保存在協(xié)調(diào)器中,例如關(guān)鍵路由規(guī)則,reborn-proxy可以根據(jù)它將命令正確的分發(fā)至后端存儲(chǔ)器。
-
Reborn-config
Reborn-config是一個(gè)管理工具,我們可以使用它增加或刪除組,例如增加或刪除組中的存儲(chǔ),從一個(gè)組遷移數(shù)據(jù)至另一個(gè)組等等。
如果我們想要改變RebornDB集群的信息,就必須使用Reborn-config。例如:我們不能直接使用“SLAVE NO ONE”命令將后端存儲(chǔ)器提升為主節(jié)點(diǎn),而必須使用“reborn-config server promote groupid server”我們必須不僅僅改變組內(nèi)的復(fù)制拓?fù)浣Y(jié)構(gòu),而且要更新協(xié)調(diào)器中的信息,而這些只有Reborn-config能夠做到。
Reborn-config也提供了一個(gè)網(wǎng)站服務(wù),因此你可以很容易的管理RebornDB,如果需要更多的控制,你可以使用它的HTTP RESTFUL API。
-
Reborn-agent
Reborn-agent是一個(gè)高可用組件。你可以用它啟動(dòng)和停止應(yīng)用(reborn-config, qdb-server, reborn-server, reborn-proxy)。我們將在接下來(lái)的高可用部分詳細(xì)討論。
重新切分(Resharding)
RebornDB支持動(dòng)態(tài)的重新切分?jǐn)?shù)據(jù)。我們是怎么做到的呢?
正如我們上面說的,我們將整個(gè)數(shù)據(jù)集分成1024個(gè)slots,并且將不同的slot保存到不同的組。當(dāng)我們新增加一個(gè)組的時(shí)候,我們會(huì)將一些slots從舊的組遷移到新組中。在重新切分過程中我們將它叫做遷移。在RebornDB中最小的遷移單元是slot。
讓我們從下面的一個(gè)簡(jiǎn)單的例子開始:
我們有兩個(gè)組,group1有兩個(gè)slot 1和2,group2有三個(gè)slot 3、4、5.現(xiàn)在group2的工作量比較大,我們將會(huì)增加group3并將slot5遷移進(jìn)去。
我們可以使用下面的命令來(lái)將slot5從group2遷移至group3。
reborn-config slot migrate 5 2 3
(譯者注:原文為 reborn-config slot migrate 5 5 3有誤)
這個(gè)命令看起來(lái)很簡(jiǎn)單,但是我們需要在內(nèi)部做很多工作來(lái)保證遷移的安全性。我們必須使用兩階段提交協(xié)議(2PC)來(lái)告訴reborn-proxy我們將把slot5從group2遷移至group3。待所有reborn-proxy確認(rèn)并且答復(fù)之后,我們將開始遷移操作。
遷移的流程比較簡(jiǎn)單:從slot5中得到一個(gè)key,從group2遷移它的數(shù)據(jù)至group3,然后刪除group2中的key,如此循環(huán)。最后group2中就沒有slot5的數(shù)據(jù)而所有slot5的數(shù)據(jù)都在group3中。
key的遷移是原子性的,因此無(wú)論這個(gè)key之前是否在group2或者group3中,我們能夠確定的是在執(zhí)行遷移命令之后它是在group3中的。
如果在group2中沒有數(shù)據(jù)是屬于slot5的,我們將停止遷移,拓?fù)浣Y(jié)構(gòu)看起來(lái)是下面這個(gè)樣子:
高可用性(High Availability)
RebornDB使用reborn-agent來(lái)提供HA解決方案。
reborn-agent每時(shí)每刻都在檢查它啟動(dòng)的應(yīng)用是否是活動(dòng)的,如果reborn-agent發(fā)現(xiàn)一個(gè)應(yīng)用掛掉了,它會(huì)重新啟動(dòng)這個(gè)應(yīng)用。
Reborn-agent有點(diǎn)像一個(gè)管理員,但是它有更多的特點(diǎn)。
Reborn-agent提供HTTP Restful API方便我們添加或刪除需要被動(dòng)態(tài)監(jiān)控的應(yīng)用程序。例如:我們能夠使用HTTP “/api/start_redis” API來(lái)啟動(dòng)一個(gè)新的reborn-server,或者“/api/start_proxy” API來(lái)啟動(dòng)一個(gè)新的reborn-proxy,我們也能夠用“/api/stop”來(lái)停止一個(gè)正在運(yùn)行的應(yīng)用并且從目前的監(jiān)控列表中刪除它。
Reborn-agent不僅僅應(yīng)用于本地應(yīng)用的監(jiān)控,同樣適用于后臺(tái)存儲(chǔ)的HA。多個(gè)Reborn-agent將首先通過協(xié)調(diào)器選擇一個(gè)主reborn-agent,它會(huì)不斷檢查后端存儲(chǔ)器是否是活動(dòng)的,如果發(fā)現(xiàn)后端存儲(chǔ)器宕機(jī)了,它就會(huì)進(jìn)行故障轉(zhuǎn)移。如果宕機(jī)的后端存儲(chǔ)器是一個(gè)從節(jié)點(diǎn),reborn-agent將只會(huì)在協(xié)調(diào)器中將它設(shè)置為離線,但是如果它是主節(jié)點(diǎn),reborn-agent將會(huì)從現(xiàn)有的從節(jié)點(diǎn)中選擇一個(gè)作為主節(jié)點(diǎn)并進(jìn)行故障轉(zhuǎn)移操作。
即將要做的......
盡管RebornDB有許多很棒的特性,我們?nèi)匀恍枰嗟墓ぷ魅ミM(jìn)一步提升它,我們后續(xù)可能做這些事情:
-
更好的用戶體驗(yàn):現(xiàn)在運(yùn)行RebornDB并不是那么容易,我們將要做一系列工作諸如初始化slots、添加服務(wù)到group中、分配slots給一個(gè)組等等,在未來(lái)的工作中,如何降低用戶的使用門檻是我們必須要考慮的問題;
-
復(fù)制遷移:現(xiàn)在我們遷移是逐個(gè)key遷移slot,如果一個(gè)slot包含許多數(shù)據(jù)的話速度就不是很快,使用復(fù)制遷移可能會(huì)好很多。在上面的例子中,group2首先產(chǎn)生一個(gè)快照,group3 能夠在那個(gè)時(shí)間點(diǎn)取得所有slot5的數(shù)據(jù),之后group3將從group2增量同步變化的數(shù)據(jù)。當(dāng)我們發(fā)現(xiàn)group3取得了group2中slot5所有變化的數(shù)據(jù)之后,我們將進(jìn)行切換,并從group2中刪除slot5;
-
精美的儀表板:為了提供更好的用戶體驗(yàn),我們希望通過儀表板控制和監(jiān)控一切事務(wù)。基于 P2P的集群:現(xiàn)在RebornDB是一個(gè)基于代理的集群解決方案,我們可能重新設(shè)計(jì)整個(gè)架構(gòu),之后將使用P2P,就像官方redis集群一樣
總結(jié)
構(gòu)建一個(gè)分布式Key-value數(shù)據(jù)庫(kù)不是一件容易的事情,前方的路還很長(zhǎng),我們現(xiàn)在只是邁出了一小步。
如果你想要用一個(gè)像redis的、存儲(chǔ)更多數(shù)據(jù)、支持在分布式系統(tǒng)中動(dòng)態(tài)切分?jǐn)?shù)據(jù)的Key-value數(shù)據(jù)庫(kù),RebornDB將是一個(gè)不錯(cuò)的選擇。
總結(jié)
以上是生活随笔為你收集整理的RebornDB:下一代分布式Key-Value数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos普通用户设置sudo权限
- 下一篇: 利用Memcache解决数据库高并发访问