百度開源高性能高可用分佈式文件系統BFS

#簡介node

百度的核心業務和數據庫系統依賴分佈式文件系統做爲底層存儲,文件系統的可用性和性能對上層搜索業務的穩定性與效果有着相當重要的影響。現有的分佈式文件系統(如HDFS等)是爲離線批處理設計的,沒法在保證高吞吐的狀況下作到低延遲和持續可用,因此咱們從搜索的業務特色出發,設計了百度文件系統。ios

開源地址:https://github.com/baidu/bfsgit

#設計目標github

  • 持續可用
  • 高吞吐
  • 低延時
  • 水平擴展

#系統架構:數據庫

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 <iostream>
#include "bfs.h"
int main(int argc, char* argv[])
{
    if (argc < 3) {
    std::cerr << "Usage ./main <source_file> <target_file>" << 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

支持團隊

百度網頁搜索部開源團隊 opensearch@baidu.com

相關文章
相關標籤/搜索