クラウド ネイティブ Etcd シリーズ: クォーラムと投票

クラウド ネイティブ Etcd シリーズ: クォーラムと投票

[[438630]]

この記事はWeChatの公開アカウント「Qiya Cloud Storage」から転載したもので、著者はQiyaです。この記事を転載する場合は、Qiya Cloud Storage 公式アカウントまでご連絡ください。

クォーラムの2つの側面

前回の記事では、さまざまなフレームワークやデザインのアイデアについてお話ししました。今日はちょっとしたポイントを共有したいと思います。etcd のクォーラムはどのように実装されているのでしょうか?

クォーラム メカニズムの本質は多数決にあり、これには 2 つの側面があります。

  • 選挙プロセス: ノード投票の過半数を獲得したノードが勝利し、リーダーになります。
  • 実行中のプロセス: 大多数のノードによってコミットされたログの場所は、クラスターによって確実に記録される場所です。クラスターによってコミットされたログのみを適用できます。

そこで、考えるべき 2 つの小さな質問があります。

選挙ですので、選挙結果はどのように発表されるのでしょうか?

実行中のプロセスなので、クラスター内のこれらのノードはクラスターのコミット位置をどのように確認するのでしょうか?

選挙があるところには投票がある

投票を数えることは選挙プロセスにおけるステップです。クラスのリーダーを選ぶとき、黒板に「正」という言葉を書き、最も多くの票を獲得した人が選ばれることを今でも覚えています。

etcd にはリーダー選挙と呼ばれる選挙もあります。リーダーが勝利するための基準は、その投票が過半数を満たすこと、つまり定足数メカニズムを満たすことです。

今日は、etcd の投票カウントの仕組みを見てみましょう。

それは非常にシンプルなアイデアです。私たちは選挙に参加するすべての友人の投票を数えます。投票の半分以上を獲得した人が勝者となります。

たとえば、A、B、C、D、E の 5 人が選挙に立候補した場合、3 票を獲得した人が勝利します。

etcdの投票数を見てみましょう

選挙はクォーラム メカニズムに属し、コードは etcd/raft/quorum/ にあります。クォーラムのコア実装は MajorityConfig 構造にあり、これは実際にはマップのカプセル化です。

  1. タイプ MajorityConfig map[uint64]struct{}

このマップのキーは、クラスターのノードを含むノード ID です。マップの値は重要ではなく、struct{} 型が使用されます。

質問させてください。値は気にしないのであれば、なぜスライス構造を使用しないのですか?

実際のところ、それは単に検索の必要性のためです。マップの検索は一定レベルで行われ、値は struct{} を使用するため、スペースを占有せず、一石二鳥です。

  1. // etcd/raft/quorum/majority.go
  2. func (c MajorityConfig) VoteResult(votes map[uint64]bool) VoteResult {
  3. // 長さ2の配列を作成する
  4. ny := [2] int {}
  5. // クラスターノードを走査する
  6. id := 範囲 c {
  7. v、ok := 投票[id]
  8. !okの場合{
  9. // まだ投票はありません
  10. 不足++
  11. 続く 
  12. }
  13. もしv{
  14. // 賛成票を投じた
  15. ny[1]++
  16. }それ以外{
  17. //拒否に投票
  18. ny[0]++
  19. }
  20. }
  21. q := len(c)/2 + 1
  22. ny[1] >= qの場合{
  23. // 選挙成功: 投票の半数以上、たとえば、投票 => [はい、はい、はい]
  24. 戻るVoteWon
  25. }
  26. ny[1]+欠損値 >= q {
  27. // 不明な状況: 成功か失敗か不明
  28. 投票保留中を返す
  29. }
  30. // 選挙に失敗しました
  31. 戻るVoteLost
  32. }

投票集計の実装は非常に簡単で、次の手順に従ってください。

  • クラスター ノードをトラバースします。
  • 誰が賛成したか、誰が反対したか、まだ投票していないかを数えます。
  • 投票集計の結果には、成功、失敗、保留の 3 種類があります。
  • 投票の半分以上(len(c)/2+1)が同意した場合、候補者が勝利します。

この実装は非常にシンプルです。投票結果を横断して「肯定的」という単語を書き込むだけです。 「ポジティブ」という単語が半分を超えたら勝ちです。

クラスター ノードはクラスターのコミット場所をどのように確認しますか?

クラスター内の大多数のノードによってコミットされた場所が、クラスターのコミット ポイントです。つまり、これも定足数を満たす必要があります。これは面白いですね。

重要な手順: 並べ替えてから、中央の位置を取ります。

中央の位置は、クォーラムを満たすコミットです。

  1. // etcd/raft/quorum/majority.go
  2. func (c MajorityConfig) CommittedIndex(l AckedIndexer)インデックス{
  3. // クラスターノードを走査し、各ノードのコミットを取得します 
  4. id := 範囲 c {
  5. idxの場合、ok:=l.AckedIndex(id);わかりました {
  6. srt[i] = uint64(idx)
  7. 私 -  
  8. }
  9. }
  10. // 並べ替え
  11. 挿入ソート(srt)
  12.  
  13. // 最も多くのコミットが行われ、クラスターのコンセンサスとなっている中間の位置を取る
  14. 正数 := n - (n/2 + 1)
  15. 戻る インデックス(srt[pos])
  16. }

