分散KV-1スタンドアロンKVの実装

分散KV-1スタンドアロンKVの実装

[[437220]]

この記事はWeChatの公開アカウント「roseduanの執筆場所」から転載したもので、著者はroseduanです。この記事を転載する場合は、roseduanが執筆しているローカルの公開アカウントまでご連絡ください。

多くのコードフレームワークが提供されており、特定のロジックを記入するだけで済む、シンプルな分散 kv を実現することを目的としています。

このコースは 4 つのプロジェクトに分かれています。

  • スタンドアロンKV
  • ラフトKV
  • マルチラフトKV
  • 取引

KV のスタンドアロン バージョン、ラフト (およびマルチラフト) コンセンサス アルゴリズムに基づく KV、および分散トランザクションを備えた KV を実装する必要があります。難しくない最初のスタンドアロン KV を除いて、他のプロジェクトは手書きのラフト アルゴリズムと分散トランザクションを伴い、非常に困難です。

もちろん、このコースは分散ストレージの分野を始めて実践するための優れた学習リソースでもあるので、自分の学習プロセスを記録してください。

今日の記事では、最初のプロジェクトについて見ていきます。

最初のプロジェクトは、Badger を統合して、シンプルなスタンドアロン kv を実装することです。

Badger は、LSM ツリーに基づく優れたオープン ソースのスタンドアロン kv ストレージ エンジンであり、優れた読み取りおよび書き込みパフォーマンスを備えています。したがって、Badger の使い方をよく理解しておく必要があります。公式の例を参照できます: github.com/dgraph-io/bager。

TinyKV では、ストレージ層は、ラフト ストレージ、メモリ ストレージ、スタンドアロン ストレージを実装する抽象インターフェイスです。ここでは、スタンドアロン ストレージを実装するだけで済みます。

具体的な実装は、kv/storage/standalone_storage/standalone_storage.go にあります。 Badger をカプセル化してから、ストレージ インターフェイスで定義されたいくつかのメソッドを実装する必要があります。

構造の定義は次のとおりです。

  1. タイプStandAloneStorage構造体{
  2. // ここにあなたのデータを入力してください (1)。
  3. バッジャDB *バッジャ.DB
  4. オプション アナグマ.オプション
  5. }

Reader メソッドでは、StorageReader インターフェイスを返す必要があることに注意してください。これは抽象的なインターフェースであり、特定のロジックをカスタマイズする必要があります。

  1. func (s *StandAloneStorage) Reader(ctx *kvrpcpb.Context) (storage.StorageReader, error) {
  2. // ここにコードを記述します (1)。
  3. トランザクション:= s.badgerDB.NewTransaction( false )
  4. リーダー:= NewStandaloneReader(txn)
  5. リーダーを返す、nil
  6. }

たとえば、StandaloneReader を定義しました。

  1. StandaloneReader 構造体型 {
  2. 送信 *バジャー.送信
  3. }
  4.  
  5. func NewStandaloneReader(txn *badger.Txn) *StandaloneReader {
  6. &StandaloneReader{を返す
  7. 送信: 送信、
  8. }
  9. }

これを完了したら、kv/server/raw_api.go 内の対応する gRPC インターフェースを改善し、渡されたパラメータを直接解析して、Storage インターフェース内のメソッドを呼び出す必要があります。次に例を示します。

  1. func (server *Server) RawGet(_ context.Context, req *kvrpcpb.RawGetRequest) (resp *kvrpcpb.RawGetResponse, err error) {
  2. // ここにコードを記述します (1)。
  3. 応答 = &kvrpcpb.RawGetResponse{}
  4.  
  5. // ストレージ リーダーを取得します。
  6. var リーダーストレージ.StorageReader
  7. リーダー、エラー = server.storage.Reader(req.Context)
  8. err != nil の場合 {
  9. 戻る 
  10. }
  11. 読者を延期します。近い()
  12.  
  13. val, err := reader.GetCF(req.Cf, req. Key )
  14. len(val) == 0 の場合 {
  15. 回答: NotFound = true  
  16. }
  17. それぞれ値 = val
  18. 戻る 
  19. }

ここでいくつかのインターフェースを完了すると、完全なスタンドアロン KV が完成します。

TinyKV コードをクローンし、私のペースに従ってステップ バイ ステップで実行してください。分散ストレージの分野について予備的な理解が得られると思います。

<<:  チップ不足、エッジコンピューティング、IoTが2022年のIT変革を推進する

>>:  世界の医療クラウドコンピューティング市場規模は2026年に768億ドルに達すると予想されている

推薦する

中国の母子産業研究報告書

コア要約:発展の歴史:過去30年間の中国の急速な経済発展に伴い、母子保健産業は初期の形成、急速な発展...

自動車会社はどのようにして1兆ドル規模のスマートトラベル市場に参入できるのでしょうか?

周知のとおり、自動車産業はここ数年、100年ぶりの大変革を迎え、2つの分野で徹底的な「進化」を遂げて...

ユーザーエクスペリエンスにおけるいくつかの誤解と、それを効果的に回避してコンバージョン率を向上させる方法について簡単に説明します。

今日、インターネットはユーザーエクスペリエンスにますます注目しています。一部の大規模なウェブサイトは...

2021 年に注目すべき 5 つのオープンソース Kubernetes プロジェクト

オープンソース プロジェクトにより、Kubernetes はさらに強力になります。 Java、可観測...

2020 年クラウド コンピューティングの現状レポート: クラウドの導入とテクノロジーのトレンド

Flexera が発表した年次調査は、クラウド コンピューティング市場で最も期待されている調査レポー...

南アフリカのcn2 giaネットワークをご紹介します - justgの南アフリカのcn2 gia VPSの簡単なレビュー

南アフリカの cn2 gia VPS をインターネット全体でほぼ最安値で作ったのではないですか? か...

Baiduのアルゴリズムは頻繁に調整されるため、SEO担当者は対応する必要がある

2012 年 2 月以来、Baidu は頻繁にアルゴリズムを調整しています。アルゴリズム調整の影響は...

草の根講堂の最初のゲストである孫永輝氏は、微博と微信について話した。

みなさんこんにちは。私の名前はSun Yonghuiです。まず、AruiさんからWeiboとWeCh...

マルチチャネルプロモーションにおいてアトリビューションモデルはどの程度重要ですか?コンバージョンコストを一気に削減する秘訣!

今日は、オンラインプロモーションのプロセスにアトリビューションモデルを適用する価値についてお話しした...

Pinduoduo が Pinxiaoquan をリリース、信頼から販売へ?

最近、 Pinduoduoは2019年第4四半期の財務報告を発表し、2019年のGMVは1兆元を超え...

Baidu SEO ガイド - ユーザー エクスペリエンス分析

ウェブマスターは「Baidu Search Engine Optimization Guide」をよ...

Dockerデプロイメントを試してみましょう

[[416152]]この記事はWeChatの公開アカウント「Sea Monster Who Writ...

金融攻撃:NetEase Cloudの専用クラウドがFucong Financialのビジネスシナリオの革新を支援

インターネット時代の後半に入り、多くの業界関係者は周鴻一に対する懐かしさをますます表明し、「エコ反撃...

Vultr - Alipay/日本/シンガポールおよびその他 15 のデータセンターへのアクセス、月額 2.5 ドル、Windows をサポート

VPSクラウドブランドVultr.comは、数年の運営を経て、ついにAlipay決済方法に正式に接続...

ASO をゼロから学ぶ: 10 分で ASO を完全にマスターできます!

最新の統計によると、中国は米国に次いでiOSアプリのダウンロード数で第2位の国となった。巨大な市場ス...