zookeeper集群

学习目标:

掌握zookeeper集群原理

学习内容:

什么是zookeeper

zookeeper是一种分布式协调服务,用于管理大型主机。给分布式应用提供一致性服务的软件,分布式应用程序可以基于zookeeper实现数据发布/订阅,负载均衡,分布式协调通知,集群管理,master选举,分布式锁等功能

zookeeper提供的一致性有:顺序一致性,原子性,可靠性,最终一致性

搭建zookeeper服务器

  1. 从官网下载安装包
#gpg --import KEYS		#需要先下载gpg包校验的私钥,不然下载的包不完整无法解压
#wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
#tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
  1. zoo.cfg配置文件说明
#zookeeper时间配置中的基本单位(毫秒)
tickTime=2000		#即2s
#允许follower初始化连接到leader最大时长,它表示tickTime时间倍数,即: initLimit*tickTime
initLimit=10		#即初始化连接表示最大时长为20s
#允许follower与leader数据同步的最大时长,它表示tickTime时间倍数
syncLimit=5			#即数据同步最大时长为10s
#zookeeper数据存储及日志保存目录,(如果没有指明dataLogDir,则日志也保存在这个文件中)
dataDir=/tmp/zookeeper
dataLogDir=/tmp/zookeeper
#对客户端提供的端口
clientPort=2181
#单个客户端与zookeeper最大并发连接数
maxClientCnxns=60
#保存的数据快照数量,之外的将会被删除
autopurge.snapRetainCount=3
#自动触发清除任务时间间隔,小时为单位,默认是0,表示不自动清除
autopurge.purgeInterval=1

优化配置
preAlloSize=51200(约等于51M)
用于配置zk事务文件预分配的磁盘空间的大小默认是64m

snapCount=85000
用于配置相邻两次数据快照之间的事务操作次数,zk会在snapCount次事务操作之后,会进行一次数据快照(default:100000)

clientPortAddress:
针对多网卡的机器允许为每个IP地址制定不同的监听端口

minSessionTimeout, maxSessionTimeout:
用于服务端对客户端会话的超时时间进行限制。
如果客户端设置的超时时间不在设置时间范围以内,那么会被服务端强制设置为最大或者最小超时时间
  1. zookeeper服务器操作命令
