自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

存儲(chǔ) 存儲(chǔ)軟件 分布式
在 TinyKV 中,存儲(chǔ)層是一個(gè)抽象接口,分別實(shí)現(xiàn)了 raft storage、mem storage、standalone storage,這里我們只需要實(shí)現(xiàn) standalone storage 就行了。

[[437220]]

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

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

這個(gè)課程分為了 4 個(gè) Project:

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

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

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

今天這篇文章先來(lái)看看第一個(gè) Project。

第一個(gè) Project 是集成 Badger,實(shí)現(xiàn)一個(gè)簡(jiǎn)易的單機(jī)版 kv。

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

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

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

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

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

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

  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 

例如我定義了一個(gè) 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 接口,直接解析傳過(guò)來(lái)的參數(shù),然后調(diào)用 Storage 接口中的方法即可。這里展示一個(gè)示例:

  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 

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

 

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

 

責(zé)任編輯:武曉燕 來(lái)源: roseduan寫(xiě)字的地方
相關(guān)推薦

2021-12-20 07:51:17

分布式 Kv分布式 Kv

2022-04-12 15:53:24

存儲(chǔ)緩存分布式

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數(shù)據(jù)分布式鎖

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2024-11-28 15:11:28

2015-05-18 09:59:48

ZooKeeper分布式計(jì)算Hadoop

2019-05-05 08:37:39

分布式PyTorchGPU

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2023-01-13 07:39:07

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2017-09-01 05:35:58

分布式計(jì)算存儲(chǔ)

2019-06-19 15:40:06

分布式鎖RedisJava

2023-02-06 09:44:35

美圖開(kāi)源kv存儲(chǔ)

2023-07-30 17:34:53

KV存儲(chǔ)ChunkPosit

2012-07-20 14:48:54

Nginx測(cè)試

2017-10-27 08:40:44

分布式存儲(chǔ)剪枝系統(tǒng)

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)