ホームページ >バックエンド開発 >Golang >KV ストアのキーはどのようにロックされますか?

KV ストアのキーはどのようにロックされますか?

WBOY
WBOY転載
2024-02-09 13:20:09957ブラウズ

KV Store 中的密钥是如何锁定的?

php エディター Zimo が、KV ストアのキーロックの秘密を公開します。 KV ストアでは、キー ロックは一連の複雑なアルゴリズムとテクノロジーを通じて実現されます。まず、システムはキーごとに一意の識別子を生成し、対応する値とともにデータベースに保存します。同時に、システムはハッシュ関数を使用してキーを暗号化し、セキュリティを確保します。さらに、システムはアクセス制御リスト (ACL) を使用してキーへのアクセスを制限し、許可されたユーザーのみが読み取りおよび書き込み操作を実行できるようにします。これらのセキュリティ対策により、KV ストアはキーのセキュリティと信頼性を確保し、安全で信頼性の高いデータ ストレージ サービスをユーザーに提供します。

質問の内容

分散システムと同時実行性について詳しく学ぶために、分散 kv ストアを構築しています。私が構築している kv ストレージの実装は完全にトランザクション対応であり、インメモリ トランザクション ログを備えています。物事をシンプルにするために、ストレージも完全にメモリ内にあります。 API は、getinsertupdateremove を公開します。すべてのエンドポイントは、一連のキーではなく、単一のキーで動作することに注意してください。

私はロックを通じて同時実行性を管理しています。ただし、データ ストア全体をロックするグローバル ロックがあります。 k2 の更新中に k1 の値を読みたい場合、それは関係ありませんが、k2 の更新が完了するまで待たなければならないため、これは非常に非効率的に思えます。

一部のデータベースでは、よりきめ細かいロックが使用されていると思います。たとえば、mysql サーバーには行レベルのロックがあります。キーレベルのロックを実装するにはどうすればよいですか?

###私は持っている### リーリー

次のようなものを追加する必要がありますか? :

リーリー

これを行う場合、問題は、

locks

store の同期を維持する必要があることです。別のオプションは 2 つのマップをマージすることですが、その場合でも、remove リクエストが get より前に来ると、ロック中に remove リクエストがマップ内のエントリを削除することになります。 ###問題。 ソリューション

コンセプトパート

###貿易###

まず第一に、強整合性にはトランザクション ログは必要ありません。トランザクション ログは、Acid プロパティを維持するのに役立ちます。

トランザクションも、データベースの強整合性の厳密な要件ではありませんが、多くの状況で整合性を確保するための便利なツールとなります。

強力な一貫性とは、読み取り操作がどこで実行されたかに関係なく、データベースからのすべての読み取りで最新の書き込みが返されることを保証するプロパティを指します。言い換えれば、強力な一貫性は、すべてのクライアントが同じデータを参照できること、およびデータがシステム全体で最新で一貫性があることを保証します。

paxos や raft などのコンセンサス アルゴリズムを使用して、強力な一貫性を確保できます。データを保存するときに、データのバージョンを保存し、それを paxos の ID として使用できます。

KVストレージをロック

キー/値 (kv) ストアでは、通常、ミューテックスやリーダー/ライター ロック (@paulsm4 が提案したように) など、ある種のロック メカニズムを使用してキーがロックされます。これにより、データの一貫性と正確性を確保しながら、複数のスレッドまたはプロセスが kv ストア内のデータに同時にアクセスして変更できるようになります。

たとえば、スレッドまたはプロセスが kv ストア内の特定のキーを読み取りまたは変更したい場合、そのキーのロックを取得できます。これにより、他のスレッドまたはプロセスが同じキーを同時に変更して、競合状態やその他の問題が発生するのを防ぎます。スレッドまたはプロセスがキーの読み取りまたは変更を完了すると、ロックを解放して、他のスレッドまたはプロセスがキーにアクセスできるようにします。

kv ストレージでキーをロックする方法の具体的な詳細は、kv ストレージの実装によって異なる場合があります。一部の KV ストアでは、データ ストア全体をロックするためにグローバル ロック (すでに行っているように、非効率な場合があります) を使用する場合がありますが、他の KV ストアでは、行レベルのロックやキーレベルのロックなど、よりきめの細かいロック メカニズムを使用する場合があります。より多くの操作を許可します。データへの同時アクセス。

ということで、tldr; 概念的には、あなたの言う通りです。問題はロックの実装の詳細にあります。

###コーディング###

ロックに関する質問に厳密に答えるには、@paulsm4 が提案した

リーダー/ライター ロック

を検討してください。 golang では、同様のロックは

rwmutex

です。 同期に使用されます。地図######。### これは短い例です: リーリー これに加えて、レプリカ間の一貫性を確保するために paxos が必要です。

以上がKV ストアのキーはどのようにロックされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。