zookeeper由浅入深
1. 什么是zookeeper?
为分布式系统进行协调的服务
2. zookeeper有什么用?
可以在分布式系统中协作多个任务
3. zookeeper使用实例
1. HBase
zookeeper用于选举一个集群内的主节点,以便跟踪可用的服务器,并保存集群的元数据
2. kafka
zookeeper用于检测崩溃,实现主题(topic)的发现,并保持主题的生产和消费状态
4. zookeeper不适用的场景
1. 不适合用作海量数据存储
5. zookeeper单节点
1. 下载zookeeper
http://zookeeper.apache.org
2. 安装zookeeper
tar -zxvf zookeeper-3.4.10.tar.gz
3. 修改zoo.cfg文件和dataDir目录
cp zoo_sample.cfg zoo.cfg
dataDir=/usr/local/zookeeper-3.4.10/storage
4. 启动zookeeper
/usr/local/zookeeper-3.4.10/bin/zkServer.sh start 后台启动
/usr/local/zookeeper-3.4.10/bin/zkServer.sh start-foreground 前台启动
5. 客户端登录
/usr/local/zookeeper-3.4.10/bin/zkCli.sh
6. 默认只有/zookeeper节点
ls /
/zookeeper节点标记zookeeper服务所需的元数据树
7. 创建名为/workers的znode
create /workers "" 创建/workers节点,指定一个空字符串
8. 删除znode
delete /workers
6. 会话的状态和声明周期
1. 状态及状态的转换

7. zookeeper集群模式
保证三台服务器的时间同步
1. zookeeper集群节点
修改对应的hosts文件
192.168.1.67 node1
192.168.1.68 node2
192.168.1.69 node3
2. 安装目录
node1 /usr/local/server/zookeeper/zookeeper-3.4.6
node2 /usr/local/server/zookeeper/zookeeper-3.4.6
node3 /usr/local/server/zookeeper/zookeeper-3.4.6
3. 配置文档
/usr/local/server/zookeeper/zookeeper-3.4.6/conf/zoo.cfg
[zhangshaohua1510@node1 conf]$ cat zoo.cfg # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/local/server/zookeeper/storage # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir autopurge.snapRetainCount=10 # Purge task interval in hours # Set to "0" to disable auto purge feature autopurge.purgeInterval=24 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888
4. zookeeper有三个端口(可以修改)
2181 对cline端提供服务
3888 集群内机器通信使用(Leader监听此端口)
2888 选举leader使用
5. 配置参数说明
tickTime这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个tickTime时间就会发送一个心跳。
initLimit这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。
syncLimit这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
dataDir顾名思义就是zookeeper保存数据的目录,默认情况下zookeeper将写数据的日志文件也保存在这个目录里;
clientPort这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;
server.A=B:C:D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。
6. 创建ServerID标识
除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下。
这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C:D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件。
#在192.168.1.148服务器上面创建myid文件,并设置值为1,同时与zoo.cfg文件里面的server.1保持一致,如下
echo "1" > /opt/zookeeper/data/myid
7. zookeeper启动
/usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start
8. 查看zookeeper状态
/usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkServer.sh status
9. 客户端登录
/usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkCli.sh -server 192.168.1.67:2181,192.168.1.68:2181,192.168.1.69:2181
8. zookeeper数据结构
1. 概况
1. 层次化的目录结构,命名符合常规文件系统规范
2. 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
3. 节点znode可以包含数据和子节点
4. 客户端应用可以在节点上设置监听
5. 每个zone包含了一些基本的元数据信息,比如:数据版本号、创建时间、最后一次更新时间
6. zookeeper最大可存储1MB的数据。
2. 节点类型
1. znode有两种类型
1. 短暂 断开连接自己删除
2. 持久 断开连接不删除
2. znode有四种形式的目录节点(默认是persistent)
1. persistent
2. persistent_sequential
3. ephemeral
4. ephemeral_sequential
3. 创建znode时设置顺序标识,znode名称后附件一个值,顺序号是一个单调递增的计数器,由父节点维护
4. 在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
9. zookeeper客户端的使用
1. 登录本机或登录远程服务器
/usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkCli.sh 登录本机
/usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkCli.sh -server 192.168.1.67:2181,192.168.1.68:2181,192.168.1.69:2181 登录远程服务器
2. 创建znode
create /yangjianbo "yangjianbo"
3. 查看znode
get /yangjianbo
"yangjianbo" cZxid = 0xa400000131 ctime = Fri May 06 22:36:24 CST 2022 mZxid = 0xa400000131 mtime = Fri May 06 22:36:24 CST 2022 pZxid = 0xa400000131 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 12 numChildren = 0
4. 修改znode
set /yangjianbo "yichangkun"
5. 删除znode
delete /collections/milanyi/leader_elect
6. 监听
get /yangjianbo watch 监听数据改变 收到事件一次就失效,客户端还需要再次监听
WatchedEvent state:SyncConnected type:NodeDataChanged path:/yangjianbo
ls /yangjianbo watch 子节点改变
stat /yangjianbo watch 数据状态改变
10. zookeeper的选举机制
1. 全新集群选举
假如有5台机器,id 1-5
1. 先启动1,集群不能正常工作,1处于looking状态
2. 再启动2,因为id大,2得到2票,但是没有超过集群的半数(集群数从配置文件得到)
3. 再启动3,因为id更大,3得到3票,超过集群的半数,3成为leader
4. 再启动4,虽然4id更大,但是leader已经选出来了,4只能做follower
5. 再启动5,结果跟4一样
2. 非全新集群选举
参考的值: 数据version,leader id 和逻辑时钟
1. 逻辑时钟小的选举结果被忽略,重新投票
2. 统一逻辑时钟后,数据version大的胜出
3. 数据version一样,id大的胜出
10. zookeeper常见问题:
1. 日志过大。
迁移日志,重启zookeeper。
11. zookeeper开机启动
1. 系统为centos6
在/etc/rc.d/rc.local,添加启动命令,结果不生效。
2. 在/etc/init.d目录下,创建一个文件zookeeper,内容如下:
#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=/usr/local/java
case $1 in
start) /usr/local/zookeeper-3.4.6/bin/zkServer.sh start;;
stop) /usr/local/zookeeper-3.4.6/bin/zkServer.sh stop;;
status) /usr/local/zookeeper-3.4.6/bin/zkServer.sh status;;
restart) /usr/local/zookeeper-3.4.6/bin/zkServer.sh restart;;
*) echo "require start|stop|status|restart" ;;
esac
3. 把zookeeper加入系统启动服务
chkconfig --add zookeeper

浙公网安备 33010602011771号