重命名conf中的文件zoo_sample.cfg-->zoo.cfg
1、启动zk服务器
#./bin/zkServer.sh start ./conf/zoo.cfg
2、查看zk服务器状态
#./bin/zkServer.sh status ./conf/zoo.cfg
3、停止zk服务器
#./bin/zkServer.sh stop ./conf/zoo.cfg
  1. zookeeper内部数据结构

    1、**zk是如何保存数据的**
    zk中数据是保存在节点上的,节点就是znode,多个znode之间构成一棵树的目录结构
    zk的数据模型很像数据结构中的树,也很像文件系统的目录
    树是由节点所构成,zk的数据存储也同样是基于节点,这种节点叫做Znode
    但是不同于树的节点,Znode的引用方式是路径引用,类似于文件路径,必须以 / 开头
    这样的层次结构,让每一个Znode节点拥有唯一的路径,就像命名空间一样对不同信息做出清晰的隔离
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/7b6f9fa462894d2d9f5a3bd9204ef284.png)
    
  2. zk中的znode是什么样的结构
    zk中的znode包含四个部分:
    1、data:保存数据
    2、acl:权限,定义了什么样的用户能够操作这个节点,且能够进行什么样的操作
    create:创建权限,允许在该节点下创建子节点
    write:更新权限,允许更新节点的数据
    read:读取权限
    delete:删除权限
    admin:管理者权限,允许对该节点进行acl权限设置
    3、stat:描述当前znode的元数据
    4、child:当前节点的子节点

  3. zk中节点znode的类型
    持久化节点:创建出的节点,在会话结束后依然存在,保存数据
    持久序号节点:创建出的节点,根据先后顺序,会在节点之后带上一个数值,越后数值越大,适用于分布式锁的应用场景–单调递增
    临时节点:临时节点是在会话结束后,自动被删除,这个可以实现服务注册和发现的效果
    临时序号节点:跟持久序号节点相同,适用于临时分布式锁
    container节点:container容器节点,当容器中没有任何子节点,该容器节点将会被zk定期删除(60s)
    TTL节点:可以指定节点的到期时间,到期后定期被zk定时删除。只能通过系统配置zookeeper.extendedTypesEnabled=true开启

  4. zk的数据持久化机制
    zk的数据是运行在内存中,zk提供两种持久化机制:
    1、事务日志:zk把执行的命令以日志的形式保存在dataLogDir指定的路径中的文件中(如果没有指定dataLogDir,则按dataLog指定的路径)
    2、数据快照:zk会在一定的时间间隔内做一次数据的快照,把该时刻的内存数据保存在快照文件中
    zk通过这两种形式的持久化,先恢复快照文件中的数据到内存中,再用日志文件中的数据做增量恢复,这样的恢复速度更快

  5. zk客户端(zkCli)的使用

    1、多节点类型创建
    创建持久节点		        create 	/test1	abc	#在节点后面加内容即数据
    创建持久序号节点		create 	-s	 /test2
    创建临时节点				create	-e	 /test3
    创建临时序号节点       create  -e  -s  /test4
    创建容器节点				create  -c  /test5
    
    2、权限设置
    ```powershell
    #注册当前会话的账号密码
    #addauth digest xiaoming:123456
    #创建节点并设置权限
    #create /test3 abcd auth:xiaoming:123456:cdrwa
    ```
    在另一个会话中必须使用账号密码,才能拥有操作该节点的权限
    
  6. zk实现分布式锁

    1、zk中锁的种类
    读锁:大家都可以读,要想上读锁的前提:之前的锁没有写锁
    写锁:只有得到写锁的才能写,要想上写锁的前提是:之前没有任何锁
    
    2、**zk如何上读锁**
    创建一个临时序号节点,节点的数据是read,表示是读锁
    获取当前zk中序号比自己小的所有节点
    判断最小节点是否是读锁:
    		1.如果不是读锁的话,则上锁失败,为最小节点设置监听。阻塞等待,zk的watch机制会当最小节点发生变化时通知当前节点,于是再执行第二步流程
    		2.如果是读锁的话,则上锁成功
    
    3、**zk如何上写锁**
    创建一个临时序号节点,节点的数据是write,表示是写锁
    获取zk中所有的子节点
    判断自己是否是最小的节点:
    		1.如果是,则上写锁成功
    		2.如果不是,说明前面还有锁,则上锁失败,监听最小的节点,如果最小节点有变化,则回到第二步
    
  7. zk的watch机制原理
    1、watch机制介绍:可以把watch理解成是注册在特定Znode上的触发器,当这个Znode发生改变,也就是create、delete、set方法的时候,将会触发Znode上注册的对应事件,请求watch的客户端会接收到异步通知
    客户端使用NIO通信模式监听服务端的调用
    在这里插入图片描述

  8. zookeeper集群

       1、zookeeper集群三种角色
       leader:处理集群的所有事务请求,集群中只有一个leader
       follower:只能处理读请求,参与leader选举
       observer:只能处理读请求,提升集群读的性能,但不参与leader选举
       
       2、集群搭建
       搭建4个节点,其中一个为observer
       1.创建4个节点的myid,并设值
    
    #echo 1 > /usr/local/zookeeper/apache-zookeeper-3.7.1-bin/zkdata/zk1/myid
    #echo 2 > /usr/local/zookeeper/apache-zookeeper-3.7.1-bin/zkdata/zk2/myid
    #echo 3 > /usr/local/zookeeper/apache-zookeeper-3.7.1-bin/zkdata/zk3/myid
    #echo 4 > /usr/local/zookeeper/apache-zookeeper-3.7.1-bin/zkdata/zk4/myid
    
       2.编写4个zoo.cfg配置文件
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #启动4台zookeeper
    #./bin/zkServer.sh start ../conf/zoo1.cfg
    #./bin/zkServer.sh start ../conf/zoo2.cfg
    #./bin/zkServer.sh start ../conf/zoo3.cfg
    #./bin/zkServer.sh start ../conf/zoo4.cfg
    
    #查看zookeeper每台的状态和角色信息
    #./bin/zkServer.sh status ../conf/zoo1.cfg		#后台替换每台zookeeper的配置文件
    
    #连接zookeeper集群
    #./bin/zkCli.sh -server 10.234.252.122:2181,10.234.252.122:2182,10.234.252.122:2183,10.234.252.122:2184
    

ZAB协议

  1. 什么是ZAB协议
    zookeeper作为非常重要的分布式协调组件,需要进行集群部署,集群中会以一主多从的形式进行部署。zookeeper为了保证数据的一致性,使用ZAB(zookeeper atomic broadcast)协议,这个协议解决了zookeeper的崩溃恢复和主从数据同步的问题
    在这里插入图片描述

  2. ZAB协议定义的四种节点状态
    1、looking:选举状态
    2、following:follower节点(从节点)所处的状态
    3、leading:leader节点(主节点)所处的状态
    4、observing:观察者节点所处的状态

  3. 集群上线时leader的选举过程
    在这里插入图片描述

  4. 崩溃恢复时的leader选举
    leader建立完后,leader周期性的不断向follower发送心跳(ping命令,没有内容的socket)。当leader崩溃后,follower发现socket通道已关闭,于是follower开始进入looking状态,重新回到上一节的leader选举过程,此时集群不能对外提供服务

  5. 主从服务器之间的数据同步
    在这里插入图片描述

  6. zk中的NIO和BIO应用

    NIO:
    	用于被客户端连接的2181端口,使用的是NIO模式与客户端建立连接
    	客户端开启watch时,也使用NIO,等待zookeeper服务的回调
    BIO:
    	集群选举时,多个节点之间的投票通信端口,使用BIO通信
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值