1. 飼育員の紹介
1.1. 飼育員とは何ですか?
ズーキーパー公式ウェブサイト:https ://zookeeper.apache.org/
ビッグ データ エコシステムの多くのコンポーネントには、何らかの動物や昆虫の名前が付けられており、彼は Hadoop (象)、Hive (蜂)、Pig (子豚) を管理する管理者です。名前が示すように、彼らはビッグデータ エコシステムのさまざまなコンポーネントを管理する管理者です。略語zk
1.2. Zookeeper のアプリケーションシナリオ
ZooKeeperは、分散アプリケーション向けの厳密なシーケンシャル アクセス制御機能を備えた、高性能、高可用性の分散調整ストレージ サービスを提供することに特化した、古典的な分散データ整合性ソリューションです。
- 構成情報の保守
- 分散ロックサービス
- クラスタ管理
- 分散された一意の ID を生成する
1.2.1. 設定情報の保守
Java プログラミングでは、データベース URL、スキーマ、ユーザー、パスワードなどの構成項目が頻繁に使用されます
。通常、これらの設定項目を設定ファイルに配置し、その設定ファイルをサーバー上に配置しますが、設定項目を変更する必要がある場合は、サーバー上の
対応する設定ファイルを変更する必要があります。しかし、分散システムの台頭により、多くのサービスがこの構成ファイルを使用する必要があるため、構成サービスの高可用性と各サーバー上の構成データの一貫性を
確保する必要があります。
構成ファイルは通常、クラスターにデプロイされます。
ただし、クラスターには数千のサーバーが含まれることがよくあります。現時点で、各サーバーで構成ファイルを 1 つずつ変更するのは
非常に . 構成項目の変更
やその他の操作を効率的、迅速かつ確実に完了でき、各サーバー上の各構成項目のデータの整合性を確保できます。
Zookeeper は、一貫性を確保するためにコンセンサス プロトコルである Zab を使用するこのようなサービスを提供できます。構成を維持するために Zookeeper を使用するオープン ソース プロジェクトは数多くあります。たとえば、hbase では、クライアントは Zookeeper に接続して、さらなる操作の前に hbase クラスターの必要な構成情報を取得します。さらに、オープン ソースのメッセージ キュー kafka では、ブローカー情報を維持するために、zookeeper も使用されます。alibaba のオープンソース SOA フレームワークである dubbo では、サービス ガバナンスを実現するために一部の構成を管理するために、zookeeper も広く使用されています。
1.2.2. 分散ロックサービス
クラスターは、複数のサーバーで構成される分散システムです。同時実行性と信頼性を向上させるために、同じサービスが複数のサーバーで実行されます。複数のサービスが実行されている場合、各サービスの進行状況を調整する必要があり、あるサービスが操作を実行している間、他のサービスが操作を実行できないようにする、つまり操作がロックされるようにする必要がある場合があります。現在のマシン 電話を切った後、ロックを解放し、他のマシンにフェイルオーバーしてサービスの実行を継続します。
1.2.3. クラスター管理
さまざまなソフトウェアやハードウェアの障害、またはネットワーク障害により、クラスターがクラスターから削除されることがあります。一部のサーバーがハングアップし、クラスターから削除されます。一部のサーバーがクラスターに追加されると、Zookeeper はクラスターに追加/削除を通知します。システム内の他の正常に動作しているサーバーは、ストレージやコンピューティングなどのタスクの分散と実行を適時に調整できます。さらに、Zookeeper は障害が発生したサーバーを診断し、修復を試みます。
1.2.4. 分散固有IDの生成
これまでの単一データベース単一表現型システムでは、通常、データベース フィールドに付属する auto_increment 属性を使用して、各レコードに一意の ID を自動的に生成できました。ただし、データベースがテーブルに分割された後は、データベースの auto_increment 属性に依存してレコードを一意に識別することはできなくなります。この時点で、zookeeper を使用して、分散環境でグローバルに一意の ID を生成できます。方法は次のとおりです。新しい ID を生成するたびに永続シーケンス ノードを作成し、作成操作によって返されたノードのシリアル番号を新しい ID として、自分の ID より小さいノードを削除します。
1.3. 飼育員の設計目標
ZooKeeper は、分散アプリケーション向けに、高性能、高可用性、厳密なシーケンシャル アクセス制御の分散調整サービスを提供することに取り組んでいます。
-
ハイパフォーマンス
- ZooKeeper はすべてのデータをメモリに保存し、クライアントからのすべての非トランザクション要求を直接処理します。これは、読み取り指向のアプリケーション シナリオに特に適しています。
-
高可用性
- ZooKeeper は通常、クラスタの形式で外部サービスを提供します。通常、3 ~ 5 台のマシンが利用可能な Zookeeper クラスタを形成できます。各マシンは現在のサーバー状態をメモリに維持し、各マシンは相互に通信を維持します。クラスター内のマシンの半分以上が正常に動作できる限り、クラスター全体が通常の外部サービスを提供できます。
-
厳密なシーケンシャルアクセス
- クライアントからの更新リクエストごとに、ZooKeeper はグローバルに一意の増分番号を割り当てます。これは、すべてのトランザクション操作のシーケンスを反映します。
2. Zookeeper データモデル
Zookeeper のデータ ノードはツリー構造 (またはディレクトリ) として考えることができ、ツリー内の各ノードは znode (つまり Zookeeper ノード) と呼ばれ、znode は複数の子ノードを持つことができます。Zookeeper ノードはツリー状の構造になっており、/ns-1/angyan/mysql/schema1/table1 などのパス path を使用して znode を見つけます。ここで、ns-1、angyan、mysql、schema1、table1 はルートです。それぞれ、レベル 2 ノード、レベル 3 ノード、レベル 4 ノード、ns-1 は angyan の親ノード、angyan は ns-1 の子ノード、angyan は mysql の親ノード、mysql は の子ノードです。アンヤンなど。
Znode はファイルとディレクトリの両方の特性を備えています。データ、メタデータ、ACL、タイムスタンプなどのデータ構造をファイルのように保持し、ディレクトリのようにパス識別子の一部として使用できます。
では、znode はどのように記述すればよいのでしょうか? znode は大きく 3 つの部分に分かれています。
- ノードデータ:つまり、znodeデータ(ノードパス、ノードデータ)間の関係は、Javaマップの(キー、値)間の関係のようなものです
- ノードの子
- ノード ステータス統計: cZxid や ctime などのノード ステータス統計の属性を含む、現在のノードの作成および変更レコードを記述するために使用されます。
ノードの種類
临时节点
Zookeeper にはとという 2 種類のノードがあります永久节点
。ノードのタイプは作成時に決定され、変更することはできません。
-
一時的なノード: ノードの存続期間は、ノードを作成したセッションによって異なります。セッション(Session)が終了すると、一時ノードは自動的に削除されますが、もちろん手動で削除することも可能です。各一時的な Znode はクライアント セッションにバインドされていますが、依然としてすべてのクライアントに表示されます。さらに、ZooKeeper の一時ノードは子を持つことを許可されていません。
-
永続ノード: このノードのライフサイクルはセッションに依存せず、クライアントが明示的に削除操作を実行した場合にのみ削除できます。
3. Zookeeper のスタンドアロン インストール
現在のテストシステム環境 centos7.3
jdk:jdk-8u131-linux-x64.tar.gzzookeeper
:zookeeper-3.4.10.tar.gz
1. root ユーザーを使用して、centos に Zookeeper ユーザーを作成します。ユーザー名: Zookeeper パスワード: Zookeeper
useradd zookeeper
passwd zookeeper
2. Zookeeper の最下層は jdk に依存します。zookeeper ユーザーがログインした後、最初にルート ディレクトリに jdk をインストールします。jdk は jdk-8u131-linux-x64.tar.gz バージョンを使用します。jdk をアップロードして解凍します。
//解压jdk
tar -xzvf jdk-8u131-linux-x64.tar.gz
3. jdk環境変数を設定する
// vim打开 .bash_profile文件
vi .bash_profile
// 文件中加入如下内容
JAVA_HOME=/home/zookeeper/jdk1.8.0_131
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
// 使环境变量生效
. .bash_profile
4. JDKのインストールを検出する
// 敲如下命令,系统如图反馈说明安装成功
java -version
5. Zookeeper は、zookeeper-3.4.10.tar.gz を使用し、アップロードして解凍します。
// 解压zookeeper
tar -xzvf zookeeper-3.4.10.tar.gz
6. Zookeeper の設定ファイルを準備する
// 进入conf目录
cd /home/zookeeper/zookeeper-3.4.10/conf
// 复制配置文件
cp zoo_sample.cfg zoo.cfg
// zookeeper根目录下新建data目录
mkdir data
// vi 修改配置文件中的dataDir
// 此路径用于存储zookeeper中数据的内存快照、及事物日志文件
dataDir=/home/zookeeper/zookeeper-3.4.10/data
7. Zookeeper を開始する
// 进入zookeeper的bin目录
cd /home/zookeeper/zookeeper-3.4.10/bin
// 启动zookeeper
./zkServer.sh start
//启动:zkServer.sh start
//停止:zkServer.sh stop
//查看状态:zkServer.sh status
4. Zookeeper でよく使用されるシェル コマンド
4.1. 新しいノードの追加
create [-s] [-e] path data #其中-s 为有序节点,-e 临时节点
永続ノードを作成し、データを書き込みます。
create /hadoop "123456"
永続的な順序付けされたノードを作成します。このとき作成されるノードの名前は、指定したノード名 + 自己増加するシリアル番号になります。
[zk: localhost:2181(CONNECTED) 2] create -s /a "aaa"
Created /a0000000000
[zk: localhost:2181(CONNECTED) 3] create -s /b "bbb"
Created /b0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /c "ccc"
Created /c0000000002
一時ノードを作成します。このノードはセッションの有効期限が切れると削除されます。
[zk: localhost:2181(CONNECTED) 5] create -e /tmp "tmp"
Created /tmp
一時的に順序付けされたノードを作成します。このノードはセッションの有効期限が切れると削除されます。
[zk: localhost:2181(CONNECTED) 6] create -s -e /aa 'aaa'
Created /aa0000000004
[zk: localhost:2181(CONNECTED) 7] create -s -e /bb 'bbb'
Created /bb0000000005
[zk: localhost:2181(CONNECTED) 8] create -s -e /cc 'ccc'
Created /cc0000000006
4.2. ノードの更新
ノードを更新するコマンドが設定されており、次のように直接変更できます。
[zk: localhost:2181(CONNECTED) 3] set /hadoop "345"
cZxid = 0x4
ctime = Thu Dec 12 14:55:53 CST 2019
mZxid = 0x5
mtime = Thu Dec 12 15:01:59 CST 2019
pZxid = 0x4
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
バージョン番号に基づいて変更を行うこともできます。これはオプティミスティック ロック メカニズムに似ています。渡したデータ バージョン番号 (dataVersion) が現在のノードのデータ バージョン番号と一致しない場合、Zookeeper は変更を拒否します。
[zk: localhost:2181(CONNECTED) 10] set /hadoop "3456" 1
version No is not valid : /hadoop
4.3. ノードの削除
ノードを削除するための構文は次のとおりです。
delete path [version]
ノード データの更新と同様に、バージョン番号を渡すこともできます。渡したデータ バージョン番号 (dataVersion) が現在のノードのデータ バージョン番号と一致しない場合、Zookeeper は削除操作を実行しません。
[zk: localhost:2181(CONNECTED) 36] delete /hadoop 0
version No is not valid : /hadoop #无效的版本号
[zk: localhost:2181(CONNECTED) 37] delete /hadoop 1
[zk: localhost:2181(CONNECTED) 38]
ノードとそのすべての子孫ノードを削除するには、コマンド rmr path で再帰的削除を使用できます。
4.4. ノードの表示
get path
[zk: localhost:2181(CONNECTED) 1] get /hadoop
123456
cZxid = 0x4
ctime = Thu Dec 12 14:55:53 CST 2019
mZxid = 0x4
mtime = Thu Dec 12 14:55:53 CST 2019
pZxid = 0x4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
各ノードの属性は以下のとおりです。重要な概念の 1 つは Zxid (ZooKeeper トランザクション ID) です。ZooKeeper ノードの各変更には一意の Zxid があります。Zxid1 が Zxid2 より小さい場合、Zxid1 の変更は Zxid2 の変更より前に発生します。
状態属性 | 説明する |
---|---|
cZxid | データノード作成時のトランザクションID |
時間 | データノードが作成された時刻 |
mZxid | データノードが最後に更新されたときのトランザクションID |
分時間 | データノードが最後に更新された時刻 |
pZxid | データ ノードの子ノードが最後に変更されたときのトランザクション ID |
変換 | 子ノードの変更数 |
データバージョン | ノードデータの変更数 |
aclバージョン | ノードのACLへの変更の数 |
一時的な所有者 | ノードが一時ノードの場合は、ノードを作成したセッションの SessionID を示します。ノードが永続ノードの場合、このプロパティの値は 0 です。 |
データ長 | データ内容の長さ |
子供の数 | データノードの現在の子ノードの数 |
4.5. ノードのステータスの表示
stat コマンドを使用してノードのステータスを表示できます。その戻り値は get コマンドと似ていますが、ノード データは返されません。
[zk: localhost:2181(CONNECTED) 2] stat /hadoop
cZxid = 0x4
ctime = Thu Dec 12 14:55:53 CST 2019
mZxid = 0x4
mtime = Thu Dec 12 14:55:53 CST 2019
pZxid = 0x4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
4.6. ノードリストの表示
ノードリストを表示するには ls path と ls2 path の 2 つのコマンドがあり、後者は前者を拡張したもので、指定したパスの下にあるすべてのノードを表示するだけでなく、現在のノードの情報も表示できます。
[zk: localhost:2181(CONNECTED) 0] ls /
[cluster, controller_epoch, brokers, storm, zookeeper, admin, ...]
[zk: localhost:2181(CONNECTED) 1] ls2 /
[cluster, controller_epoch, brokers, storm, zookeeper, admin, ....]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x130
cversion = 19
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 11
4.7. リスナーのパス取得 [watch]
get path [watch] で登録されたリスナーは、ノードの内容が変更されたときにクライアントに通知できます。なお、Zookeeper のトリガーは 1 回限りのトリガー (One-time トリガー)、つまり一度トリガーされるとすぐに失敗します。
[zk: localhost:2181(CONNECTED) 4] get /hadoop watch
[zk: localhost:2181(CONNECTED) 5] set /hadoop 45678
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop #节点值改变
4.8. リスナー統計パス [watch]
stat path [watch] を使用して登録されたリスナーは、ノードのステータスが変化したときにクライアントに通知できます。
[zk: localhost:2181(CONNECTED) 7] stat /hadoop watch
[zk: localhost:2181(CONNECTED) 8] set /hadoop 112233
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop #节点值改变
4.9. リスナー ls\ls2 パス [watch]
ls path [watch] または ls2 path [watch] を使用して登録されたリスナーは、
ノード配下のすべての子ノードの追加および削除操作を監視できます。
[zk: localhost:2181(CONNECTED) 9] ls /hadoop watch
[]
[zk: localhost:2181(CONNECTED) 10] create /hadoop/yarn "aaa"
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop
4.10. Zookeeper サーバーで一般的に使用されるコマンド
#启动 ZooKeeper 服务:
./zkServer.sh start
#查看 ZooKeeper 服务状态:
./zkServer.sh status
#停止 ZooKeeper 服务:
./zkServer.sh stop
#重启 ZooKeeper 服务:
./zkServer.sh restart
4.11. Zookeeperクライアントの共通コマンド
#连接ZooKeeper服务端
./zkCli.sh –server ip:port
#断开连接
quit
#查看命令帮助
help
#显示指定目录下节点
ls 目录
5. Zookeeper の Acl 権限制御
5.1. 概要
Zookeeper はファイル システムに似ています。クライアントはノードの作成、ノードの更新、ノードの削除を行うことができます。では、ノードのアクセス許可を制御するにはどうすればよいでしょうか? Zookeeper のアクセス制御リスト アクセス制御リストを使用してこれを行うことができます。
ACL 権限制御は、scheme:id:permission で識別され、主に次の 3 つの側面をカバーします。
- 許可モード (スキーム): 許可戦略
- 認可オブジェクト(id): 認可されたオブジェクト
- 許可: 許可が与えられました
その特徴は次のとおりです。
- ZooKeeper の権限制御は各 znode ノードに基づいており、ノードごとに権限を設定する必要があります。
- 各 znode は、複数の権限制御スキームと複数の権限の設定をサポートします。
- 子ノードは親ノードの権限を継承しません。クライアントにはノードにアクセスする権利はありませんが、その子ノードにはアクセスできる場合があります。
例えば:
setAcl /test2 ip:192.168.60.130:crwda // 将节点权限设置为Ip:192.168.60.130的客户端可以对节点进行增、删、改、查、管理权限
5.2. 許可モード
認可方法
プラン | 説明する |
---|---|
世界 | ユーザーは 1 人だけです: 誰でも、Zookeeper にログインする全員を表します (デフォルト) |
ip | クライアントにIPアドレス認証を使用する |
認証 | 認証を追加したユーザー認証を使用する |
ダイジェスト | 「ユーザー名:パスワード」方式を使用して認証します |
5.3. 認可されたオブジェクト
許可を与える者
認可オブジェクト ID は、IP アドレスやユーザーなど、権限が付与されるエンティティを指します。
5.4. 付与される権限
付与される権限
create、delete、read、writer、admin は、add、delete、modify、check、management の権限です。これら 5 つの権限は、cdrwa と略されます。注: これら 5 つの権限のうち、delete は子ノードの削除権限を指します。他の 4 つの権限は、自分のノードでの操作権限を指します。
権限 | ACLの略称 | 説明する |
---|---|---|
作成する | c | 子ノードを作成できる |
消去 | d | 子ノードも削除可能(下位ノードのみ) |
読む | r | ノードデータを読み込み、子ノード一覧を表示可能 |
書く | w | ノードデータを設定可能 |
管理者 | ある | ノードのアクセス制御リストの権限を設定可能 |
5.5. 認可関連のコマンド
注文 | 使用法 | 説明する |
---|---|---|
getAcl | getAcl | ACLの読み取り権限 |
setAcl | setAcl | ACL権限を設定する |
追加認証 | 追加認証 | 認証済みユーザーの追加 |
5.6. ケース
- ワールド認証モード:
注文
setAcl <path> world:anyone:<acl>
ケース
[zk: localhost:2181(CONNECTED) 1] create /node1 "node1"
Created /node1
[zk: localhost:2181(CONNECTED) 2] getAcl /node1
'world,'anyone #world方式对所有用户进行授权
: cdrwa #增、删、改、查、管理
[zk: localhost:2181(CONNECTED) 3] setAcl /node1 world:anyone:cdrwa
cZxid = 0x2
ctime = Fri Dec 13 22:25:24 CST 2019
mZxid = 0x2
mtime = Fri Dec 13 22:25:24 CST 2019
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
- IP認証モード:
注文
setAcl <path> ip:<ip>:<acl>
注: リモート ログイン Zookeeper コマンド: ./zkCli.sh -server ip
ケース
[zk: localhost:2181(CONNECTED) 18] create /node2 "node2"
Created /node2
[zk: localhost:2181(CONNECTED) 23] setAcl /node2
ip:192.168.60.129:cdrwa
cZxid = 0xe
ctime = Fri Dec 13 22:30:29 CST 2019
mZxid = 0x10
mtime = Fri Dec 13 22:33:36 CST 2019
pZxid = 0xe
cversion = 0
dataVersion = 2
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0
[zk: localhost:2181(CONNECTED) 25] getAcl /node2
'ip,'192.168.60.129
: cdrwa
#使用IP非 192.168.60.129 的机器
[zk: localhost:2181(CONNECTED) 0] get /node2
Authentication is not valid : /node2 #没有权限
- 認証認可モード:
注文
addauth digest <user>:<password> #添加认证用户
setAcl <path> auth:<user>:<acl>
ケース
[zk: localhost:2181(CONNECTED) 2] create /node3 "node3"
Created /node3
#添加认证用户
[zk: localhost:2181(CONNECTED) 4] addauth digest angyan:123456
[zk: localhost:2181(CONNECTED) 1] setAcl /node3 auth:angyan:cdrwa
cZxid = 0x15
ctime = Fri Dec 13 22:41:04 CST 2019
mZxid = 0x15
mtime = Fri Dec 13 22:41:04 CST 2019
pZxid = 0x15
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 0] getAcl /node3
'digest,'angyan:673OfZhUE8JEFMcu0l64qI8e5ek=
: cdrwa
#添加认证用户后可以访问
[zk: localhost:2181(CONNECTED) 3] get /node3
node3
cZxid = 0x15
ctime = Fri Dec 13 22:41:04 CST 2019
mZxid = 0x15
mtime = Fri Dec 13 22:41:04 CST 2019
pZxid = 0x15
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
- ダイジェスト認証モード:
注文
setAcl <path> digest:<user>:<password>:<acl>
ここでのパスワードはSHA1とBASE64で処理された暗号文であり、SHELLで次のコマンドを使用して計算できます。
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
まずは暗号文を計算しましょう
echo -n angyan:123456 | openssl dgst -binary -sha1 | openssl base64
ケース
[zk: localhost:2181(CONNECTED) 4] create /node4 "node4"
Created /node4
#使用是上面算好的密文密码添加权限:
[zk: localhost:2181(CONNECTED) 5] setAcl /node4
digest:angyan:qlzQzCLKhBROghkooLvb+Mlwv4A=:cdrwa
cZxid = 0x1c
ctime = Fri Dec 13 22:52:21 CST 2019
mZxid = 0x1c
mtime = Fri Dec 13 22:52:21 CST 2019
pZxid = 0x1c
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 6] getAcl /node4
'digest,'angyan:qlzQzCLKhBROghkooLvb+Mlwv4A=
: cdrwa
[zk: localhost:2181(CONNECTED) 3] get /node4
Authentication is not valid : /node4 #没有权限
[zk: localhost:2181(CONNECTED) 4] addauth digest angyan:123456 #添加
认证用户
[zk: localhost:2181(CONNECTED) 5] get /node4
1 #成功读取数据
cZxid = 0x1c
ctime = Fri Dec 13 22:52:21 CST 2019
mZxid = 0x1c
mtime = Fri Dec 13 22:52:21 CST 2019
pZxid = 0x1c
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
- 複数の認証モード:
同じノードで複数の認証モードを同時に使用できます
ケース
[zk: localhost:2181(CONNECTED) 0] create /node5 "node5"
Created /node5
[zk: localhost:2181(CONNECTED) 1] addauth digest angyan:123456 #添加认
证用户
[zk: localhost:2181(CONNECTED) 2] setAcl /node5
ip:192.168.60.129:cdra,auth:angyan:cdrwa,digest:angyan:qlzQzCLKhBROgh
kooLvb+Mlwv4A=:cdrwa
5.7、ACLスーパー管理者
Zookeeper にはスーパーと呼ばれる権限管理モードがあり、このモードはスーパー マネージャーが任意の権限でノードに簡単にアクセスできるようにします。
このスーパー管理者が super:admin であると仮定します。最初にスーパー管理者のパスワードの暗号文を生成する必要があります。
echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
次に、zookeeper ディレクトリ内の /bin/zkServer.sh サーバー スクリプト ファイルを開き、次の行を見つけます。
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
スクリプト内でzookeeperを起動するコマンドですが、デフォルトでは上記2つの設定項目しかありませんので、スーパー管理の設定項目を追加する必要があります。
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
変更後、この完全なコマンドは次のようになります。
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="\-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
次に、Zookeeper を起動し、次のコマンドを入力して権限を追加します。
addauth digest super:admin #添加认证用户
6.動物園飼育員のjavaApi
znode は、zookeeper コレクションのコア コンポーネントです。zookeeper API は、zookeeper コレクションを使用して znode のすべての詳細を操作するための小さなメソッド セットを提供します。
クライアントは、ZooKeeper サーバーと明確かつクリーンに対話する手順に従う必要があります。
- Zookeeper サーバーに接続します。Zookeeper サーバーはクライアントにセッション ID を割り当てます。
- 定期的なハートビートをサーバーに送信します。そうしないと、Zookeeper サーバーのセッション ID が期限切れになり、クライアントは再接続する必要があります。
- セッション ID がアクティブである限り、znode を取得/設定することができます。
- すべてのタスクが完了したら、Zookeeper サーバーから切断します。クライアントが長期間非アクティブな場合、Zookeeper サーバーは自動的にクライアントを切断します。
6.1. ZooKeeper への接続
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
- 接続文字列: 飼育員ホスト
- sessionTimeout : セッションタイムアウト (ミリ秒単位)
- watcher: 「モニター」オブジェクトを実装します。Zookeeper アンサンブルは、モニター オブジェクトを介して接続ステータスを返します。
場合:
public class ZookeeperConnection {
public static void main(String[] args) {
try {
// 计数器对象
CountDownLatch countDownLatch=new CountDownLatch(1);
// arg1:服务器的ip和端口
// arg2:客户端与服务器之间的会话超时时间 以毫秒为单位的
// arg3:监视器对象
ZooKeeper zooKeeper=new ZooKeeper("192.168.60.130:2181",5000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if(event.getState()==Event.KeeperState.SyncConnected)
{
System.out.println("连接创建成功!");
countDownLatch.countDown();
}
}
});
// 主线程阻塞等待连接对象的创建成功
countDownLatch.await();
// 会话编号
System.out.println(zooKeeper.getSessionId());
zooKeeper.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
6.2. 新しいノードの追加
// 同步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
// 异步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode,AsyncCallback.StringCallback callBack,Object ctx)
- パス : znode パス。たとえば、/node1 /node1/node11
- data : 指定された znode パスに保存されるデータ
- acl : 作成するノードのアクセス制御リスト。Zookeeper API は静的インターフェイスを提供します
- ZooDefs.Ids を使用して、基本的な ACL リストを取得します。たとえば、ZooDefs.Ids.OPEN_ACL_UNSAFE は、
znode を開く ACL のリストを返します。
- ZooDefs.Ids を使用して、基本的な ACL リストを取得します。たとえば、ZooDefs.Ids.OPEN_ACL_UNSAFE は、
- createMode: ノードのタイプ。これは列挙です。
- callBack: 非同期コールバック インターフェイス
- ctx: コンテキストパラメータを渡す
場合:
在这里插入代码片
6.3. ノードの更新
// 同步方式
setData(String path, byte[] data, int version)
// 异步方式
setData(String path, byte[] data, int version,AsyncCallback.StatCallback callBack, Object ctx)
- パス: znode パス
- data : 指定された znode パスに保存されるデータ。
- version: znode の現在のバージョン。データが変更されるたびに、ZooKeeper は znode のバージョン
番号を更新します。 - callBack: 非同期コールバック インターフェイス
- ctx: コンテキストパラメータを渡す
6.4. ノードの削除
// 同步方式
delete(String path, int version)
// 异步方式
delete(String path, int version, AsyncCallback.VoidCallback callBack,Object ctx)
- パス: znode パス。
- version: znode の現在のバージョン
- callBack: 非同期コールバック インターフェイス
- ctx: コンテキストパラメータを渡す
6.5. ノードの表示
// 同步方式
getData(String path, boolean b, Stat stat)
// 异步方式
getData(String path, boolean b,AsyncCallback.DataCallback callBack,Object ctx)
- パス: znode パス。
- b: 接続オブジェクトに登録されているモニターを使用するかどうか。
- stat: znode のメタデータを返します。
- callBack: 非同期コールバック インターフェイス
- ctx: コンテキストパラメータを渡す
6.6. 子ノードの表示
// 同步方式
getChildren(String path, boolean b)
// 异步方式
getChildren(String path, boolean b,AsyncCallback.ChildrenCallback callBack,Object ctx)
- パス: Znode パス。
- b: 接続オブジェクトに登録されているモニターを使用するかどうか。
- callBack: 非同期コールバック インターフェイス。
- ctx: コンテキストパラメータを渡す
6.7. ノードが存在するかどうかを確認する
// 同步方法
exists(String path, boolean b)
// 异步方法
exists(String path, boolean b,AsyncCallback.StatCallback callBack,Object ctx)
- パス: znode パス。
- b: 接続オブジェクトに登録されているモニターを使用するかどうか。
- callBack: 非同期コールバック インターフェイス。
- ctx: コンテキストパラメータを渡す