1.使用
    1.1下载地址:https://zookeeper.apache.org/releases.html
    1.2zk集群部署一般部署2n+1(其中n为容忍的最大宕机数)

    1. cp zoo_sample.cfg zoo.cfg
    2. #zk保存数据目录
    3. mkdir -p /export/server/zookeeper-3.4.6/zkdatas/
    4. vim zoo.cfg
    5. dataDir=/export/servers/zookeeper-3.4.9/zkdatas
    6. # 保留多少个快照
    7. autopurge.snapRetainCount=3
    8. # 日志多少小时清理一次
    9. autopurge.purgeInterval=1
    10. # 集群中服务器地址
    11. server.1=node1:2888:3888
    12. server.2=node2:2888:3888
    13. server.3=node3:2888:3888
    14. #选举使用
    15. echo 1 > /export/server/zookeeper-3.4.6/zkdatas/myid
    16. #各vm执行命令启动zk集群
    17. zkServer.sh start
    18. #查看zk角色
    19. zkServer.sh status
    20. #客户端命令连接
    21. zkCli.sh -server node2:2181
    22. #查看节点
    23. ls /
    24. #查看内容
    25. get /test

    2.zookeeper的选举
    初始化:每个服务都将自己id和zxid加载到内存中然后广播出去,每个服务都选自己为leader
    循环阶段:节点对比自己的id,zxid和收到的对比,首先比较zxid找最大的,如果zxid相同找id最大的,找到后重新将最大的id广播出去,循环往复知道启动的服务达到集群的半数以上,选举完成

    3.zookeeper的一致性问题总结
    众所周知引入分布式后CAP理论,我们只能保证同时保证两个而不得不舍弃掉其中的一个特性。但是zk恰恰保证了强一致性。
    leader接受到写请求后,首先事务封装(也有叫提议)然后转发给所有的follower,同时生成一个zxid(事务id),等待所有的follower发送ack响应,当收到半数以上的ack应答收,leader将事务预写本机内存,发送commit消息 (而follower收到提议后首先将数据写入本地磁盘成功后发送ack,当leader发送commit消息后采后写入内存)
    image.png