記事ディレクトリ
1. はじめに
1. 動作メカニズム
公式アドレス:https://zookeeper.apache.org/
Zookeeper は、分散フレームワークの調整サービスを提供するオープンソースの分散 Apache プロジェクトです。
- Zookeeper をデザイン パターンの観点から理解すると、オブザーバー パターンに基づいて設計された分散サービス管理フレームワークであり、誰もが関心を持つデータの保存と管理を担当し、オブザーバーの登録を受け付けます。データが変更された場合、Zookeeper は、Zookeeper に登録されている観察者に、それに応じて対応するよう通知する責任があります。
2. 特徴
- 動物園の飼育員: リーダーと信者の集団。
- クラスター内のノードの半分以上が存続している限り、Zookeeper クラスターは正常に機能します。したがって、Zookeeper は奇数のサーバーをインストールするのに適しています。
- グローバル データの一貫性: 各サーバーは同じデータのコピーを保存するため、クライアントがどのサーバーに接続しても、データは一貫しています。
- 更新リクエストは順番に実行され、同じクライアントからの更新リクエストは送信された順に順番に実行されます。
- データ更新はアトミックであり、データ更新は成功するか失敗します。
- クライアントは、特定の時間範囲内でリアルタイムに最新のデータを読み取ることができます。
3. データ構造
- ZooKeeper データ モデルの構造は Unix ファイル システムに非常に似ています。
- 全体としてツリーとみなすことができ、各ノードを ZNode と呼びます。
- 各 ZNode はデフォルトで 1MB のデータを保存でき、各 ZNode はパスによって一意に識別できます。
4. 応用シナリオ
提供されるサービスには、統合ネーミング サービス、統合構成管理、統合クラスター管理、動的なオンラインおよびオフライン サーバー ノード、ソフト ロード バランシングなどが含まれます。
- 統一ネーミングサービス
- 統合構成管理
- 統合クラスター管理
- サーバーノードは動的にオンラインとオフラインになります
- ソフトロードバランシングなど
統一ネーミングサービス
- 分散環境では、多くの場合、識別しやすいようにアプリケーション/サービスに統一した名前を付ける必要があります。例: IP は覚えにくいですが、ドメイン名は覚えやすいです。
統合構成管理
-
分散環境では、構成ファイルの同期が非常に一般的です。
- 一般に、Kafka クラスターなど、クラスター内のすべてのノードの構成情報が一貫している必要があります。
- 構成ファイルを変更した後、各ノードに迅速に同期できることを願っています。
-
構成管理は ZooKeeper によって実装できます。
- 構成情報は、ZooKeeper 上の Znode に書き込むことができます。
- 各クライアント サーバーはこの Znode をリッスンします。
- Znode 内のデータが変更されると、ZooKeeper は各クライアント サーバーに通知します。
統合クラスター管理
- 分散環境では各ノードの状態をリアルタイムに把握する必要があります。
- ノードのリアルタイムのステータスに基づいて一部の調整を行うことができます。
- ZooKeeper はノードのステータスの変化をリアルタイムで監視できます。
- ZooKeeper 上の ZNode にノード情報を書き込むことができます。
- この ZNode を監視して、リアルタイムのステータス変化を取得します。
サーバーはオンラインおよびオフラインで動的に動作します
ソフトロードバランシング
- Zookeeper の各サーバーへのアクセス数を記録し、アクセス数が最も少ないサーバーに最新のクライアント リクエストを処理させます。
5. 選出メカニズム
最初のスタート
- 1) サーバー 1 が起動し、選挙が開始されます。サーバー 1 が投票を行います。この時点で、サーバー 1 は 1 票を持っていますが、過半数 (3 票) には足りず、選挙を完了できず、サーバー 1 のステータスは LOOKING のままです。
- 2) サーバー 2 が起動し、別の選挙が開始されます。サーバー 1 とサーバー 2 はそれぞれ自分に投票し、投票情報を交換します。このとき、サーバー 1 は、サーバー 2 の myid が現在投票している myid (サーバー 1) よりも大きいことに気づき、投票をサーバー 2 を推奨するように変更します。この時点でサーバー 1 は 0 票、サーバー 2 は 2 票となっており、半分以上の結果がないと選挙は完了せず、サーバー 1 とサーバー 2 のステータスは LOOKING のままになります。
- 3) サーバー 3 が起動し、選挙が開始されます。この時点で、サーバー 1 とサーバー 2 の両方が投票をサーバー 3 に変更します。この投票の結果: サーバー 1 は 0 票、サーバー 2 は 0 票、サーバー 3 は 3 票です。この時点で、サーバー 3 が過半数の票を獲得しており、サーバー 3 がリーダーに選出されます。サーバー 1 と 2 はステータスを FOLLOWING に変更し、サーバー 3 はステータスを LEADING に変更します。
- 4) サーバー 4 が起動し、選挙が開始されます。この時点では、サーバー 1、2、および 3 は LOOKING 状態ではないため、投票情報は変更されません。投票情報を交換した結果:サーバー 3 が 3 票、サーバー 4 が 1 票です。このとき、サーバー 4 は多数決に従い、投票情報をサーバー 3 に変更し、ステータスを FOLLOWING に変更します。
- 5) サーバー 5 が起動し、サーバー 4 と同様に弟として機能します。
初めてのスタートアップではない
2. ソフトウェアのインストール
# The number of milliseconds of each tick
# 通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
tickTime=2000d
# The number of ticks that the initial
# synchronization phase can take
# LF初始通信时限
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# LF同步通信时限
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
# 保存Zookeeper中的数据
dataDir=/opt/module/zookeeper-3.5.7/zkData
# the port at which the clients will connect
#客户端连接端口,通常不做修改
clientPort=2181
1. スタンドアロン版のインストール
JDK をインストールします (最初に JDK をインストールする必要があります)
yum install java-1.8.0-openjdk-devel.x86_64
ファイルを作成する/opt/module
mkdir /opt/module
cd /opt/module
ダウンロードファイル
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
ファイルを解凍する
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module
インストールディレクトリ名を変更する
mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7
環境変数を構成する
vim /etc/profile.d/my_env.sh
# ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin
環境変数をロードする
source /etc/profile
設定ファイルの追加
cd /opt/module/zookeeper-3.5.7/conf/
mv zoo_sample.cfg zoo.cfg
設定ファイルを変更する
vim zoo.cfg
# 修改数据所在文件
dataDir=/opt/module/zookeeper-3.5.7/zkData
ログディレクトリを作成する
mkdir /opt/module/zookeeper-3.5.7/zkData
動物園の飼育員を始める
bin/zkServer.sh start
起動ステータスの問い合わせ
# 查看进程
jps
# 查看状态
bin/zkServer.sh status
クライアントの起動
bin/zkCli.sh
クライアントを終了する
quit
停止zookeeper
bin/zkServer.sh stop
2. クラスターのインストール
JDK をインストールします (最初に JDK をインストールする必要があります)
yum install java-1.8.0-openjdk-devel.x86_64
ファイルを作成する/opt/module
mkdir /opt/module
cd /opt/module
ダウンロードファイル
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
ファイルを解凍する
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module
インストールディレクトリ名を変更する
cd /opt/module
mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7
データ保存ディレクトリを作成する
cd /opt/module/zookeeper-3.5.7/
mkdir zkData
ディレクトリ/opt/module/zookeeper-3.5.7/zkData
に myid ファイルを作成します
ファイル内のサーバーに対応する番号を追加します (注: 上下に空白行や左右にスペースがあってはなりません)
cd /opt/module/zookeeper-3.5.7/zkData
vim myid
# 服务器编号,每台服务器要不同
1
Zoo.cfg 構成ファイルを構成する
cd /opt/module/zookeeper-3.5.7/conf
mv zoo_sample.cfg zoo.cfg
設定ファイルを変更する
vim /opt/module/zookeeper-3.5.7/conf/zoo.cfg
# 修改数据存储位置
dataDir=/opt/module/zookeeper-3.5.7/zkData
# 增加集群配置
#######################cluster##########################
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
クラスターを開始します (3 つのユニットすべてを開始する必要があります)
cd /opt/module/zookeeper-3.5.7
bin/zkServer.sh start
ステータスの表示
bin/zkServer.sh status
3. 設定パラメータ (zoo.cfg) の解釈
Zookeeper の設定ファイルzoo.cfg のパラメータの意味は次のように解釈されます。
# 通信心跳时间
tickTime=2000
# LF初始通信时限
initLimit=10
# LF同步通信时限
syncLimit=5
# 保存Zookeeper中的数据
dataDir=/tmp/zookeeper
# 客户端连接端口,通常不做修改
clientPort=2181
- tinyTime = 2000: 通信ハートビート時間、Zookeeper サーバーとクライアントのハートビート時間、単位はミリ秒
- initLimit = 10: LFの初期通信時間制限
リーダーとフォロワーが最初の接続中に許容できるハートビートの最大数 (tickTimes の数)
- syncLimit = 5: LF同期通信時間制限
リーダーとフォロワー間の通信時間が を超えるとsyncLimit * tickTime
、リーダーはフォロワーが死亡したものとみなし、サーバーリストからフォロワーを削除します。
- dataDir: Zookeeper にデータを保存する
注: デフォルトの tmp ディレクトリは Linux システムによって定期的に簡単に削除されるため、通常はデフォルトの tmp ディレクトリは使用されません。
- clientPort = 2181: クライアント接続ポート。通常は変更されません。
4. ZKクラスター起動スクリプト
#!/bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 启动 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 状态 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
done
};;
esac
3. コマンドライン操作
1. 文法
基本的なコマンド構文 | 機能説明 |
---|---|
ヘルプ | すべての操作コマンドを表示 |
パス | ls コマンドを使用して、現在の znode の子ノードを表示します [監視可能] -w 子ノードの変更を監視します -s 追加の二次情報 |
作成する | 通常の作成 -s にはシーケンス -e が含まれます 一時的 (再起動またはタイムアウト後に消えます) |
パスを取得する | ノードの値を取得します [監視可能] -w ノードの内容の変更を監視します -s 追加の二次情報 |
セット | ノードの特定の値を設定します |
ステータス | ノードのステータスを表示する |
消去 | ノードの削除 |
すべて削除 | ノードを再帰的に削除する |
2. 使用する
クライアントの起動
bin/zkCli.sh -server hadoop101:2181
すべての操作コマンドを表示
help
現在の znode に含まれるコンテンツを表示する
ls /
現在のノードの詳細データを表示する
ls -s /
czxid
: 作成したノードのトランザクションzxid- ZooKeeper の状態が変更されるたびに、ZooKeeper トランザクション ID が生成されます。トランザクション ID は、ZooKeeper でのすべての変更の合計順序です。各変更には一意の zxid があり、zxid1 が zxid2 より小さい場合、zxid1 は zxid2 の前に発生します。
ctime
: znode が作成されてからのミリ秒数 (1970 年以降)mzxid
: znode の最後に更新されたトランザクションの zxidmtime
: znode が最後に変更されてからのミリ秒数 (1970 年以降)pZxid
: znode の最後に更新された子ノードの zxidcversion
:Znode サブノード変更数、znode サブノード変更時間dataversion
: znodeデータ変更番号aclVersion
: znode アクセス制御リストの番号を変更しますephemeralOwner
: 一時ノードの場合、これは znode 所有者のセッション ID です。一時ノードでない場合は 0 です。dataLength
: znodeのデータ長numChildren
:znode子ノードの数
3. ノード関連
ノードは永続ノードと一時ノードに分類できます。
持久(Persistent)
: クライアントとサーバーが切断された後、作成されたノードは削除されません。- 永続ディレクトリ ノード クライアントが Zookeeper から切断された後も、ノードはまだ存在します。
- 永続的な連番ディレクトリ ノード クライアントが Zookeeper から切断された後も、ノードはまだ存在しますが、Zookeeper はノード名に連番を付けます。
短暂(Ephemeral)
: クライアントとサーバーが切断されると、作成されたノードは自動的に削除されます。- 一時ディレクトリ ノード クライアントが Zookeeper から切断されると、ノードは削除されます。
- 一時的な連番ディレクトリ ノード クライアントが Zookeeper から切断されると、ノードは削除されますが、Zookeeper はノード名に連番を付けます。
説明: znode の作成時にシーケンス識別子を設定します。値は znode 名に追加されます。シーケンス番号は、親ノードによって維持される単調増加カウンタです。
注: 分散システムでは、シーケンス番号を使用してすべてのイベントをグローバルに順序付けできるため、クライアントはシーケンス番号に基づいてイベントの順序を推測できます。
通常のノードを2つずつ作成(ノード作成時に値を代入)
create /sanguo "diaochan"
create /sanguo/shuguo "liubei"
子ノードを取得する
ls /sanguo
得られたsanguo
値
get -s /sanguo
- 通常のノード:
create /test/test1 "zhansan01"
- シリアル番号付きノード:
create -s /test/test1 "zhansan01"
: 作成されたノードにはシリアル番号が付いています。test1000001
- 一時的なノード:
create -e /test/test1 "zhansan01"
: クライアントを閉じると消えます (一時的)
通常のノードを作成する
create /test/test1 "zhansan01"
シリアル番号を使用してノードを作成する
create -s /test/test2/test21 "zhansan02"
create -s /test/test2/test22 "lisi02"
create -s /test/test2/test23 "wangwu02"
有効期間の短いノードを作成します (クライアントを閉じると消えます)
create -e /test/test3 "zhansan03"
# 创建短暂的带序号的节点
create -e -s /test/test3 "lisi03"
ノードの値を変更する
set /test/test3 "wangwu03"
4. リスナーの原則
クライアントは、関心のあるディレクトリ ノードを監視するために登録します。ディレクトリ ノードが変更されると (データの変更、ノードの削除、サブディレクトリ ノードの追加と削除)、ZooKeeper はクライアントに通知します。監視メカニズムにより、ZooKeeper によって保存されたデータの変更が、ノードを監視しているアプリケーションに迅速に応答できるようになります。
監視原理
- 1) まず main() スレッドが必要です
- 2) メインスレッドで Zookeeper クライアントを作成する この時点で、ネットワーク接続通信 (connet) を担当するスレッドと、リッスン (listener) を担当するスレッドの 2 つのスレッドが作成されます。
- 3) 登録されたリスニング イベントを接続スレッドを通じて Zookeeper に送信します。
- 4) 登録されたリスニング イベントを Zookeeper の登録済みリスナーのリストに追加します。
- 5) Zookeeper がデータまたはパスの変更を検出すると、このメッセージをリスナー スレッドに送信します。
- 6) process() メソッドがリスナー スレッドの内部で呼び出されます。
共通監視
#监听节点数据的变化
get path [watch]
# 监听子节点增减的变化
ls path [watch]
/test
値の変化を監視する
get -w /test
# 更新/test值
set /test "zhangsan"
注: hadoop103 で /sanguo の値を複数回変更すると、hadoop104 で監視が受信されなくなります。一度登録すると一度しか聴けません。再度監視したい場合は、再度登録が必要です。
サブディレクトリの変更を監視する
ls -w /test
# 新建子目录值
create /test/test4 "zhangsan04"
注: ノードのパス変更も一度登録され、一度だけ有効になります。複数回有効にしたい場合は、複数回登録する必要があります。
5. ノードの削除と表示
ノードの削除
delete /test/test4
ノードを再帰的に削除する
deleteall /test/test2
ノードのステータスを表示する
stat /test