av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

實現(xiàn)分布式Kv-1StandaloneKV

實現(xiàn)分布式 Kv-1 Standalone KV

作者: roseduan 2021-11-29 10:41:09
存儲
存儲軟件
分布式 在 TinyKV 中,存儲層是一個抽象接口,分別實現(xiàn)了 raft storage、mem storage、standalone storage,這里我們只需要實現(xiàn) standalone storage 就行了。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比盈江網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式盈江網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋盈江地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。

本文轉(zhuǎn)載自微信公眾號「roseduan寫字的地方」,作者roseduan。轉(zhuǎn)載本文請聯(lián)系roseduan寫字的地方公眾號。

旨在實現(xiàn)一個簡易的分布式 kv,其中很多代碼框架它已經(jīng)提供了,我們只需要填充具體的邏輯即可。

這個課程分為了 4 個 Project:

  • Standlone KV
  • Raft KV
  • Multi Raft KV
  • Transaction

分別需要實現(xiàn)單機版 kv、基于 raft(和 multi raft) 一致性算法的 kv、具有分布式事務(wù)的 kv,除了第一個 standalone kv 沒有什么難度之外,其他的幾個 Project 都非常的有挑戰(zhàn),涉及到手寫 raft 算法以及分布式事務(wù)。

當(dāng)然這個課程也是入門和實踐分布式存儲領(lǐng)域的挺好的學(xué)習(xí)資源,因此記錄一下自己的學(xué)習(xí)歷程。

今天這篇文章先來看看第一個 Project。

第一個 Project 是集成 Badger,實現(xiàn)一個簡易的單機版 kv。

Badger 是一個很優(yōu)秀的開源的單機版 kv 存儲引擎,基于 LSM Tree 實現(xiàn),讀寫性能都很好,因此需要簡單熟悉下 Badger 的用法,可以參考下官方示例:github.com/dgraph-io/bager。

在 TinyKV 中,存儲層是一個抽象接口,分別實現(xiàn)了 raft storage、mem storage、standalone storage,這里我們只需要實現(xiàn) standalone storage 就行了。

具體的實現(xiàn),在 kv/storage/standalone_storage/standalone_storage.go 中,需要封裝一下 Badger,然后實現(xiàn) storage 接口中定義的幾個方法。

這里貼一下結(jié)構(gòu)體的定義:

  
 
 
  1. type StandAloneStorage struct { 
  2.   // Your Data Here (1). 
  3.   badgerDB *badger.DB 
  4.   options badger.Options 

需要說明的是,在 Reader 方法中,需要返回一個 StorageReader 接口,這是一個抽象接口,具體邏輯需要我們自定義。

  
 
 
  1. func (s *StandAloneStorage) Reader(ctx *kvrpcpb.Context) (storage.StorageReader, error) { 
  2.   // Your Code Here (1). 
  3.   txn := s.badgerDB.NewTransaction(false) 
  4.   reader := NewStandaloneReader(txn) 
  5.   return reader, nil 

例如我定義了一個 StandaloneReader:

  
 
 
  1. type StandaloneReader struct { 
  2.   txn *badger.Txn 
  3.  
  4. func NewStandaloneReader(txn *badger.Txn) *StandaloneReader { 
  5.   return &StandaloneReader{ 
  6.     txn: txn, 
  7.   } 

這里完成之后,還需要在 kv/server/raw_api.go 中完善相應(yīng)的 gRPC 接口,直接解析傳過來的參數(shù),然后調(diào)用 Storage 接口中的方法即可。這里展示一個示例:

  
 
 
  1. func (server *Server) RawGet(_ context.Context, req *kvrpcpb.RawGetRequest) (resp *kvrpcpb.RawGetResponse, err error) { 
  2.   // Your Code Here (1). 
  3.   resp = &kvrpcpb.RawGetResponse{} 
  4.  
  5.   // get storage reader. 
  6.   var reader storage.StorageReader 
  7.   reader, err = server.storage.Reader(req.Context) 
  8.   if err != nil { 
  9.     return 
  10.   } 
  11.   defer reader.Close() 
  12.  
  13.   val, err := reader.GetCF(req.Cf, req.Key) 
  14.   if len(val) == 0 { 
  15.     resp.NotFound = true 
  16.   } 
  17.   resp.Value = val 
  18.   return 

這里的幾個接口完成之后,一個完整的 Standalone KV 就完成了。

你可以把 TinyKV 的代碼 clone 下來,然后自己跟著我的節(jié)奏做,一步一步堅持下去,相信能夠在分布式存儲領(lǐng)域有個初步的認知。


分享標(biāo)題:實現(xiàn)分布式Kv-1StandaloneKV
文章源于:http://uogjgqi.cn/article/djdesid.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流