五分鐘快速實(shí)現(xiàn)leveldb中數(shù)據(jù)的高可靠
眾所周知,leveldb是Google的Sanjay Ghemawat和Jeff Dean兩位大神編寫(xiě)的一個(gè)高性能KV引擎,使用起來(lái)非常方便。然而,開(kāi)源版本的leveldb將所有數(shù)據(jù)存放在了本地磁盤(pán),如果本地磁盤(pán)發(fā)生故障,可能導(dǎo)致部分甚至全部數(shù)據(jù)丟失(例如MANIFEST丟失),這對(duì)于使用者來(lái)說(shuō)無(wú)疑會(huì)帶來(lái)災(zāi)難性的后果。在這時(shí),數(shù)據(jù)的高可靠便成為了一個(gè)至關(guān)重要的問(wèn)題,本篇博文將帶你五分鐘快速實(shí)現(xiàn)leveldb中數(shù)據(jù)存儲(chǔ)的高可靠。
百度開(kāi)源的分布式文件系統(tǒng)BFS(開(kāi)源地址:https://github.com/baidu/bfs)提供了mount工具,可以將整個(gè)分布式文件系統(tǒng)直接掛載到本地目錄,從而可以像操作本地文件一樣來(lái)操作分布式文件系統(tǒng)中的文件,我們可以利用分布式文件系統(tǒng)本身提供的數(shù)據(jù)高可靠特性來(lái)保證leveldb中數(shù)據(jù)的安全。
1. 首先下載BFS源碼
- git clone git@github.com:baidu/bfs.git
2. 然后編譯所需要的二進(jìn)制文件
- cd bfs; make && make bfs_mount
編譯完成后,會(huì)在當(dāng)前目錄下生成啟動(dòng)BFS所需要的nameserver、chunkserver二進(jìn)制,以及掛載工具bfs_mount
3. 啟動(dòng)BFS集群(本地模擬分布式環(huán)境)
- cd sandbox; ./depoly.sh; ./start_bfs.sh
執(zhí)行成功后,會(huì)在本地啟動(dòng)一個(gè)包含一個(gè)Nameserver,4個(gè)Chunkserver的小集群,其中Nameserver占用的端口為8827
4. 將BFS集群掛載到本地
- cd ../; mkdir bfs_dir; nohup ./bfs_mount -d ./bfs_dir -c localhost:8827 -p / 1>fuse_mount.log 2>&1 &
其中,-d表示輸出debug日志,./bfs_dir表示將BFS掛載到本地的bfs_dir目錄下,-c localhost:8827指明了BFS集群的地址,上一步中的start_bfs.sh會(huì)在本地的8827端口啟動(dòng)BFS的Nameserver,-p /指定將BFS的根目錄進(jìn)行掛載
至此,與BFS所做的相關(guān)準(zhǔn)備工作已經(jīng)全部完成~
接下來(lái),可以將自己程序中l(wèi)eveldb的數(shù)據(jù)寫(xiě)到BFS中,如果有不熟悉leveldb的同學(xué),可以參考下面的使用示例:
- #include <stdio.h>
- #include <leveldb/db.h>
- int main()
- {
- leveldb::DB* db_;
- leveldb::Options options;
- options.create_if_missing = true;
- leveldb::Status s = leveldb::DB::Open(options, "./bfs_dir/ldb_data/", &db_);
- if (!s.ok()) {
- printf("Open db fail\n");
- return -1;
- }
- std::string test_key("hello"), test_value("world");
- s = db_->Put(leveldb::WriteOptions(), test_key, test_value);
- if (!s.ok()) {
- printf("Write db fail\n");
- return -1;
- }
- return 0;
- }
到這里是不是有點(diǎn)小激動(dòng)?即使本地磁盤(pán)掛掉,BFS自動(dòng)會(huì)進(jìn)行副本恢復(fù),保證數(shù)據(jù)不丟失。
更重要的是,只要在其它機(jī)器上同樣掛載BFS相應(yīng)目錄,便可以不需要任何代價(jià)的,在另外的機(jī)器上對(duì)同樣一個(gè)leveldb進(jìn)行操作。(鑒于同一個(gè)leveldb同一時(shí)刻只允許被一個(gè)進(jìn)程打開(kāi),前提需要此機(jī)器已經(jīng)正確的將自己打開(kāi)的leveldb關(guān)閉)這樣,就相當(dāng)于數(shù)據(jù)毫無(wú)代價(jià)的從一臺(tái)機(jī)器『遷移』到了另外一臺(tái)機(jī)器,是不是很炫酷?可能有些同學(xué)發(fā)現(xiàn)了什么:對(duì),其實(shí)BigTable的模型正是如此~ 如果有希望繼續(xù)深入了解的同學(xué),可以移步百度開(kāi)源的,目前已經(jīng)存儲(chǔ)了萬(wàn)億級(jí)別網(wǎng)頁(yè)數(shù)據(jù)的分布式數(shù)據(jù)庫(kù)Tera(開(kāi)源地址:http://github.com/baidu/tera),正是通過(guò)類(lèi)似的原理,在保證數(shù)據(jù)安全的情況下,可以實(shí)現(xiàn)快速的負(fù)載均衡,分裂合并等特性。





























