乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      一個極簡的分布式文件系統(tǒng)

       Coder編程 2020-06-22

      前言

      開源的分布式存儲系統(tǒng)比較多,比較有名的有:Ceph、GlusterFS、HDFS、TFS等。這些系統(tǒng)都比較復(fù)雜,代碼動則幾十上百萬行,這些系統(tǒng)對初學(xué)者來說門檻比較高,特別是對于從事非分布式存儲行業(yè),但又想跨行學(xué)習(xí)分布式的同學(xué)來說,往往有這想法,但是不知道怎么入手。本文介紹之前實現(xiàn)的一個C++極簡版的分布式文件系統(tǒng) https://github.com/goyas/goya-fs, 代碼只有一兩百行,當(dāng)然功能也很粗糙,只實現(xiàn)了簡單的mkdir和ls這兩條命令,但就像剛剛描述的,目的是學(xué)習(xí),也便于大家對分布式有體感之后,方便閱讀其他龐大的分布式存儲系統(tǒng),當(dāng)然以后有空時間也會不斷完善功能。

      對于嵌入式,或者主要是從事單機開發(fā)的程序員來說,沒接觸分布式之前,都會感覺很神秘,往往會被高并發(fā)、海量數(shù)據(jù)分析處理等名詞唬住。其實,職位沒有智商之分,區(qū)別也就在于你有沒有親自動手摸過這些玩意兒。以往的經(jīng)驗告訴我,就算不會的東西,一個版本的時間,只要你稍微努點力基本就會達到行業(yè)的基本水平,當(dāng)然越往上走就要看自己的興趣和時間投入了。

      好了,言歸正傳,下面開始介紹這個簡單的分布式文件系統(tǒng),選用的基礎(chǔ)組件是leveldb + goyas-rpc,leveldb作為存儲底座,goyas-rpc作為進程之間通信使用。有關(guān)leveldb的介紹網(wǎng)上非常多,這里就不再驁述,goyas-rpc可以參考之前的 一個基于protobuf的極簡RPC 這篇文章。

      思考

      如果讓你設(shè)計分布式文件系統(tǒng),你會怎么設(shè)計?
      1、如果自己設(shè)計一個簡單的分布式存儲系統(tǒng),對于文件的讀取存盤,你會怎么設(shè)計?
      2、比如執(zhí)行下面的命令經(jīng)過怎么樣的IO路徑local_file文件才會存儲到磁盤? ./fs_client put local_file /user/ —把local_file文件存放到文件系統(tǒng)/user目錄
      3、怎么讓local_file文件存儲到分布式文件系統(tǒng)的3個不同結(jié)點,并且3副本保存?

      架構(gòu)設(shè)計

      系統(tǒng)架構(gòu)設(shè)計采用經(jīng)典的GFS分布式存儲模型,由3個不同的角色(client、master、chunkserver)負(fù)責(zé)管理不同的事務(wù),client作為客戶端,接受來自用戶的請求。master作為元數(shù)據(jù)及namespace存儲管理。chunkserver和磁盤打交道,作為最終的單機存儲引擎。 執(zhí)行./fs_client put local_file /user/ 命令,會大致經(jīng)歷下面圖里面從左到右的流程,最終調(diào)用系統(tǒng)調(diào)用write把local_file存放到存儲介質(zhì)。

      fs_client

      fs_client用于接受用戶的請求,比如:./fs_client mkdir /file1執(zhí)行這條命令,會最初調(diào)用下面的函數(shù)接口

      int FileSystemImpl::CreateDirectory(char* path) {
        printf("Create directory %s\n", path);
        CreateFileRequest  request;
        CreateFileResponse response;
        request.set_sequence_id(0);
        request.set_file_name(path);
        request.set_type((1<<9)|0755);
        bool ret = rpc_wrapper_->SendRequest(masterserver_stub_, 
          &MasterServer_Stub::CreateFile, &request, &response, 5, 3);
        if (!ret || response.status() != 0) {
          printf("Create directory fail\n");
          return -1;
        }
        
        return 0;
      }

       

      函數(shù)功能:把序列號、文件名及文件類型通過RPC發(fā)送到元數(shù)據(jù)管理進程masterserver進行處理。其實這里比我們經(jīng)常單機環(huán)境寫的fopen、fwrite也就僅僅多了個RPC,需要通過它把不用節(jié)點的信息發(fā)送到其他節(jié)點,呵呵,這就是分布式!再來看看masterserver進程收到這個request消息后干了些啥?

      masterserver

      void MasterServerImpl::CreateFile(google::protobuf::RpcController* controller,
        const ::goya::fs::CreateFileRequest* request,
        goya::fs::CreateFileResponse* response,
        google::protobuf::Closure* done) {
        printf("masterserver create file\n");
        response->set_sequence_id(request->sequence_id());
        const std::string& filename = request->file_name();
        if (filename.empty() || filename[0] != '/') {
          printf("path format error\n");
          response->set_status(3);
          done->Run();
          return ; 
        }
      
        std::string file_value;
        leveldb::Status s;
        s = db_->Get(leveldb::ReadOptions(), filename, &file_value);
        if (s.IsNotFound()) {
          FileInfoProto file_info;
          file_info.set_time(time(NULL));
          file_info.set_type(request->type());
          file_info.SerializeToString(&file_value);
          s = db_->Put(leveldb::WriteOptions(), filename, file_value);
          if (s.ok()) {
            printf("CreateFile %s file\n", filename.c_str());
            response->set_status(0);
          } else {
            printf("CreateFile %s file\n", filename.c_str());
            response->set_status(2);
          }
        } else {
          printf("CreateFile %s fail: already exist\n", filename.c_str());
          response->set_status(1);
        }
        done->Run();
      }

      函數(shù)功能:從收到的消息中提取出文件名作為key,文件類型和時間作為value,然后使用KV存儲引擎leveldb存儲,最后把完成消息通過response發(fā)送給調(diào)用方。這個過程到這里就完了,是不是很簡單?!

      ls命令的功能和上面的介紹相反,就是把上面mkdir創(chuàng)建的文件信息給列出來,這里就不講究了,大家可以去看看源碼,也是非常簡單。

      chunkserver

      待實現(xiàn) 

      寫在最后

      到這里整個分布式文件系統(tǒng)就講解完了,當(dāng)然真正的分布式存儲系統(tǒng)遠(yuǎn)比這個復(fù)雜的太多,不然怎么會到百萬級別的代碼。希望這個簡單的文件系統(tǒng)的講解對你有點幫忙。

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多