ZooKeeperの4.飼育係の戦闘(開発フォーカス)
4.1分散インストールと展開
新規フォルダ
/opt/zk_cluster
飼育係は、アーカイブフォルダ、および名前の変更クラスタ1に加圧しました。
tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz -C ./zk_cluster/
新しいフォルダにクラスタ1に
zkData
zkDataフォルダに新しいファイルMYID、1の内容
echo 1 >> cluster1/zkData/myid
あなたはconfディレクトリzoo_sample.cfgファイルzoo.cfgをコピーします
cp zoo_sample.cfg zoo.cfg
zoo.cfgの内容を変更します。
dataDir=/opt/zk_cluster/cluster1/zkData clientPort=2187 ###########Cluster################## server.1=192.168.181.128:12887:13887 server.2=192.168.181.128:12888:13888 server.3=192.168.181.128:12889:13889
クラスター2、cluster3としてコピーのcluster1
cp -r cluster1/ cluster2 cp -r cluster1/ cluster3
クラスタ2の内容とcluster3 zkData / MYIDは変更2,3
zoo.cfgクラスター2とcluster3の内容を変更します
検証
スタート3 ZooKeeperの、ビューのステータス
./cluster1/bin/zkServer.sh start ./cluster1/bin/zkServer.sh status
[root@hwjsLinux zk_cluster]# ./cluster1/bin/zkServer.sh status /usr/bin/java ZooKeeper JMX enabled by default Using config: /opt/zk_cluster/cluster1/bin/../conf/zoo.cfg Client port found: 2187. Client address: localhost. Mode: follower
4.2クライアントのコマンドライン操作
コマンド | 説明 |
---|---|
LSパス[ウォッチ] | LSは、現在のznodeに含まれる内容を表示するコマンドを使用します |
LS2パス[ウォッチ] | 現在のノードのデータを表示し、更新やその他のデータの数を見ることができます |
作ります | -E -sは、一時的(消えるまたは再起動タイムアウト)を作成するのが一般的な配列を含みます |
パス[時計]を取得 | ノードの値を取得 |
セットする | ノードの具体的な値 |
STAT | ビューノードステータス |
削除 | [ノードの削除 |
RMR | 再帰的な削除ノード |
クライアントを起動します
./zkCli.sh -server localhost:2187
すべての操作コマンド
help
現在のznodeに含まれるコンテンツを見ます
[zk: localhost:2181(CONNECTED) 0] ls / [zookeeper]
現在のノード詳細データを見ます
[zk: localhost:2181(CONNECTED) 1] ls2 / [zookeeper] cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1
これは、二つの通常のノードを作成しました
[zk: localhost:2181(CONNECTED) 3] create /sanguo "jinlian" Created /sanguo [zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo "liubei" Created /sanguo/shuguo
ノードの値を取得
[zk: localhost:2181(CONNECTED) 5] get /sanguo jinlian cZxid = 0x100000003 ctime = Wed Aug 29 00:03:23 CST 2018 mZxid = 0x100000003 mtime = Wed Aug 29 00:03:23 CST 2018 pZxid = 0x100000004 cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 7 numChildren = 1 [zk: localhost:2181(CONNECTED) 6] get /sanguo/shuguo liubei cZxid = 0x100000004 ctime = Wed Aug 29 00:04:35 CST 2018 mZxid = 0x100000004 mtime = Wed Aug 29 00:04:35 CST 2018 pZxid = 0x100000004 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
短いノードを作成します。
[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu" Created /sanguo/wuguo
(1)現在のクライアントで閲覧することができます
[zk: localhost:2181(CONNECTED) 3] ls /sanguo [wuguo, shuguo]
(2)現在のクライアントを終了し、クライアントを再起動します
[zk: localhost:2181(CONNECTED) 12] quit [atguigu@hadoop104 zookeeper-3.4.10]$ bin/zkCli.sh
(3)再度ディレクトリのルートノードを表示するには、削除されたショートを有します
[zk: localhost:2181(CONNECTED) 0] ls /sanguo [shuguo]
シリアル番号を持つノードを作成します。
(1)共通のルートを作成/三国/ weiguo
[zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao"
Created /sanguo/weiguo
(2)ノードの数と作成します
[zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/xiaoqiao "jinlian"
Created /sanguo/weiguo/xiaoqiao0000000000
[zk: localhost:2181(CONNECTED) 3] create -s /sanguo/weiguo/daqiao "jinlian"
Created /sanguo/weiguo/daqiao0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /sanguo/weiguo/diaocan "jinlian"
Created /sanguo/weiguo/diaocan0000000002
彼らはノード番号がなかった場合は、ゼロから順次インクリメント。2から、元のノードの下の既存の2つのノードが、並べ替えもしそうなら。
ノードのデータ値を変更
[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"
モニタは、ノードの値に変更します
hadoop104上の(1)変更リスナー登録データ/三国ホストノード
[zk: localhost:2181(CONNECTED) 26] [zk: localhost:2181(CONNECTED) 8] get /sanguo watch
(2)hadoop103上のデータ/三国ホストノードを変更します
[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"
(3)観測hadoop104ホストは、監視データの変更を受信します
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo
- ノード変更リスナーの子供(経路変更)
(1)登録された子ノードモニタ/三国ノードホストhadoop104に変化します
[zk: localhost:2181(CONNECTED) 1] ls /sanguo watch
[aa0000000001, server101]
(2)hadoop103ホスト上の子ノードを作成/三国ノード
[zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi"
Created /sanguo/jin
(3)観測hadoop104ホストは、子ノードモニタの変更を受信します
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo
- [ノードの削除
[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin
- 再帰的な削除ノード
[zk: localhost:2181(CONNECTED) 15] rmr /sanguo/shuguo
- ビューノードステータス
[zk: localhost:2181(CONNECTED) 17] stat /sanguo
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000011
mtime = Wed Aug 29 00:21:23 CST 2018
pZxid = 0x100000014
cversion = 9
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1
4.3 APIアプリケーション
pom.xml
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</version> </dependency>
テストコード
public class TestZookeeper { // private String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181"; private String connectString="192.168.181.128:2187,192.168.181.128:2188,192.168.181.128:2189"; private int sessionTimeout = 2000; private ZooKeeper zkClient; @Before public void init() throws IOException{ zkClient = new ZooKeeper(connectString, sessionTimeout , new Watcher() { @Override public void process(WatchedEvent event) { System.out.println("---------start----------"); List<String> children; try { children = zkClient.getChildren("/", true); for (String child : children) { System.out.println(child); } System.out.println("---------end----------"); } catch (Exception e) { e.printStackTrace(); } } }); } // 1 创建节点 @Test public void createNode() throws KeeperException, InterruptedException{ String path = zkClient.create("/atguigu", "dahaigezuishuai".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println(path); } // 2 获取子节点 并监控节点的变化 @Test public void getDataAndWatch() throws KeeperException, InterruptedException{ List<String> children = zkClient.getChildren("/", true); for (String child : children) { System.out.println(child); } Thread.sleep(Long.MAX_VALUE); } // 3 判断节点是否存在 @Test public void exist() throws KeeperException, InterruptedException{ Stat stat = zkClient.exists("/atguigu", false); System.out.println(stat==null? "not exist":"exist"); } }
4.4モニタ・サーバ・ノードを動的大文字と小文字
需要
分散システムは、マスタノードが複数を有することができ、リアルタイムRenyiyitaiクライアントは、プライマリノードサーバをオフラインを知覚することができ、動的に組立ラインオフにすることができます。
実現
サーバ・コード
public class DistributeServer { public static void main(String[] args) throws Exception { String hostname = "test4"; DistributeServer server = new DistributeServer(); // 1 连接zookeeper集群 server.getConnect(); // 2 注册节点 server.regist(hostname); // 3 业务逻辑处理 server.business(); } private void business() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } private void regist(String hostname) throws KeeperException, InterruptedException { String path = zkClient.create("/servers/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println(hostname +" is online "); } // private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181"; private String connectString="192.168.181.128:2187,192.168.181.128:2188,192.168.181.128:2189"; private int sessionTimeout = 2000; private ZooKeeper zkClient; private void getConnect() throws IOException { zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() { @Override public void process(WatchedEvent event) { // TODO Auto-generated method stub } }); } }
クライアントコード
public class DistributeClient { public static void main(String[] args) throws IOException, KeeperException, InterruptedException { DistributeClient client = new DistributeClient(); // 1 获取zookeeper集群连接 client.getConnect(); // 2 注册监听 client.getChlidren(); // 3 业务逻辑处理 client.business(); } private void business() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } private void getChlidren() throws KeeperException, InterruptedException { List<String> children = zkClient.getChildren("/servers", true); // 存储服务器节点主机名称集合 ArrayList<String> hosts = new ArrayList<>(); for (String child : children) { byte[] data = zkClient.getData("/servers/"+child, false, null); hosts.add(new String(data)); } // 将所有在线主机名称打印到控制台 System.out.println(hosts); } // private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181"; private String connectString="192.168.181.128:2187,192.168.181.128:2188,192.168.181.128:2189"; private int sessionTimeout = 2000; private ZooKeeper zkClient; private void getConnect() throws IOException { zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() { @Override public void process(WatchedEvent event) { try { getChlidren(); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }
テスト
クライアントサービス側の発表により、動的にサーバーを停止情報を入手。