|
@@ -2,7 +2,8 @@
|
|
|
title: 分布式协调工具之 Zookeeper
|
|
title: 分布式协调工具之 Zookeeper
|
|
|
date: 2020-07-29 13:52:23
|
|
date: 2020-07-29 13:52:23
|
|
|
categories:
|
|
categories:
|
|
|
-- 应用框架
|
|
|
|
|
|
|
+- 后端
|
|
|
|
|
+- Java
|
|
|
tags:
|
|
tags:
|
|
|
- 分布式
|
|
- 分布式
|
|
|
---
|
|
---
|
|
@@ -301,110 +302,110 @@ zk的数据模型的结构与`unix文件系统很类似`,整体上可以看作
|
|
|
[zk: localhost:2181(CONNECTED) 10] create /servers "servers"
|
|
[zk: localhost:2181(CONNECTED) 10] create /servers "servers"
|
|
|
```
|
|
```
|
|
|
- 服务器端向ZK注册并写入信息
|
|
- 服务器端向ZK注册并写入信息
|
|
|
- ```java
|
|
|
|
|
- import java.io.IOException;
|
|
|
|
|
- import org.apache.zookeeper.CreateMode;
|
|
|
|
|
- import org.apache.zookeeper.WatchedEvent;
|
|
|
|
|
- import org.apache.zookeeper.Watcher;
|
|
|
|
|
- import org.apache.zookeeper.ZooKeeper;
|
|
|
|
|
- import org.apache.zookeeper.ZooDefs.Ids;
|
|
|
|
|
-
|
|
|
|
|
- public class DistributeServer {
|
|
|
|
|
- private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
|
|
|
|
|
- private static int sessionTimeout = 2000;
|
|
|
|
|
- private ZooKeeper zk = null;
|
|
|
|
|
- private String parentNode = "/servers";
|
|
|
|
|
-
|
|
|
|
|
- // 创建到zk的客户端连接
|
|
|
|
|
- public void getConnect() throws IOException{
|
|
|
|
|
- zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
|
|
|
|
|
- @Override
|
|
|
|
|
- public void process(WatchedEvent event) {
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- // 注册服务器
|
|
|
|
|
- public void registServer(String hostname) throws Exception{
|
|
|
|
|
- String create = zk.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
|
|
|
|
|
- System.out.println(hostname +" is online "+ create);
|
|
|
|
|
- }
|
|
|
|
|
- // 业务功能
|
|
|
|
|
- public void business(String hostname) throws Exception{
|
|
|
|
|
- System.out.println(hostname+" is working ...");
|
|
|
|
|
- Thread.sleep(Long.MAX_VALUE);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static void main(String[] args) throws Exception {
|
|
|
|
|
- // 1获取zk连接
|
|
|
|
|
- DistributeServer server = new DistributeServer();
|
|
|
|
|
- server.getConnect();
|
|
|
|
|
- // 2 利用zk连接注册服务器信息
|
|
|
|
|
- server.registServer(args[0]);
|
|
|
|
|
- // 3 启动业务功能
|
|
|
|
|
- server.business(args[0]);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- ```
|
|
|
|
|
|
|
+ ```java
|
|
|
|
|
+ import java.io.IOException;
|
|
|
|
|
+ import org.apache.zookeeper.CreateMode;
|
|
|
|
|
+ import org.apache.zookeeper.WatchedEvent;
|
|
|
|
|
+ import org.apache.zookeeper.Watcher;
|
|
|
|
|
+ import org.apache.zookeeper.ZooKeeper;
|
|
|
|
|
+ import org.apache.zookeeper.ZooDefs.Ids;
|
|
|
|
|
+
|
|
|
|
|
+ public class DistributeServer {
|
|
|
|
|
+ private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
|
|
|
|
|
+ private static int sessionTimeout = 2000;
|
|
|
|
|
+ private ZooKeeper zk = null;
|
|
|
|
|
+ private final String parentNode = "/servers";
|
|
|
|
|
+
|
|
|
|
|
+ // 创建到zk的客户端连接
|
|
|
|
|
+ public void getConnect() throws IOException{
|
|
|
|
|
+ zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void process(WatchedEvent event) {
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ // 注册服务器
|
|
|
|
|
+ public void registServer(String hostname) throws Exception{
|
|
|
|
|
+ String create = zk.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
|
|
|
|
|
+ System.out.println(hostname +" is online "+ create);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 业务功能
|
|
|
|
|
+ public void business(String hostname) throws Exception{
|
|
|
|
|
+ System.out.println(hostname+" is working ...");
|
|
|
|
|
+ Thread.sleep(Long.MAX_VALUE);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
|
|
+ // 1获取zk连接
|
|
|
|
|
+ DistributeServer server = new DistributeServer();
|
|
|
|
|
+ server.getConnect();
|
|
|
|
|
+ // 2 利用zk连接注册服务器信息
|
|
|
|
|
+ server.registServer(args[0]);
|
|
|
|
|
+ // 3 启动业务功能
|
|
|
|
|
+ server.business(args[0]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+```
|
|
|
- 客户端向ZK注册并监听
|
|
- 客户端向ZK注册并监听
|
|
|
- ```java
|
|
|
|
|
- import java.io.IOException;
|
|
|
|
|
- import java.util.ArrayList;
|
|
|
|
|
- import java.util.List;
|
|
|
|
|
- import org.apache.zookeeper.WatchedEvent;
|
|
|
|
|
- import org.apache.zookeeper.Watcher;
|
|
|
|
|
- import org.apache.zookeeper.ZooKeeper;
|
|
|
|
|
-
|
|
|
|
|
- public class DistributeClient {
|
|
|
|
|
- private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
|
|
|
|
|
- private static int sessionTimeout = 2000;
|
|
|
|
|
- private ZooKeeper zk = null;
|
|
|
|
|
- private String parentNode = "/servers";
|
|
|
|
|
-
|
|
|
|
|
- // 创建到zk的客户端连接
|
|
|
|
|
- public void getConnect() throws IOException {
|
|
|
|
|
- zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
|
|
|
|
|
- @Override
|
|
|
|
|
- public void process(WatchedEvent event) {
|
|
|
|
|
- // 再次启动监听
|
|
|
|
|
- try {
|
|
|
|
|
- getServerList();
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- e.printStackTrace();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- // 获取服务器列表信息
|
|
|
|
|
- public void getServerList() throws Exception {
|
|
|
|
|
- // 1获取服务器子节点信息,并且对父节点进行监听
|
|
|
|
|
- List<String> children = zk.getChildren(parentNode, true);
|
|
|
|
|
- // 2存储服务器信息列表
|
|
|
|
|
- ArrayList<String> servers = new ArrayList<>();
|
|
|
|
|
- // 3遍历所有节点,获取节点中的主机名称信息
|
|
|
|
|
- for (String child : children) {
|
|
|
|
|
- byte[] data = zk.getData(parentNode + "/" + child, false, null);
|
|
|
|
|
- servers.add(new String(data));
|
|
|
|
|
- }
|
|
|
|
|
- // 4打印服务器列表信息
|
|
|
|
|
- System.out.println(servers);
|
|
|
|
|
- }
|
|
|
|
|
- // 业务功能
|
|
|
|
|
- public void business() throws Exception{
|
|
|
|
|
- System.out.println("client is working ...");
|
|
|
|
|
- Thread.sleep(Long.MAX_VALUE);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static void main(String[] args) throws Exception {
|
|
|
|
|
- // 1获取zk连接
|
|
|
|
|
- DistributeClient client = new DistributeClient();
|
|
|
|
|
- client.getConnect();
|
|
|
|
|
- // 2获取servers的子节点信息,从中获取服务器信息列表
|
|
|
|
|
- client.getServerList();
|
|
|
|
|
- // 3业务进程启动
|
|
|
|
|
- client.business();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- ```
|
|
|
|
|
|
|
+ ```java
|
|
|
|
|
+ import java.io.IOException;
|
|
|
|
|
+ import java.util.ArrayList;
|
|
|
|
|
+ import java.util.List;
|
|
|
|
|
+ import org.apache.zookeeper.WatchedEvent;
|
|
|
|
|
+ import org.apache.zookeeper.Watcher;
|
|
|
|
|
+ import org.apache.zookeeper.ZooKeeper;
|
|
|
|
|
+
|
|
|
|
|
+ public class DistributeClient {
|
|
|
|
|
+ private static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
|
|
|
|
|
+ private static int sessionTimeout = 2000;
|
|
|
|
|
+ private ZooKeeper zk = null;
|
|
|
|
|
+ private final String parentNode = "/servers";
|
|
|
|
|
+
|
|
|
|
|
+ // 创建到zk的客户端连接
|
|
|
|
|
+ public void getConnect() throws IOException {
|
|
|
|
|
+ zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void process(WatchedEvent event) {
|
|
|
|
|
+ // 再次启动监听
|
|
|
|
|
+ try {
|
|
|
|
|
+ getServerList();
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ // 获取服务器列表信息
|
|
|
|
|
+ public void getServerList() throws Exception {
|
|
|
|
|
+ // 1获取服务器子节点信息,并且对父节点进行监听
|
|
|
|
|
+ List<String> children = zk.getChildren(parentNode, true);
|
|
|
|
|
+ // 2存储服务器信息列表
|
|
|
|
|
+ ArrayList<String> servers = new ArrayList<>();
|
|
|
|
|
+ // 3遍历所有节点,获取节点中的主机名称信息
|
|
|
|
|
+ for (String child : children) {
|
|
|
|
|
+ byte[] data = zk.getData(parentNode + "/" + child, false, null);
|
|
|
|
|
+ servers.add(new String(data));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 4打印服务器列表信息
|
|
|
|
|
+ System.out.println(servers);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 业务功能
|
|
|
|
|
+ public void business() throws Exception{
|
|
|
|
|
+ System.out.println("client is working ...");
|
|
|
|
|
+ Thread.sleep(Long.MAX_VALUE);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
|
|
+ // 1获取zk连接
|
|
|
|
|
+ DistributeClient client = new DistributeClient();
|
|
|
|
|
+ client.getConnect();
|
|
|
|
|
+ // 2获取servers的子节点信息,从中获取服务器信息列表
|
|
|
|
|
+ client.getServerList();
|
|
|
|
|
+ // 3业务进程启动
|
|
|
|
|
+ client.business();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+```
|
|
|
|
|
|
|
|
## 参考链接
|
|
## 参考链接
|
|
|
|
|
|