官网下载地址:Apache Downloads
1.下载下来选择自己的目录解压,tar -zxvf 压缩包
2.解压以后,直接在bin的目录下执行 ./zkServer.sh 启动会失败,因为conf下缺少zoo.cfg文件
3.将conf下的zoo_sample.cfg改为zoo.cfg
# zookeeper时间配置的基本单位 tickTime=2000 # follower允许初始化连接leader的最大时长,表示ticktime的时间倍数 # synchronization phase can take initLimit=10 # follower与leader的数据同步的最大时长,表示ticktime的时间倍数 # sending a request and getting an acknowledgement syncLimit=5 # 数据目录 # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/tmp/zookeeper # the port at which the clients will connect默认端口 clientPort=2181 # the maximum number of client connections. # 单个客户端与zookeeper的最大并发连接数 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 # # 保存数据快照额数量之外的将被清除 autopurge.snapRetainCount=3 # Purge task interval in hours # 自动触发清除任务的时间间隔,小时为单位,为0 ,表示不清除 autopurge.purgeInterval=1
4.采用指定配置文件的方式启动 ./zkServer.sh start ../conf/zoo.cfg,
启动失败注意:防火墙未关闭、端口8080被占用了
简单命令服务端: 启动zookeeper: ./zkServer.sh start ../conf/zoo.cfg 查看状态zookeeper: ./zkServer.sh status ../conf/zoo.cfg 停止zookeeper: ./zkServer.sh stop ../conf/zoo.cfg 客户端: 进入客户端:./zkCli.sh 查看内容: ls /zookeeper 内部数据模型 zookeeper如何保存数据的:
有点类似一个树形结构,节点就是znode,多个znode组成一个树的目录结构,不同于树形结构,znode的引用方式是路径引用,类似文件路径
命令比较简单,随便输入不合法的命令,会有提示
znode的结构包含四部分:
data: 保存数据
acl: c:创建 w:写的 r:读的 d:删除 a:admin
stat:描述当前znode的元数据
child:当前节点的子节点
znode节点的类型:
持久节点:创建出来的节点,会话结束依然存在
持久序号节点:创建出来的节点,根据先后顺序会在节点之后带上一个数值,越往后执行顺序越大,适合分布式锁的应用场景
临时节点:会话结束后,会被删除,通过这个特性zk可以实现注册与发现。
临时序号节点:跟持久序号节点相同,适合临时的分布式锁
container节点:容器节点,当容器中没有子节点,会被zk定期删除
TTL节点:可以指定节点的过期时间,过期被zk自动删除,只能通过系统配置zookeeper.extendedTypesEnabled开启
zookeeper数据持久化:
zk的数据是存在内存里面的,zk提供了两种持久化机制。
事务日志:
zk把执行的命令以日志的形式保存到dataLogDir指定的路径中的文件中,如果没有指定的dataLogDir,则按dataDir指定的路径
数据快照:
zk会在一定时间间隔内做一次内存数据快照,把当前的内存数据存到快照文件里
zk通过两种消息的持久化,恢复数据时先恢复快照文件中的数据到内存,再用日志文件中的命令做增量恢复,这样恢复更快
节点命令:查询节点信息:get -s 节点
删除节点:
delete 节点
delete -v (数据版本) 节点
权限命令:
addauth digest yang:123456
create /test-node abcd auth:yang:123456:cdwra
zk的分布式锁:读锁:获取读锁,必须要之前没有写锁
写锁:获取写锁才可以写,之前没有任何锁
zk如何上读锁:
创建一个临时节点序号,节点的数据是read,表示读锁
获取zk中序号比自己小的所有节点
判断最小节点是否是读锁:
不是读锁,加锁失败,为最小的节点设置监听,阻塞等待,zk的watch机制会当最小节点发生变化时,通知当前节点,再执行第二步的流程
是读锁,上锁成功
zk如何上写锁:
创建一个临时节点序号,节点的数据是write,表示写锁
获取zk中的所有子节点
判断自己是否是最小的节点
如果是,则上写锁成功。
如果不是,说明前面还有锁,则上锁失败,监听最小的节点,如果最小的节点有变化,回到第二步。
羊群效应:上述的上锁方式,只要节点发生变化,就会触及其他节点的监听事件,这样的话对zk的压力非常大,可以调整为链式监听,每个只监听上一个节点
ZK的watch机制:
watch可以理解成注册在特定Znode上的触发器,当这个znode发生改变,也就是调用了create,delete,setData将会触发znode上对应的注册事件,请求Watch的客户端将会收到异步通知。
watch命令:
create 节点
监听某个节点:get -w 节点
监听目录:ls -w 节点
监听目录的子目录:ls -R -w 节点
zookeeper集群:zookeeper集群角色:
Leader:处理集群中的所有事务请求,集群中只有一个leader
Follower:只能处理读请求,参与leader的选举
Observer:只能处理读请求,提高集群读的性能,不参与leader的选举
集群配置:
# 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=/data/zookeeper/zk1 # 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=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 ## Metrics Providers # # https://prometheus.io Metrics Exporter #metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider #metricsProvider.httpPort=7000 #metricsProvider.exportJvmInfo=true #quorumListenonAllIPs=true #admin server 默认8080 admin.serverPort=8081 #注:集群的当前服务器地址必须为0.0.0.0 ,由于一台服务器所以都设置为0.0.0.0 #2001这类是通信端口,3001是选举端口 server.1=0.0.0.0:2001:3001 server.2=0.0.0.0:2002:3002 server.3=0.0.0.0:2003:3003 server.4=0.0.0.0:2004:3004:observer
1、编写myid文件,为一个数字,不可重复,在配置文件的datadir指定目录
2、编写多个配置文件,如上配置,修改dataDir,serverPort,clientPort,采用配置文件方式启动
命令:./zkServer.sh start 配置文件
客户端连接集群:
好处:一个节点崩溃,会尝试连接其他地址
./zkCli.sh -server 集群地址
ZAB协议:解决了zookeeper崩溃恢复和主从数据同步问题
ZAB四种协议节点状态:
Looking:选举状态
Following:从节点所处的状态
Leading:主节点所处的状态
Observing:观察者节点所处的状态
zookeeper选举过程:
myid:配置文件id zXid:事务id
zXid比较大的会被优先放入投票箱;
zXid相同,myid比较大的放入投票箱;
投票箱超过半数的节点,被选作Leader节点,节点数在配置文件中配置可见,奇数节点更容易判断超过半数
崩溃恢复时的leader选举:
Leader建立完成后,Leader周期性的向Follower发送心跳(ping命令,没有内容的socket),Leader崩溃以后,Follower发现socket通道关闭,Follower的状态从Following变成Looking,重新回到Leader选举状态,此时集群不对外提供服务
主从服务器之间的数据同步:
zookeeper中的NIO和BIO:
BIO:集群选举时,多个节点的投票通信端口,采用BIO
NIO:被客户端连接的2181端口,使用的是NIO模式与客户端连接
客户端开启watch时,也使用的NIO,等待zookeeper服务器的回调
base理论:基本可用,软状态,最终一致性
zookeeper追求的一致性:数据同步时,不要求强一致,而是顺序一致性,因为事务id递增,可以保证



