第一章:Zookeeper的概述
1.1 Zookeeper的简介
1. 是一个分布式管理框架,用java语言编写的 2. 主要为分布式应用程序(hdfs,hbase)提供协调服务管理 3. 提供了类似于Unix的目录树结构的一个数据存储模拟 4. 提供了相应的API接口,供其他编程语言来调用。
1.2 Zookeeper集群的特点
1. 也是一个分布式集群,一个领导者(leader),多个跟随者(follower). 2. 集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务。 3. 全局数据一致性:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。 4. 更新请求按顺序进行:服务器会将所有的客户端请求按照时间顺序执行。 5. 数据更新的原子性:一次数据的更新要么成功,要么失败 6. 数据的实时性: 只要有一台服务器更新数据了,那么其他节点会快速同步该数据,保证客户端可以正常读取数据
1.3 Zookeeper的数据存储模型
Zookeeper的数据模型采用的与Unix文件系统类似的层次化的树形结构。我们可以将其理解为一个具有高可用特征的文件系统。这个文件系统中没有文件和目录,而是统一使用"节点"(node)的概念,称之为znode。znode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成了一个层次化的命名空间。
特点:
- Zookeeper 被设计用来实现协调服务(这类服务通常使用小数据文件),而不是用于大容量数据存储,因此一个znode能存储的数据被限制在1MB以内, - 每个znode都是用绝对路径来表示的
第二章:Zookeeper集群的搭建和使用
2.1 集群的搭建
2.1.1 布局安排
qianfeng01 QuorumPeerMain qianfeng02 QuorumPeerMain qianfeng03 QuorumPeerMain
2.1.2 安装步骤
1)上传、解压、更名、配置环境变量
[root@qianfeng01 ~]# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/ [root@qianfeng01 ~]# cd /usr/local/ [root@qianfeng01 local]# mv zookeeper-3.4.10/ zookeeper root@qianfeng01 local]# vim /etc/profile ........省略.............. #zookeeper environment export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$ZOOKEEPER_HOME/bin:$PATH [root@qianfeng01 local]# source /etc/profile [root@qianfeng01 local]# zkServer.sh 《======利用tab键补全,证明环境变量配置成功
2)配置zoo.cfg文件
[root@qianfeng01 local]# cd ./zookeeper/conf/ [root@qianfeng01 conf]# cp zoo_sample.cfg zoo.cfg #复制出zoo.cfg文件 [root@qianfeng01 conf]# vi zoo.cfg tickTime=2000 # 定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。 initLimit=10 #follower连接并同步leader的初始化连接时间。 syncLimit=5 #心跳机制的时间(正常情况下的请求和应答的时间) dataDir=/usr/local/zookeeper/zkData #修改zookeeper的存储路径,zkData目录一会要创建出来 clientPort=2181 #客户端连接服务器的port server.1=qianfeng01:2888:3888 # 添加三个服务器节点 server.2=qianfeng02:2888:3888 server.3=qianfeng03:2888:3888 解析Server.id=ip:port1:port2 id: 服务器的id号,对应zkData/myid文件内的数字 ip: 服务器的ip地址 port1: follower与leader交互的port port2: 选举期间使用的port 注意:此配置文件中,不支持汉字注释
3)维护zkData目录,并将serverid写入myid文件
[root@qianfeng01 conf]# cd .. [root@qianfeng01 zookeeper]# mkdir zkData [root@qianfeng01 zookeeper]# cd zkData [root@qianfeng01 zkData]# echo "1" >> myid
4)scp同步另外两台机器
zookeeper和/etc/profile 注意: 需要修改另外两台机器的myid文件里的值 [root@qianfeng01 ~]# ssh qianfeng02 [root@qianfeng02 ~]# echo "2" > /usr/local/zookeeper/zkData/myid [root@qianfeng02 ~]# ssh qianfeng03 [root@qianfeng03 ~]# echo "3" > /usr/local/zookeeper/zkData/myid
2.1.3 集群的启动
1. 启动指令 zkServer.sh start 注意事项: 三台机器必须都要执行该指令,时间差不差的太多 2. 如何确定服务真的启动了 不能只是用jps查看, 需要配合zkServer.sh status才行 3. 启动日志zookeeper.out的位置: 在哪里启动,就生成到哪里
2.2 常用命令的使用
2.2.1 客户端连接zookeeper
语法: zkCli.sh -server host:port eg: zkCli.sh -server qianfeng03:2181 zkCli.sh -serveer qianfeng03 默认使用2181 zkCli.sh 默认连接本地服务器
2.2.2 常用指令
ls : 列出一个znode的子znode ls /citys ls2 : 除了ls的功能外,还会列出znode的详情 ls2 /citys citys节点的详情 create: 创建znode create [-s] [-e] path data 注意:必须给节点设置data, 至少是一个空字符串 -s: 创建节点时,自动分配顺序编号名称 -e: 临时节点, 创建者一旦退出,节点自动删除。 默认是永久节点 get: 查看znode的存储内容 set: 修改znode的存储内容 delete:删除znode, 只能删除一个普通的znode rmr: 如果是非空的znode,delete删不掉,需要使用rmr quit : 推出
2.3 znode的种类
两大类: 永久性znode 临时znode 如果带有-s, 这两大类都会有顺序znode。
第三章:Zookeeper的工作机制
3.1 选举制度
3.1.1 影响选举制度的因素
1. server.id的id 2. zxId: 服务器上的最新数据的状态值,通常情况下,所有服务器的这个值是相同的,除非网络震荡或者未成功同步数据 3. epoch:逻辑时钟 选举leader的次数 4. server的状态 leader: 领导者状态 follower:跟随状态 可以同步leader的数据,可以转成looking looking: 竞选状态 observering:观察状态 不会参与竞选,但是会同步leader的数据 epoch > zxID > serverid
3.1.2 开机过程中的一个选举机制
假如有五台机器参与竞选。启动顺序分别是server01,server02, server03,server04,server05
3.2 zookeeper的监听通知机制
客户端程序会运行main线程。 1. 调用zk的api接口,创建监听对象和连接对象 2. 使用连接对象发送要监听的信息 3. zk集群负责保存这个信息(注册监听事件) 4. 当zk集群监听到相关信息的变化后,会通知对应的客户端 5. 客户端通过listener对象接受到通知后,会执行自己的相应的处理逻辑
命令行演示:
启动一个客户端: ls /citys watch : 监听citys的子znode的数量变化 get /citys watch : 监听citys的数据内容变化
3.3 zookeeper的写流程
1. Client向Zookeeper的server1上写数据,发送一个写请求
2. 如果server1不是leader,那么server1会把请求进一步转发给leader。
3. 这个leader会将写请求广播给所有server。
4. 各个Server写成功后就会通知leader。
5. 当leader收到半数以上的server写成功的通知,就说明数据写成功了。写成功后,leader会告诉server1数据写成功了。
6. server1会进一步通知Client数据写成功了。这时就认为整个写操作成功。