0


zookeeper

一、配置和安装

(1)下载zookeeper-3.4.6.tar.gz

  1. 解压 tar xf zookeeper-3.4.6.tar.gz
  2. 一般放在opt目录下
  3. mkdir/opt/ly
  4. mv zookeeper-3.4.6 /opt/ly

(2) yum安装的jdk是开源的openJDK, 最好用oracle的hotspot JVM 需要到官网下载

(3) zookeeper的文件目录配置目录conf中,zoo_sample.cfg 是配置模板,拷贝一下:

  1. cp zoo_sample.cfg zoo.cfg zookeeper启动默认加载的配置文件的名字是zoo.cfg

配置好后,将文件夹分发到其他从服务器

(4)vi zoo.cfg

  1. tickTime=2000 维持主从服务器之间的心跳时间2S
  2. initLimit=10 初始化的次数10次,leader等待follower2000*10 = 20S的一个初始延迟,超过以后不要此follower
  3. syncLimit=5 5*2000=10S ,leaderflower发送信息,10没有反馈,则被放弃
  4. dataDir=/tem/zookeeper 持久化目录,改为/var/ly/zk /var目录是存放临时数据的
  5. clientPort=2181 客户端链接时使用的端口号
  6. maxClientCnxns=60 允许客户端最大的链接数
  7. 配置所有zookeeperserver.1=node01:2888:3888 node01ip
  8. server.2=node02:2888:3888
  9. server.3=node03:2888:3888
  10. server.4=node04:2888:3888
  11. 第一次启动 ,一般会推选id号最大的为leader,断电后再次启动,会比较谁的数据最完整,若都完整,则再比id

(5)选择leader 还是其他,都是过半通过(n/2+1)。

(6) 创建持久化的目录:mkdir -p /var/ly/zk

  1. 在此目录下创建文件myid -- 写入1(配置文件中的id号,即server.id号)

(7) 配置好以后,将zookeeper文件夹,分发到各个服务器:

  1. scp -r ./ly/ node02:'pwd' ly真个文件夹,分发到node02的相同目录下
  2. mkdir -p /var/ly/zk
  3. echo 2 > /var/ly/zk/myid

(8)将可执行目录放到环境变量path中,其命令就可以在任何地址使用

  1. vi /etc/profile
  2. export ZOOKEEPER_HOME=/opt/ly/zookeeper-3.4.6
  3. export PATH=SPATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
  4. 将配置文件加载到内存: . /etc/profile 或者 source /etc/profile
  5. zk+table键,即可出现可使用的命令
  6. 分发配置文件: scp /etc/profile node01:/etc

