掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者: 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:
分別需要實現(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)體的定義:
- type StandAloneStorage struct {
- // Your Data Here (1).
- badgerDB *badger.DB
- options badger.Options
- }
需要說明的是,在 Reader 方法中,需要返回一個 StorageReader 接口,這是一個抽象接口,具體邏輯需要我們自定義。
- func (s *StandAloneStorage) Reader(ctx *kvrpcpb.Context) (storage.StorageReader, error) {
- // Your Code Here (1).
- txn := s.badgerDB.NewTransaction(false)
- reader := NewStandaloneReader(txn)
- return reader, nil
- }
例如我定義了一個 StandaloneReader:
- type StandaloneReader struct {
- txn *badger.Txn
- }
- func NewStandaloneReader(txn *badger.Txn) *StandaloneReader {
- return &StandaloneReader{
- txn: txn,
- }
- }
這里完成之后,還需要在 kv/server/raw_api.go 中完善相應(yīng)的 gRPC 接口,直接解析傳過來的參數(shù),然后調(diào)用 Storage 接口中的方法即可。這里展示一個示例:
- func (server *Server) RawGet(_ context.Context, req *kvrpcpb.RawGetRequest) (resp *kvrpcpb.RawGetResponse, err error) {
- // Your Code Here (1).
- resp = &kvrpcpb.RawGetResponse{}
- // get storage reader.
- var reader storage.StorageReader
- reader, err = server.storage.Reader(req.Context)
- if err != nil {
- return
- }
- defer reader.Close()
- val, err := reader.GetCF(req.Cf, req.Key)
- if len(val) == 0 {
- resp.NotFound = true
- }
- resp.Value = val
- return
- }
這里的幾個接口完成之后,一個完整的 Standalone KV 就完成了。
你可以把 TinyKV 的代碼 clone 下來,然后自己跟著我的節(jié)奏做,一步一步堅持下去,相信能夠在分布式存儲領(lǐng)域有個初步的認知。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流