この実装は非常に興味深いです。各ノードの現在のコミット位置を取り出し、配列を形成し、配列をソートして中央の位置を取得します。この場所はクラスターのコミット場所であり、適用場所でもあります。

まず、次のようにして、クラスター内の各ノードのコミット位置を取得します。

その後、順序は次のようになり、ブラック ノードのコミット位置はクラスターのコミット位置になります。

要約する

クォーラム メカニズムは、分散システムの非常に重要な理論的な部分です。それは多数派に関する仕組みです。 etcd には多数決に関して、リーダー選出とラフト ログ操作という 2 つの側面があります。

etcd の投票の実装は非常にシンプルです。それは単なるカウントの実装です。マップはクラスター内のノードを記録するために使用されます。過半数の票を獲得したノードが勝利します。

etcd は、まず各ノードのコミット位置を配列に入れて並べ替え、次に中央の位置、つまりクラスターのコミット位置を取得することで、クラスターのコミット位置を確認します。

ほとんどのノードによってコミットされたログはクラスターコミットの場所であり、クラスターによってコミットされたログのみを適用できます。これを覚えておいてください。

クラスターのコミット位置は、ハートビートまたはログレプリケーションメッセージを通じてリーダーから他のノードに通知されます。

<<:  Kubernetes の 8 つの重要な機能の簡単な分析

>>:  Kubernetes と OpenEBS における永続ボリュームと永続ボリュームクレームの理解

推薦する

prometeus: 安価なイタリアの VPS、年間 36 ユーロ、4G RAM/2 コア/200g ハード ドライブ/10T トラフィック

1997年に設立されたPrometeus(iperweb)は、2000年に設立されたイタリアの有名な...

小規模プロジェクト運営から見るGoogle中国語最適化

先月末、会社のプロジェクトで、「突然の」仕事を受けました。それは、1か月以内に「上海不織布バッグとキ...

オンラインブランドマーケティングがオフラインに浸透し、シーンマーケティングが画期的な武器になりました!

「今この瞬間、私はあなたと一緒にいます」は、過去には想像もできなかった消費シナリオでしたが、今では特...

ポルノグラフィーおよび違法出版物対策国家事務所は8つの典型的な事例を報告し、多くの文学小説のウェブサイトがリストアップされた。

国家ポルノ・違法出版取締局が報告した8件の事件(表参照)のうち、黒竜江省ハルビン市でわいせつな資料を...

ビジネスウェブサイトの最適化に関する経験を共有しましょう

企業のウェブサイトは誰もがよく知っていると思います。企業のウェブサイトの最適化に携わるSEO実践者は...

マイクロソフトが5Gおよびエッジコンピューティング企業Affirmed Networksを買収

[[320114]]マイクロソフトは3月27日早朝(北京時間)、通信事業者向けに完全仮想化クラウドネ...

クラウド移行を正しく行う方法

Amazon は 15 年前に Amazon Web Services (AWS) プラットフォーム...

Tujia.com が 400 日間で 4 億人民元を調達した謎: バケーションレンタルの転換点

「今回の投資は途家にとって画期的な出来事ではなく、バケーションレンタル業界全体にとって画期的な出来事...

WeChat検索が登場し、ショッピングポータルはもはやTaobaoによって独占的に管理されなくなるかもしれない

【エブルンニュース】6月10日、業界が待ち望んでいたWeChat総合検索が昨日再リリースされた。舞台...

gcorelabs: ロシア極東 - ハバロフスク、専用サーバー 15% オフ、月額 60 ユーロ、高速アクセス、PayPal/Alipay

gcorelabs は現在、ロシア極東のハバロフスクにある独立サーバーを 15% 割引で提供していま...

kvmla: 日本/香港/シンガポール、VPS 直接 20% オフ (+ 再チャージ 20% 以上)、専用サーバー 25% オフ (初月 300 元オフ)

定評のあるホスティング プロバイダーである kvmla は、リピーターのユーザー向けに VPS と専...

混沌としたSEO業界

前回、Baidu が SEO 業界に親切なリマインダーを送って以来、多くのウェブマスターが多かれ少な...

失望の2018年に別れを告げ、クラウドコンピューティングは2019年に信頼を取り戻すでしょう

2018 年に別れを告げ、2019 年を迎えましょう。2018 年、クラウド コンピューティングの分...

Longhorn、Kubernetes 向けクラウドネイティブ分散ブロックストレージ

[[417918]]この記事はWeChatの公開アカウント「Hacker Afternoon Tea...

クラウドコンピューティングとスマート機器技術の変革

産業部門は、比類のない精度、正確さ、品質を得るために、急速に自動化へと移行しています。高度な計測ソリ...