ZooKeepe系列(3)--基于ZooKeeper实现主从协作

主-从模式的模型中,主要包括三个角色:

主节点:主要负责监视新的节点和任务,分配任务给可用的从节点;

从节点:通过注册自己,确保主节点看到它们可以执行任务,收到主节点分配的任务后,执行并记录状态;

客户端:创建新的任务并等待系统响应。

1. Zookeeper节点介绍

现通过ZooKeeper的API完成简单的主从协作。在此之前,需了解下ZooKeeper中节点的基本概念。节点的类型分为以下几类:

    1. 持久节点:节点创建后就一直存在,直到有删除操作来主动删除该节点

    2. 临时节点:临时节点的生命周期和创建该节点的客户端会话绑定,即如果客户端会话失效(客户端宕机或下线),这个节点自动删除 

    3. 时序节点:创建节点是可以设置这个属性,ZooKeeper会自动为给定的节点加上一个数字后缀,作为新的节点名。数字后缀的范围是整型的最大值

     4. 临时性时序节点:同时具备临时节点与时序节点的特性,主要用于分布式锁的实现

2. 各个角色的实现

基于Zookeeper各个类型节点的特点,实现主从模式中的各个角色。在ZooKeeper中创建以下节点用于主从协作:

/master 表示主节点;

/workers/worker-id 表示从节点;

/tasks/task-id 表示任务;

/assign 表示任务分配情况。

2.1 主节点角色

因为只有一个进程会成为主节点,所以进程成为主节点后必须锁定管理权,因此进程需要创建名为/master的临时节点,并写入数据,记录该进程的信息,如IP,编号等。

其它进程在尝试创建/master成为主节点时,ZooKeeper会报错,提示该节点已存在。然而主节点可能会崩溃,其它节点需要接替它成为主节点,因此需要在主节点/master上设置监视点(watch)。当监视到/master不存在时,该进程再次创建/master节点,尝试成为主节点。

2.2 节点角色

从节点首先要通知主节点,告知主节点自己可以执行任务。从节点通过在/workers子节点下创建临时节点,并在字节点中使用主机名或IP来标识自己,如:/workers/worker1.example.com。主节点通过监视(watch)/workers节点,获取所有可用的从节点信息。

从节点需要在/assign下创建自己的子节点,用于接收任务分配,如/assign/worker1.example.com,并监视这个节点的变化,等待新的任务。

2.3 客户端角色

客户端向系统中添加任务(有序节点),我们需要按照任务添加的顺序创建节点,其本质上是一个队列。如执行操作create -s /tasks/task-,会生成/tasks/task-00(数字依次递增),客户端需要知道该任务的完成状态,因此需要监视(watch)该节点。

3. 各个角色相互配合实现主从协作

主节点监视/tasks,当客户端添加任务时,创建/tasks/task-00,主节点收到通知,会去/workers下检查可用的从节点。

获取到从节点列表后,选择其中一个从节点,分派任务:/assign/worker1.example.com/task-00。

从节点通过监视/assign/worker1.example.com,获取自己的任务,并执行。任务完成后,从节点会在/tasks/task-00下更新状态,告知客户端该任务已完成:/tasks/task-00/status。

客户端收到完成任务完成的通知后,整个任务的执行就结束了。当然任务可能会非常复杂,甚至涉及另一个分布式系统。但是不管是什么样的任务,执行的机制与通过ZooKeeper来传递结果,本质上都是一样的。

 

欢迎关注我的微信公众号(Sunnick,请扫码关注),随时留言交流~

 

 

 

 

### ZooKeeper简介 ZooKeeper 是一种分布式协调服务,用于维护配置信息、命名、提供分布式同步以及组服务等功能[^1]。它能够帮助开发者构建可靠的分布式系统。 以下是关于 ZooKeeper 的一些核心概念和技术细节: --- #### 下载与安装 可以通过官方 Apache 存储库下载最新版本的 ZooKeeper 软件包,并解压至目标目录: ```bash # 创建安装目录并切换到该目录 mkdir -p /opt/soft/zookeeper/ cd /opt/soft/zookeeper/ # 下载 ZooKeeper 压缩包 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz # 解压缩文件 tar xvzf apache-zookeeper-3.8.2-bin.tar.gz ``` 完成上述操作后即可获得完整的 ZooKeeper 安装环境。 --- #### 修改脚本权限 为了使某些管理脚本能正常运行,通常需要调整其执行权限。例如,在 `bin` 目录下的 `zookeeper.sh` 文件可以设置为可执行状态: ```bash chmod 777 zookeeper.sh ``` 这一步会赋予所有用户对该脚本的最大权限(读、写、执行)。需要注意的是,实际生产环境中应根据具体需求合理分配权限[^2]。 --- #### 配置文件详解 (`zoo.cfg`) ZooKeeper 的主要配置位于 `conf/zoo.cfg` 文件中,其中的关键参数如下所示[^3]: - **tickTime**: 设置心跳间隔,默认单位为毫秒 (ms),推荐值为 2000 ms。 ```properties tickTime=2000 ``` - **initLimit 和 syncLimit**: 这些参数定义 Leader-Follower 同步过程中的超时限制。 ```properties initLimit=10 syncLimit=5 ``` - **dataDir 和 dataLogDir**: 数据存储路径和事务日志路径需分别指定独立目录。 ```properties dataDir=/usr/local/zookeeper-3.5.7/data dataLogDir=/usr/local/zookeeper-3.5.7/logs ``` - **clientPort**: 提供给客户端连接的服务端口,默认为 2181。 ```properties clientPort=2181 ``` - **server.X 参数**: 当部署集群模式时,每台机器都需要声明自己的角色及其通信端口号。 ```properties server.1=192.168.88.79:3188:3288 server.2=192.168.88.80:3188:3288 server.3=192.168.88.20:3188:3288 ``` 其中 X 表示节点编号;IP 地址后的第一个端口用于 Follower-Leader 间的消息传递,第二个端口则服务于选举机制。 另外还需在对应的数据目录下创建名为 `myid` 的文本文件,内容即为当前实例的角色编号 A。 --- #### 监听器工作原理 当应用程序通过 Java API 或其他 SDK 接入 ZooKeeper 时,内部实现涉及多个线程协作[^4]: - 主线程负责初始化客户端对象; - Connect 线程维持网络层交互; - Listener 线程捕获远程变更通知并通过回调函数触发业务逻辑处理流程。 这种设计使得实时感知资源变动成为可能,同时也增强了系统的响应速度和服务质量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值