博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度开源高性能高可用分布式文件系统BFS
阅读量:6891 次
发布时间:2019-06-27

本文共 2605 字,大约阅读时间需要 8 分钟。

hot3.png

#简介

百度的核心业务和数据库系统依赖分布式文件系统作为底层存储,文件系统的可用性和性能对上层搜索业务的稳定性与效果有着至关重要的影响。现有的分布式文件系统(如HDFS等)是为离线批处理设计的,无法在保证高吞吐的情况下做到低延迟和持续可用,所以我们从搜索的业务特点出发,设计了百度文件系统。

开源地址:

#设计目标

  • 持续可用
  • 高吞吐
  • 低延时
  • 水平扩展

#系统架构:

BFS架构图

系统整体分为NameServer、MetaServer、ChunkServer、SDK、bfs_client、bfs_mount 6个模块

  • NameServer负责目录树的管理
  • MetaServer负责对ChunkServer以及当前block状态的管理
  • ChunkServer负责数据的存储和读写
  • SDK是以静态库的形式发布的系统API
  • bfs_client作为管理集群的二进制工具
  • bfs_mount用于将BFS挂载到本地

#特点

  • NameServer高可用 多台NameServer之间自动选主,并通过Raft协议进行同步,当主宕机后,剩余NameServer会自动选出新主,不影响集群的可用性
  • 高吞吐,低延时 ChunkServer写流程异步化,最大化存储介质IO吞吐,全局负载均衡,支持链式写与扇出写模式,遇到慢节点时自动规避
  • 高可靠 ChunkServer宕机后快速进行副本恢复,根据存货副本数区别恢复优先级,支持自动将不同副本进行多机房部署,保证数据不丢失
  • 水平扩展 支持两地三机房,1万+台机器管理

#快速使用

使用单机搭建BFS模拟集群,只需要三步:`

  1. 下载BFS源码

    git clone https://github.com/baidu/bfs

  2. 一键编译

cd bfs; ./build.sh

  1. 一键启动

cd sandbox; ./deploy.sh; start_bfs.sh

到这里,一个用来在单机上测试的BFS集群便已经搭建完成了~   可以通过bfs_client上传一个文件进行测试:./bfs_client put XXX YYY,其中XXX为本地任意文件,YYY为希望放到BFS上后的文件名。

#SDK使用

执行make install,会将使用SDK所需的头文件及静态库放到output目录下,只需包含对应的头文件,链接libbfs.a静态库,便可以在程序中使用BFS存储数据

示例代码如下:

#include 
#include "bfs.h"int main(int argc, char* argv[]){ if (argc < 3) { std::cerr << "Usage ./main
" << std::endl; exit(EXIT_FAILURE); } baidu::bfs::FS* fs; if (!baidu::bfs::FS::OpenFileSystem("bfs.flag", &fs_, FSOptions())) { std::cerr << "Open filesytem failed " << FLAGS_nameserver_nodes << std::endl; exit(EXIT_FAILURE); } FILE* fp = fopen(source.c_str(), "rb"); if (fp == NULL) { std::cerr << "Open local file failed" << std::endl; exit(EXIT_FAILURE); } baidu::bfs::File* file; if (fs_->OpenFile(filename.c_str(), O_WRONLY | O_TRUNC, 664, &file, WriteOptions()) != OK) { std::cerr << "Open BFS file failed " << filename << std::endl; exit(EXIT_FAILURE); } char buf[10240]; int64_t len = 0; int32_t bytes = 0; while ( (bytes = fread(buf, 1, sizeof(buf), fp)) > 0) { int32_t write_bytes = file->Write(buf, bytes); if (write_bytes < bytes) { std::cerr << "Write to BFS failed" << std::endl; exit(EXIT_FAILURE); } len += bytes; } fclose(fp); if (file->Close() != 0) { std::cerr << "Close BFS file failed" << std::endl; exit(EXIT_FAILURE); } delete file; return 0;}

#挂载到本地使用

BFS支持将某个目录挂载到本地进行使用,方法如下:

  1. 编译挂载工具

    make bfs_mount

  2. 进行挂载

nohup ./bfs_mount -d /home/xxx/ -c localhost:8828 -p /yyy > fuse_log 2>&1 &

其中,/home/xxx为需要挂载到的本地目录,localhost:8828为BFS集群的NameServer地址,/yyy为需要挂载的BFS目录 3. 使用 可以cd到/home/xxx目录下,像使用本地文件系统一样使用BFS

支持团队

百度网页搜索部开源团队

转载于:https://my.oschina.net/u/2984065/blog/788518

你可能感兴趣的文章
哥伦布计划
查看>>
torch中squeeze与unsqueeze用法
查看>>
mate桌面用户 root 自动登录lightdm.conf -20190520 方法【fedora 21】mate
查看>>
kmp算法
查看>>
python项目虚拟环境搭建
查看>>
nginx+tomcat动静分离的核心配置
查看>>
【转载】ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
android-自定义控件及属性
查看>>
综合练习:词频统计
查看>>
利用伪元素实现任意列数的均匀布局
查看>>
查看Android系统图片(缩放)
查看>>
oracle学习6
查看>>
如何正确地使用android中的progressdialog
查看>>
http协议参数详解
查看>>
Python字符串格式化
查看>>
关于synchronized关键字
查看>>
第3章 高级装配
查看>>
c++拷贝构造函数详解
查看>>
C语言博客作业03--函数
查看>>
使用urllib和http.cookiejar获取python老男孩学员成绩
查看>>