二、zookeeper使用

  1. (1)启动: zkServer.sh help ---查看一些命令
  2. zkServer.sh start --后台启动
  3. zkServer.sh start-foreground --前台启动,实时打印日志
  4. (2) zkserver.sh status -- 查看状态、身份leader or follower
  5. (3) 启动第三台后,就可以使用过半通过策略,选出第三台是 leader,然后启动第四台,日志中:Getting a smapshot from leader -- 复制快照
  6. (4) 链接zookeeper命令行的客户端: zkCli.sh
  7. 命令:help -- 查看所有命令
  8. ls / ----- 查看根目录节点
  9. create /ooxx "" -- 创建ooxx 后面“”是数据,没有则使用空“”
  10. create /ooxx/xxoo ""
  11. ls /ooxx
  12. get /ooxx ---- 查看ooxx节点的数据
  13. set /ooxx "hello" --设置数据,只能放1M数据,是二进制安全的(外面推送什么样的字节数组,就存什么样的,必须给字节数组)
  14. get /ooxx :
  15. ![](https://img-blog.csdnimg.cn/1afe9b614f094d1a97fdc370e70dbb95.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAKuixhuixhg==,size_16,color_FFFFFF,t_70,g_se,x_16)
  16. cZxid: c是创建createZxid是顺序执行的id0x2是前32位(二进制位),2表示现在是变换的第几个leader000000002是增删改事务操作的递增id,保证leader顺序执行命令
  17. ctime: 修改操作的时间
  18. mZxid: 修改事务id -- (set /ooxx "hello")
  19. pZxid: get的节点中,创建最后一个节点的id
  20. ephemeralOwner: 临时持有者,0x0 表示现在的节点,没有归属者,是持久节点
  21. 一个客户端链接zkCli.sh ,会创建一个session
  22. create -e /xoxo "adalff" ----- /e是临时节点,是当前客户端存在的情况下,此节点会同步到其他服务器,如果此客户端停止,则此节点消失伴随会话期。
  23. ephemeralOwner 会显示sessionID
  24. (5) 链接一个客户端,会有一个事务,将此客户端的sessionID同步到其他服务器中,zxid会增加1,断开客户端链接,会同步其他客户端删除此sessionID
  25. 很多客户端都想在同一节点创建数据,-s是序列化,不会覆盖创建
  26. create -s /abc/xxx 'sdfsd' ---自动生成xxx000000000
  27. 第二个客户端同样创建xxx create -s /abc/xxx 'afdafa' ----生成文件xxx000000001
  28. 删除 rmr /abc/xxx/xxx000000001
  29. 重新create,名字中的id会从02开始
  30. create -s -e /xxx --- 可以同时设置序列化、临时节点
  31. (6) netstat -natp | egrep '(2888|3888)' ---- egrep指后面写正则表达式,查询关于28883888相关的链接
  32. 3888:选主投票用的,节点直接可以相互通信
  33. ![](https://img-blog.csdnimg.cn/ab06033bebb54a05af795eb8fb502824.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAKuixhuixhg==,size_20,color_FFFFFF,t_70,g_se,x_16)
  34. 2888leader接受write请求,只能followerleader之间通信。

三、zookeeper特性

  1. (1) 扩展性
  2. 角色:leaderfollower([ˈfɒləʊə(r)]追随者)、observer( bˈzɜːvə(r)] 观察者)
  3. 读写分离:leader写,followerobserver
  4. leader挂了以后,只有follower可以选举投票,因为follower的数量决定选 举的时间快慢,所以在庞大的集群里面,30台的话,个位数的为follower 可,5台也可以,observer是放大查询能力;
  5. 配置文件中: server.1=node01.2888:3888
  6. server.1=node01.2888:3888
  7. server.1=node01.2888:3888
  8. server.1=node01.2888:3888:observer
  9. (2)可靠性:攘其外必先安其内 ---- 快速恢复、数据的可靠、可用、一致性
  10. 搜寻:paxos site:douban.com pæksoʊs] -- 文章
  11. paxos 是一个基于消息传递的一致性算法
  12. leader挂了以后,选举过程中,不对外提供读操作。(即只要有一个server不和leader2888连接,所有server都不提供服务)
  13. (3) ZAB 原子广播协议 paxos的简化)
  14. ![](https://img-blog.csdnimg.cn/da33477cdfc243219b0adb950ac5f1cc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAKuixhuixhg==,size_20,color_FFFFFF,t_70,g_se,x_16)
  15. 每个followerleader连接都会各自有一个发送信息的队列,client提出create请求,follower将请求提交给leaderleader发起让每个follower将创建这个事情,写入日志,follower回送一个ok的消息,leader也是一个ok,一个leader和一个follower 2 ,已经过半,则leader向每个follower发送write 信息更改内存数据信息,follower会返回一个ok,最终一致。最后leader 返回给follower,再返回给client-ok
  16. 如果右边follower 还没有执行write命令,与leader不同,则client调用时,可以先调用sync同步的方法,再回调client的方法, sync同步方法是自己选择调用或者不调用。
  17. follower挂掉以后,再启动会连接leader,同步数据,同步完成后再开始接收服务。
  18. 任何操作,没有完成leader就挂了,就会回滚。
  19. 如果有5台,最多挂2台,选举过半原则,需要3台同意才可,如果挂了3台,则zookeeper会处于不可用的状态。
  20. (4) jps命令:查看当前所有java进程的pid

当server挂的数量超过半数,则所有不可对外提供服务,但是正常的serve进程还在。

  1. 如果有4zkleader-node04挂了,node03先察觉到,node0312发送消息,并推选自己为leadernode02zid3高,则node02否定3,并推送消息给13,选择自己为leader1收到2的消息,id2比自己大,表示同意,并向23推送消息-同意推选23收到2的消息则也表示同意,向12推送消息选2,则23票,123都是23票,2leader,并向大家同步数据。
  2. (5)watch 监控
  3. ![](https://img-blog.csdnimg.cn/d0ac5d0a4cc340f3a2403738a30a2e5c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAKuixhuixhg==,size_20,color_FFFFFF,t_70,g_se,x_16)
  4. 集群与客户端用的版本号要一样

四、分布式锁

  1. (1) 多个客户端访问同一资源,需要上锁,锁放到zookeeper中,

1. 争抢锁,只有一个人能获得锁

  1. 2. 获得锁的人出问题,挂掉会变成死锁,所以整成临时节点(session
  2. 3. 获得锁的人成功了,释放锁
  3. 4. 锁被释放,删除,别人如何知道:
  4. 4-1 主动轮询,心跳。 弊端:延迟,客户端多的话zookeeper压力大
  5. 4-2 watch 解决延迟问题,弊端:压力
  6. 4-3 sequence + watch watch前一个节点,最小的获得锁,最小的释放以后,只会通知下一个。
标签: zookeeper

本文转载自: https://blog.csdn.net/tedfdndg/article/details/121410721
版权归原作者 *豆豆 所有, 如有侵权,请联系我们删除。

“zookeeper”的评论:

还没有评论