分布式调度——zookeeper
一、 为什么需要zookeeper
l 大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)
l 大部分应用需要开发私有的协调程序,缺乏一个通用的机制
l 协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器
l 协调服务
二、 zookeeper简介
1. zookeeper是什么
l zookeeper是Google的Chubby一个开源的实现,是开源的分布式协调服务
l 它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等
l zookeeper是一个高性能的分布式数据一致性解决方案,它将那些复杂的,容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用
l 它的架构如下图:
2. zookeeper能帮我们做什么
l 分布式系统协调:多个节点一起完成一个动作
n 集群管理
n 选主
n 分布式
l 负载均衡,一般不用它
3. zookeeper的数据模型
l 层次化的目录结构,命名符合常规文件系统规范
l 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
l znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本
l 节点不支持部分读写,而是一次性完整读写
4. zookeeper的下载地址
l 网址:http://mirrors.cnnic.cn/apache/zookeeper/
三、 zookeeper基本概念
1. 集群角色
2. zookeeper节点类型
l persistent:persistent节点不和特定的session绑定,不会随着创建该节点的session的结束而消失,而是一直存在,除非该节点被显式删除
l ephemeral:ephemeral节点是临时性的,如果创建该节点的session结束了,该节点就会被自动删除,ephemeral节点不能拥有子节点,虽然ephemeral节点与创建它的session绑定,但只要该该节点没有被删除,其他session就可以读写该节点中关联的数据,使用-e参数指定创建ephemeral节点
l sequence:严格的说,sequence并非节点类型中的一种,sequence节点既可以是ephemeral的,也可以是persistent的,创建sequence节点时,ZooKeeper server会在指定的节点名称后加上一个数字序列,该数字序列是递增的,因此可以多次创建相同的sequence节点,而得到不同的节点,使用-s参数指定创建sequence节点
3. 版本
l Version:当前Znode的版本
l Cversion:当前Znode的子节点的版本
l Aversion:当前Znode的ACL(访问控制)版本
4. watcher
l 作用于Znode节点
l watcher设置后,一旦触发一次就会失效,如果需要一直监听,就需要再次注册
l 多种事件通知:数据更新,子节点状态等
l watcher会监控目录节点的数据变化以及子目录的变化,一旦发送改变,则通知所有设置在这个目录节点的watcher,从而做出相应的反应
5. zookeeper节点和配置常识
l zookeeper 提供了创建/修改/删除节点的功能,如果父节点没有创建,子节点会创建失败。如果父节点还有子节点,父节点不可以被删除
l zookeeper 和客户端之间以 socket 形式进行双向通讯,客户端可以主动调用服务器,服务器也可以主动向客户端推送事件
l zookeeper 的事件有传递机制,子节点的增删改触发的事件会向上层依次传播,所有的父节点都可以收到子节点的数据变更事件,所以层次太深/子节点太多会给服务器的事件系统带来压力,节点分配要做好周密的规划
l zookeeper 的读性能随着节点数量的提升能不断增加,但是写性能会随着节点数量的增加而降低,所以节点的数量不宜太多,一般配置成 3 个或者 5 个就可以了
四、 zookeeper的安装
1. 单机版
首先,验证本机是否有JDK环境,没有的先去第一天文档照做
1台机器,1个zk
先把包传上去
解压
如下目录,建个data目录,用于存放日志数据
将配置文件复制
修改数据目录为自己建的目录
启动和查看状态
关闭zk
2. 伪分布式
1台机器,3个zk
先看一下,有没有zookeeper在运行
将单机的,复制3份
3个zk分别写一个id
分别修改3个配置文件
3个机器的端口和路径修改,端口要不同,3台分别2181 2182 2183
3台尾部加上如下,注意修改IP
server.1=192.168.113.128:2881:3881
server.2=192.168.113.128:2882:3882
server.3=192.168.113.128:2883:3883
3台配置完成,去启动
第一台启动,此时报错是正常的
第二台启动之后,角色选举正常
第三台是跟随者
第一台也是跟随者
看完效果,3台都关闭,以免妨碍后面的实验
3. 完全分布式
3台机器,3个zk
首先,需要一些准备工作
(1) 关闭防火墙
(2) 关闭selinux
(3) 3台都起个主机名,我这里3台机器,分别叫 node01 node02 node03
(4) 配置映射,互相认识一下,加入以下内容,修改为自己IP
192.168.190.130 node01
192.168.190.131 node02
192.168.190.132 node03
(5) 3台都修改完,重启一下
(6) 还可以配置个SSH免密登录
第一台机器,生成密钥,一路回车
在第一台机器,将密钥,传送给3台机器
1号机去三号机
3号机回到1号机
开始做完全分布式:
把前面伪分别可以删了,再复制3份单机的
给3台分别写入id
3台修改路径,这里不用修改clientPort了
文件最后加入如下内容
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第一台机器,将配好的另外2个zk,传给另外2台机器
scp -r /usr/local/zookeeper02/ root@node02:/usr/local/zookeeper02
scp -r /usr/local/zookeeper03/ root@node03:/usr/local/zookeeper03
3台分别启动和查看状态,1主2从
五、 zookeeper详解
1. 解压后目录结构
2. 配置文件
进入脚本
./zkCli.sh
3. 运行脚本
直接运行zkCli.sh是连接自己的客户端,也可以连接其他机器客户端
4. 命令行操作
l help
l ls path [watch]
l create [-s] [-e] path data acl
l get path [watch]
l set path data [version]
l delete path [version]
l stat path [watch]
l setAcl path
可以创建目录,写内容
获取zk
可以监听此目录
监听到目录的变化