基本的なPaxosの最も一般的な理解

単純な分散シナリオ

役割の説明

  • クライアントクライアント、リクエストの開始を担当
  • サーバーサーバーはクライアントの要求を受信し、要求されたデータを保存します

これで3台のサーバーが展開され、各サーバーはクライアントから要求された情報を保存してログに保存します。クライアントがServer_1への要求を開始すると、Server_1はログを記録してServer_2に同期し、Server_3はデータの一貫性を維持しますが、これは問題ではないようです。

しかし、参加することは、クライアントが同時に複数のサーバーを要求しているのでしょうか?何が悪いのか見る

各サーバーのログシーケンスに一貫性があることを確認するにはどうすればよいですか?たとえば、各サーバーの最後のログシーケンスはlog1、log2またはlog2、log1です。

次のような単純なデータ複製は絶対に不可能です。

Server_1の最終的なログシーケンスはlog1log2であり、Server_2のログシーケンスはlog2 log1であり、Server_3のログシーケンスは両方とも可能です。

これは、分散シナリオにおける典型的な整合性の問題です。Paxosの目的は、この問題を解決し、すべてのサーバーのデータの整合性を維持することです。

では、Paxosはこの問題をどのように解決しますか?それが次に説明する質問です。

paxosを理解する前に、2pcの概念が明確でない場合は、最初に2pcを理解してから、paxosを確認することをお勧めします。これは、最終的にpaxosも2pcのアイデアであることがわかりますが、いくつかの最適化が行われているためです。

パクソス

Proposal、Proposer、Accepterなど、パクシのさまざまな概念について直接話すと、理解が難しくなるので、人生で非常に一般的な例を使用すると、はるかに良いでしょう。

競売

オークション、私は誰もがそれに精通していると思います、少し変更を加えて、私たちの現在のオークションプロセスは次のとおりです:

入札セクション:

1. 每个人都可以发起竞价,告诉其他人竞价的筹码。

2. 同理,其他人发起竞价时,每个人也会收到竞价信息,有两个可能

    a. 假如竞价筹码 <= 最大筹码,回复(no)

    b. 假如竞价成功 > 最大筹码,记录最大筹码 = 竞价筹码

        ⅰ. 如果商品没被购买,回复(yes,null)

        ⅱ. 如果商品已被购买,回复(yes,购买筹码,购买人信息)

3. 当一个人发起竞价后,会收到其他人的竞价结果的回复,超过一半人告诉你竞价成功(少数服从多数),就可以发起购买的请求了(会告诉其他所有人)。
复制代码

部品の購入:


1. 发起购买时候,携带两个信息(购买的筹码,个人信息)

2. 当收到其他人的购买请求后,有两种可能:

    a. 如果 购买筹码 >= 最大筹码,记录购买者的购买筹码和个人信息,然后回复(yes)。

    b. 如果 购买抽买 < 最大筹码,回复(no)。

3. 收到购买回复后,如果为超过半数yes,则表示购买成功,结束流程。反之,提高筹码,重新发起竞价。
复制代码

達成される最終的な効果は、すべての人が記録する商品購入チップと個人情報が同じでなければならないということです。

フローの説明

まず、競合他社なしでどのように機能するかを見てみましょう。概念を理解した後、特別な用語で表現されるようになりました。

コンセプトノート

  • 提案:同等のチップ
  • 提案者:入札と購入のリクエストを開始するのと同等の恐れ
  • アクセプター:リクエストの受信に相当する役割

変数の説明

  • id:チップのサイズを示します
  • max_id:最大のチップの現在のレコードを示します
  • acc_id:購入したチップを示します
  • acc_val:表示购买人信息

步骤一:协商

收到yes时候,acceptor会将acc_idacc_val 返回

  • 假如acc_val都为null,说明还没有设置过val,则将自己的val在第二阶段发送给acceptor
  • 存在acc_val不为null的情况,proposer必须无条件使用acc_id最大的acc_val作为第二阶段发送的val


if (id > max_id){

    max_id = id;

    reutrn (yes, acc_id,acc_val);

} else {

    return (no);

}

复制代码

步骤二:提交

当步骤一中超过半数的yes时候,进入步骤二:


if (id >= max_id){

    max_id = id;

    acc_id = id;

    acc_val = val;

    return yes;

}else {

    return no;

}

复制代码

接收到达响应的结果有两种

  • 收到超过一半的yes,流程结束。
  • 少于一般的yes,则自增id,重新执行步骤一。

至此,paxos的流程就走完了,对于发生竞争的情况,paxos是如何做到保持一致的,我的建议是根据上述的判断条件,自己动手模拟下(当初也是自己模拟后,帮助我更快的理解了整个流程)。

参考

  • 《凤凰架构》周志明,第6章 Paxos
  • 《软件架构设计》余春龙

おすすめ

転載: juejin.im/post/7084524558610333703