zookeeper
2016-12-17 18:19
309 查看
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
至此就可以成功启动了,可以使用
jps和
netstat -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实现一些分布式环境中的开发实现思路供学习参考
相关文章推荐
- 分布式版本管理git入门指南使用资料汇总及文章推荐
- 新闻
- 在VMware网络测试“专用VLAN”功能
- C#分布式事务的超时处理实例分析
- Erlang分布式节点中的注册进程使用实例
- Memcached 分布式缓存实现原理简介
- Redis实现分布式队列浅析
- Shell脚本实现自动安装zookeeper
- C++实现的分布式游戏服务端引擎KBEngine详解
- 基于Zookeeper的使用详解
- ASP.NET通过分布式Session提升性能
- Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法
- Python使用multiprocessing实现一个最简单的分布式作业调度系统
- 分享一个简单易用的RPC开源项目—Tatala
- 手把手教你配置Hbase完全分布式环境
- mesos + marathon + docker部署
- 基于zk的配置管理
- 搭建分布式架构2--CentOs下安装Tomcat7(环境准备)
- 搭建分布式架构4--ZooKeeper注册中心安装