序文
ZooKeeperのは、シーケンシャルリードを確実にするために高度に利用可能な、一貫した、高性能なストレージシステムを提供することです。データ整合性のZooKeeperをサポートZABプロトコルは、特別に、原子ブロードキャストプロトコルを設計しました。
デモ環境
$のは、uname - ダーウィン18.6。0ダーウィンカーネルバージョン18.6。0:木年04月25 23:16:27 PDT 2019。ルート:xnu- 4903.261。4〜2 / RELEASE_X86_64 x86_64版
インストール
醸造樽をインストールJavaの 醸造がインストール飼育係を
コンフィギュレーション
ここで実証されたことは、同じマシン上で擬似的に3つのZooKeeperクラスタプロセスを展開することです。
$ 猫は/ usr / local / etc /飼育係/ zoo1.cfg tickTime = 2000 initLimit = 10 syncLimit = 5 DATADIR =は/ usr / localの/ var /実行/飼育係/ DATA1の CLIENTPORT = 2181 サーバー。1 = localhostを:2888:3888 のサーバー。2 = localhostを:4888:5888 のサーバー。3 = localhostを:6888:7888
$エコー"1">は/ usr / localの/ var /実行/飼育係/ DATA1 / MYID
- 使用TickTime ZooKeeperの基本時間単位は、ミリ秒単位で、デフォルトは2000です。ハートビートタイムアウトを調節するために使用されます。
- initLimitのデフォルト値は10、すなわち、10倍tickTime属性値です。これは、フォロワ接続を表し、リーダーを同期させるための最大時間を可能にします。データのZooKeeper管理、大量の場合は、この値を増やすことができます。
- デフォルト値は5回syncLimit 5、即ちtickTimeプロパティ値です。リードと従動ハートビート検出の最大遅延時間を表します。時間内に通信できないフォロワーがリーダーに提供されている場合、フォロワーは破棄されます。
- メモリデータベースのスナップショットを保存するために使用され、あなたが別のディレクトリ、またはデータベース更新トランザクションログを指定しない限り、DATADIR ZooKeeperのディレクトリは、ディレクトリに保存されます。あなたはdataLogDir指定されたストレージディレクトリのZooKeeperトランザクションログを設定することができます。
- ポートCLIENTPORTサーバはデフォルトは2181で、クライアントの接続を待機します。
- server.id =ホスト:ポート1:PORT2トランクモード他のマシンを検出するため、各列は、インスタンスのZooKeeperの構成を表します。IDは、クラスタ内のインスタンスを表すために使用されるサーバーのID番号としても知られています。また、あなたはMYID DATADIRファイルの各インスタンスIDのために書かれる必要があります。データ同期のポート1。選挙のためのポート2。
第二に、クラスタ構成のインスタンスへ:
$ 猫は/ usr / local / etc /飼育係/ zoo2.cfg tickTime = 2000 initLimit = 10 syncLimit = 5 DATADIR =は/ usr / localの/ var /実行/飼育係/ DATA2の CLIENTPORT = 2182 サーバー。1 = localhostを:2888:3888 のサーバー。2 = localhostを:4888:5888 のサーバー。3 = localhostを:6888:7888 の$ 猫は/ usr / localの/ var /実行/飼育係/ DATA2 / MYID 2
クラスタ第三の構成例です。
$ 猫は/ usr / local / etc /飼育係/ zoo3.cfg tickTime = 2000 initLimit = 10 syncLimit = 5 DATADIR =は/ usr / localの/ var /実行/飼育係/ DATA3の CLIENTPORT = 2183 サーバー。1 = localhostを:2888:3888 のサーバー。2 = localhostを:4888:5888 のサーバー。3 = localhostを:6888:7888 の$ 猫は/ usr / localの/ var /実行/飼育係/データ3 / MYID 3
クラスタを起動します。
$ zkServer開始は/ usr / local / etc /飼育係/ zoo1.cfg ZooKeeperのJMXは、デフォルトで有効に 設定使い方:は/ usr / local / etc /飼育係/ zoo1.cfg STARTED ...開始飼育係を $開始zkServerは/ usr / local /など/飼育係/ zoo2.cfg ZooKeeperのJMXはデフォルトで有効に 設定使い方:は/ usr / local / etc /飼育係/ zoo2.cfg STARTED ...開始飼育係を $開始zkServerは/ usr / local / etc /飼育係/ zoo3.cfg ZooKeeperのJMXが有効デフォルトでは 設定を使用して:は/ usr / local / etc /飼育係/ zoo3.cfg 開始飼育係を... STARTED $ zkServer状態は/ usr / local / etc /飼育係/zoo1.cfg ZooKeeperのJMXは、デフォルトで有効に 設定を使用する:は/ usr / local / etc /飼育係/ zoo1.cfg モード:フォロワー の$ zkServer状況は/ usr / local / etc /飼育係/ zoo2.cfg ZooKeeperのJMXは、デフォルトで有効に 設定を使用: / USR /ローカルの/ etc /飼育係/ zoo2.cfg モード:リーダー の$ zkServer状況は/ usr / local / etc /飼育係/ zoo3.cfg ZooKeeperのJMXは、デフォルトで有効に します。configを使用しては/ usr / local / etc /飼育係/ zoo3.cfg モード:フォロワー
上記ステータスチェックから分かるように、リーダーは、第二の例であり、他の二つの例は、フォロワです。
オペレーティング
ここで私は、クラスタ内のノードを読み書きするデモンストレーションを行います。
$ zkCli -server localhostを:2182は、 ローカルホストへの接続:2182 のZooKeeperへようこそ! JLineサポートが有効になっている WATCHERを:: WatchedEvent状態:SyncConnectedタイプ:なしパス:ヌル [ZK:localhostを:2182(CONNECTED)2 ]を作成/テスト" 私だテスト" 作成した / テスト [ZK:localhostを:2182(CONNECTED)3 ] /取得テストを 私がテストしています cZxid = 0x200000002 のctime = 7月火02 16:35:15CST 2019 mZxid = 0x200000002 のmtime = 7月火02 16:35:15 CST 2019 pZxid = 0x200000002 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0の データ長 = 9 するnumChildren = 0
実施例2 /テスト・ノードを作成し、実施例3に次の一貫性のZooKeeperクラスタのデータを示すノードに読み出すことができます。
ZooKeeperのセマンティクス保証
シンプルで効率的なのZooKeeper、我々はこれらの機能を利用することができるように、次のセマンティクスの保証を提供しつつ、複雑なサービスを提供します。
- シーケンシャル:送信されたシーケンス内のクライアントによって開始された更新要求はのZooKeeperに適用されます。
- アトミック:更新またはフェイル、中間状態ではありません。
- 信頼性:他の動作アップデートによってカバーされない限り、一度、偶発損失ではありません、更新操作を受け入れました。
- 結果整合性:最終(ただし、すぐに)書くには、クライアントに見えるだろう。
ZooKeeperのウォッチ・メカニズム
すべては、ZooKeeperのの読み込み・ウォッチに同梱することができます。適切なデータが変更された後は、ウォッチがトリガされます。
ウォッチは、次の特性があります。
- アクティブプッシュ:ウォッチは、積極的にクライアントをポーリングせずに、クライアントへの更新をプッシュするのZooKeeperサーバーによってトリガーされます。
- 使い捨て:ウォッチは、一度だけデータ変更時にトリガされます。クライアントは、将来の更新を通知することを希望する場合はウォッチウォッチがトリガされた後、あなたは再登録する必要があります。
- シーケンシャル:複数の更新は、複数のウォッチをトリガする場合、注文が更新の順に沿ってトリガされていることを見てください。
- 可視性:データを再度読んで、クライアントはウォッチ、ウォッチは同時にトリガ、読み出し要求に付属している場合、クライアントは、ウォッチのニュースを取得する前に更新されたデータを参照することはできません。言い換えれば、更新結果の前に更新通知。
ZAB契約
書き込み操作の可用性との整合性を確保するためには、ZooKeeperのは、アトミックブロードキャスト(ZAB)クラッシュリカバリと呼ばれるサポートし、設計の一貫性プロトコルに基づいてパクシ。この契約に基づいて、ZooKeeperの各クラスタのコピー間のデータの一貫性を維持するために、マスタースレーブアーキテクチャモデルシステムを実現します。
ZABは合意によると、すべての書き込み操作は、フォロワーのすべてのノードにローカルログに書き込まれ、複製された指導者、指導者によって行われなければなりません。クライアントは、フォロワー/観測開始書き込み要求である場合は、フォロワー/観察者は、治療終了後の指導者、指導者に要求を転送してから戻ってクライアントに送信されたフォロワー/観察者に結果を転送します。
ZAB契約が分割され、ブロードキャストモードとクラッシュリカバリモード
リーダー書き込み要求の処理工程(ブロードキャストモード)です。
1.leaderトランザクション要求は一意のトランザクションID(ZXID)を生成するために、ZABは、各トランザクションプロトコルは、ソートし、処理するためのZXID提案であろう。
2.送信し、ACKを返信するフォロワーフォロワー提案を待ちます。
ACKの半分以上を受け取った後3.leaderリーダー自体がコミット完了しますが、/オブザーバーフォロワーのすべてを送信することを約束(自分自身のリーダーがデフォルトACK持っています)。
4.処理結果をクライアントに返します。
上記のプロセスは、2フェーズ・コミットのZooKeeperになります。
クラッシュリカバリ:
ネットワークは、その失われた接触の半分よりもフォロワー以上が発生するため、リーダーインスタンスがダウンしてクラッシュしたとき、または、それが回復局面にクラッシュします。
リーダーのダウンタイム以上のフォロワーリーダーの半分以上との接触を失ったが(選挙アルゴリズムの記事は後ほど説明します)の再選挙につながります。選挙がタイトにし、データの一貫性を確保するために、データクラッシュの回復を入力します後、データが同期されます。私たちは、トランザクションがすでにすべてのサーバーが送信されコミットされていることを確認する必要があり、サーバーが提示のみリーダーそれらのトランザクションを破棄する必要があります。だから、クラスタZXIDの最大数を持つように新しいリーダーを選出しました。データの同期化は、メッセージの形でフォロワー同期総務提案フォロワーに送信されたことを示し、各提案の背後にコミットメッセージを送ることが続くことはありません新しいリーダーが選出され、リーダーの後に動作しますトランザクションが送信されました。そして、フォロワーサーバが正常にローカルデータベースに適用されたトランザクションの提案から同期されます。
ZXIDはカウントが選挙の各ラウンド後にクリアされ、64ビットの符号なし整数、32ビットの高エポック、代表的なリーダー選択期間であり、下位32ビットの累積カウントです。リーダーはトランザクションサーバを生じなかった、低ZXID 32がプラスではなく、選挙を完了するためのリーダーになります、それは高い32プラス1をZXIDされます。これは、新しいリーダーがZXID ZXIDを生成し、古いリーダーより大きく前に生成されなければならないことを保証するために行われます。
リーダーシップの選挙アルゴリズム
サーバステータス:
- 不確実なリーダーの地位を探しています。クラスタ内のサーバーは、現在のリーダーは、リーダー選挙を開始することを述べるものではありません。
- フォロワーの状態を以下に示します。これは、現在のサーバーの役割がフォロワーであることを示し、それはリーダーはイエスが誰であるか知っています。
- リーダーの状態をリード。それはフォロワー間のハートビートを維持し、現在のサーバの状態がリーダーであることを示します。
- オブザーバーの地位を観察します。現在のサーバーの役割は、オブザーバー、フォロワーが異なっており、投票クラスタの書き込み動作に参加しない、選挙に関与していないことを示します。
投票データ構造:
次のキーの情報を送信する選挙サーバの間に各リーダー:
- logicClock各サーバはlogicClockと呼ばれる自動インクリメントの整数を、維持する、これは、サーバによって開始され、投票の最初のラウンドであることを示しています。
- 状態は、サーバの現在の状態を表します。
- self_id現在のサーバMYID
- 現在のサーバー保存されたデータにSelf_zxid最大zxid
- vote_idは、サーバのMYID選出されました
- サーバーvote_zxid上の最大zxidは、保存されたデータに選出されました
(クイックリーダー選挙アルゴリズム)PKを投票:
PKは(vote_logicClock、vote_self_id、vote_self_zxid)と比較票(logicClock、self_id、self_zxid)に基づいている:
等しい場合は、最初に等しいzxid場合次いでMYIDを比較し、zxidを比較し、logicClockを比較します。最終投票は、独自のより大きい場合、また票を投票し、投票を変更します。
概要
読者に直感的な感じを与えるために、物品のプレゼンテーションのZooKeeper展開と運用の始まり、その後、ZABリーダー選挙プロトコルとのZooKeeperの原則を導入しました。
参照
https://cwiki.apache.org/confluence/display/ZOOKEEPER/ProjectDescription
https://dbaplus.cn/news-141-1875-1.html