zookeeper

zookeeper

zookeeper作为分布式协调服务,从dubbo、codis到hadoop都无处不在,在此记录在开发中实现一些功能的思路

  • master选举
  • 配置管理
  • 负载均衡
  • 分布式锁
  • ID生成器
  • 分布式队列

安装

zookeeper 是Java语言的实现产品,请确保平台安装了JDK。

$ cd /usr/local
$ wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
$ tar -zxvf zookeeper-3.4.8.tar.gz 
$ cd zookeeper-3.4.8/conf
$ cp zoo_sample.cfg zoo.cfg 
$ mkdir /var/data/zookeeper
$ vim zoo.cfg 
修改 dataDir=/var/data/zookeeper 保存

运行

$ cd /usr/local/zookeeper-3.4.8/bin/
$ ./zkServer.sh --help
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.8/bin/../conf/zoo.cfg
Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
$ ./zkServer.sh start
Starting zookeeper ... STARTED

至此就可以成功启动了,可以使用jpsnetstat -tnlp查看运行情况,使用zkCli.sh可以连接到zk服务器,-server选项可以连接指定ip:port的zk服务器。

$ zkCli.sh -server 127.0.0.1:2181

集群

这里使用三台服务器分别为192.168.34.132、192.168.34.133、192.168.34.135,并以此按照以上方式在三台服务器安装了zookeeper。
接下来配置结群,zookeeper要求集群节点为奇数,只要半数以上存活整个集群就可以正常工作。

在三台节点上均执行如下操作:

$ vim /usr/local/zookeeper-3.4.8/conf/zoo.cfg
## 在配置文件最后追加如下配置
server.1=192.168.34.132:2888:3888
server.2=192.168.34.133:2888:3888
server.3=192.168.34.135:2888:3888

zookeeper集群需要在数据目录(zoo.cfg中dataDir指向的目录)建立名为myid的文件,并在myid文件里写入当前节点的的id,id值随意,但在集群中要保持唯一,并且和zoo.cfg中得server.id中的id对应即可;分别在三台节点执行

192.168.34.132

$ echo "1" > /var/data/zookeeper/myid

192.168.34.133

$ echo "2" > /var/data/zookeeper/myid

192.168.34.135

$ echo "3" > /var/data/zookeeper/myid

启动三台zookeeper节点即可,可以使用./zkServer.sh status查看三台节点的运行状态,其中一台为Mode: leader,两外两个节点为Mode: follower,至此zookeeper集群搭建完成。

实战应用

在此给出开发中实现一些功能的思路

master选举

  • 应用场景:多个节点提供服务,但同时只有一个活动,作为master,当master节点故障需要动态选举新的master。
  • 实现思路:每个节点都去zk上指定节点下建立指定name的临时节点,能建立成功就为master节点,就视为选举成功,并在zk节点记录该master节点的信息,其他节点都需要监听此zk节点的变化(删除),zk临时节点的意义在于网络原因或者master节点挂掉失去与zk网络链接时自动删除;如果zk节点被删除,所以候选节点会得到通知,新一轮master选举开始,过程和上述过程类似。

配置管理

  • 应用场景:多个节点运行同一服务(应用),配置改变后每个节点都需要更新加载新配置。
  • 实现思路:生产者(配置管理程序)将数据发布于指定zk节点,消费者(所有运行同一服务的应用)监听zk节点的数据变化,数据有变化则将最新zk节点的配置数据拉倒本地保存,应用重新加载(必要时重启)服务,这里有一个简单的实现spring配置管理实现可参考:[spring配置管理]

负载均衡

  • 应用场景:多个节点同时提供相同服务,可以实现根据每个节点的负载来动态合理分发。
  • 实现思路:每个服务节点将自己节点信息写入zk指定节点上,并记录此服务节点的负载计数器,当服务节点被调用就更新本服务节点在zk上的负载计数器(增加),调用完成再更新(减少),每次服务分发前判断服务节点的负载计数器,选取负载计数器最小(最优)的服务节点作为当次服务节点对象。

分布式锁

  • 应用场景:多个节点(进程)可能同时操作同一资源,目标资源同时只能被一个节点写操作(排他锁),操作资源先获得锁,才能操作,操作完成释放锁。
  • 实现思路:获取锁的过程可在zk指定节点下建立顺序临时节点,并立即获取指定zk节点下的所有子节点,取出顺序最小的zk节点判断是不是自己建立的zk节点,如果是则为获取到锁,操作完资源后删除zk上此节点,释放锁;如果顺序最小的zk节点不是自己建立的那个节点,则监听比自己创建节点小的顺序节点删除事件,如果比自己建立的顺序小的那个节点被删除,则资源释放,自己就获得了锁。

ID生成器

  • 应用场景:分布式环境提供全局唯一的ID,比起UUID的无规律,分布式ID唯一切能有序。
  • 实现思路:在指定zk节点下建立持久顺序节点,返回新建立的持久顺序节点的顺序可以作为一个全局唯一ID,为保证zk节点过多,取到后可删除此节点。

分布式队列

  • 应用场景:生产者生产消息,消费者消费消息,应用场景参考MQ。
  • 实现思路:生产者在指定的zk节点下建立顺序子节点,并写入数据(消息),消费者监听此zk节点子节点变化,子节点变化取其下所有子节点排序,取顺序最小一个节点数据后再删除顺序最小的节点,如果读取顺序节点失败或者删除失败,都视为此消息被其他消费者消费,继续读取比最小顺序大一个节点消费,依赖递归,一直监听。

以上为zk实现一些分布式环境中的开发实现思路供学习参考

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值