五分钟快速实现leveldb中数据的高可靠

云计算 虚拟化
leveldb是Google的Sanjay Ghemawat和Jeff Dean两位大神编写的一个高性能KV引擎,使用起来非常方便。然而,开源版本的leveldb将所有数据存放在了本地磁盘,如果本地磁盘发生故障,可能导致部分甚至全部数据丢失(例如MANIFEST丢失),这对于使用者来说无疑会带来灾难性的后果。

[[178361]]

众所周知,leveldb是Google的Sanjay Ghemawat和Jeff Dean两位大神编写的一个高性能KV引擎,使用起来非常方便。然而,开源版本的leveldb将所有数据存放在了本地磁盘,如果本地磁盘发生故障,可能导致部分甚至全部数据丢失(例如MANIFEST丢失),这对于使用者来说无疑会带来灾难性的后果。在这时,数据的高可靠便成为了一个至关重要的问题,本篇博文将带你五分钟快速实现leveldb中数据存储的高可靠。

百度开源的分布式文件系统BFS(开源地址:https://github.com/baidu/bfs)提供了mount工具,可以将整个分布式文件系统直接挂载到本地目录,从而可以像操作本地文件一样来操作分布式文件系统中的文件,我们可以利用分布式文件系统本身提供的数据高可靠特性来保证leveldb中数据的安全。

1. 首先下载BFS源码

  1. git clone git@github.com:baidu/bfs.git 

2. 然后编译所需要的二进制文件

  1. cd bfs; make && make bfs_mount 

编译完成后,会在当前目录下生成启动BFS所需要的nameserver、chunkserver二进制,以及挂载工具bfs_mount

3. 启动BFS集群(本地模拟分布式环境)

  1. cd sandbox; ./depoly.sh; ./start_bfs.sh 

执行成功后,会在本地启动一个包含一个Nameserver,4个Chunkserver的小集群,其中Nameserver占用的端口为8827

4. 将BFS集群挂载到本地

  1. 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会在本地的8827端口启动BFS的Nameserver,-p /指定将BFS的根目录进行挂载

至此,与BFS所做的相关准备工作已经全部完成~

接下来,可以将自己程序中leveldb的数据写到BFS中,如果有不熟悉leveldb的同学,可以参考下面的使用示例:

  1. #include <stdio.h>  
  2. #include <leveldb/db.h>  
  3. int main() 
  4.     leveldb::DB* db_; 
  5.     leveldb::Options options; 
  6.     options.create_if_missing = true
  7.     leveldb::Status s = leveldb::DB::Open(options, "./bfs_dir/ldb_data/", &db_); 
  8.     if (!s.ok()) { 
  9.         printf("Open db fail\n"); 
  10.         return -1; 
  11.     } 
  12.     std::string test_key("hello"), test_value("world"); 
  13.     s = db_->Put(leveldb::WriteOptions(), test_key, test_value); 
  14.     if (!s.ok()) { 
  15.         printf("Write db fail\n"); 
  16.         return -1; 
  17.     } 
  18.     return 0; 

到这里是不是有点小激动?即使本地磁盘挂掉,BFS自动会进行副本恢复,保证数据不丢失。

更重要的是,只要在其它机器上同样挂载BFS相应目录,便可以不需要任何代价的,在另外的机器上对同样一个leveldb进行操作。(鉴于同一个leveldb同一时刻只允许被一个进程打开,前提需要此机器已经正确的将自己打开的leveldb关闭)这样,就相当于数据毫无代价的从一台机器『迁移』到了另外一台机器,是不是很炫酷?可能有些同学发现了什么:对,其实BigTable的模型正是如此~ 如果有希望继续深入了解的同学,可以移步百度开源的,目前已经存储了万亿级别网页数据的分布式数据库Tera(开源地址:http://github.com/baidu/tera),正是通过类似的原理,在保证数据安全的情况下,可以实现快速的负载均衡,分裂合并等特性。

责任编辑:武晓燕 来源: 开源博客
相关推荐

2021-01-11 09:33:37

Maven数目项目

2009-11-16 09:53:56

PHP上传类

2023-07-30 10:09:36

MMD数据库

2022-02-23 20:38:32

云原生集群Postgres

2018-02-02 16:08:32

互联网大数据数据分析

2022-12-13 10:05:27

定时任务任务调度操作系统

2020-06-16 08:47:53

磁盘

2023-10-06 20:21:28

Python链表

2009-10-21 18:19:36

VB.NET实现拖放

2021-01-27 08:03:53

项目Web外网

2009-11-16 10:53:30

Oracle Hint

2021-03-03 16:33:24

web项目外网

2023-10-06 19:21:49

Initializr应用Spring

2022-05-30 08:05:11

架构

2009-11-06 10:25:34

WCF元数据交换

2009-11-20 18:08:37

Oracle数据库

2009-11-17 14:50:50

Oracle调优

2022-12-16 09:55:50

网络架构OSI

2021-12-01 06:50:50

Docker底层原理

2023-07-23 18:47:59

Docker开源
点赞
收藏

51CTO技术栈公众号