zookeeper相关

zookeeper

  • Zookeeper 选举机制

    • 当启动的服务器没有超过半数以上那么,那么每启动一个服务器就会发生一次选举,而每次票数最多的就是相应myid 最大的那一个服务器,最终在 已启动的服务器超过半数的时候,就会成为 leader,在产生leader 之前,所有的服务器的状态都是 LOOKING 状态,而当产生之后,leader 的状态就是 leading , 而其他的就是following。而只要这个leader 没有宕机,那么接下来启动的服务器都时following

    • 集群非第一次启动的话,当一台服务器出现两种情况的时候

      • 初始化启动
      • 运行期间无法和服务器保持连接

      就会进入选举流程

    • 在进入选举流程后,会有两种情况

      • 在集群中还有leader

      如果还有leader 的话,那么,当其尝试去选举的时候,会被告知已经存在leader 了,

      那么就会尝试和这台leader 去取得链接

      • 在集群中没有leader

      那么就会进入选举流程,当不是第一次启动的话,在选举的时候会先后比较三个因素,任期时长,事务数,服务器id,分别是EPOCH ,ZXID,SID

  • 生产集群安装多少 zk 合适

    • 安装奇数台
      • 生产经验
        • 10 3
        • 20 5
        • 100 11
        • 200 11
  • 监听器原理

    • 有一个main 线程创建于客户端, 会创建两个两个线程
      • 一个负责 网络通信(connect)
      • 一个负责监听(listener)
    • 通过 connect 线程 将注册的监听事件发送给 Zookeeper
    • 在 Zookeeper 的注册监听列表中将注册的监听事件添加到列表中
    • Zookeeper 监听到有数据或者路径的变化,就会将这个消息发送给listener 线程
    • listener 线程内部调用了 process() 方法
  • 客户端向 服务端写数据的流程

    • 客户端访问服务器分为两种情况 访问的时leader 和 访问的是 follower
      • 当访问的是 leader 的时候,leader 是拥有写权限的,他会自己写一部分,还会将另一部分分发给 follower 进行 写操作,当follower 写操作完成的时候,会像leader 发送写ack 完成指针,标识写操作完成,那么当半数以上服务器都发送了ack 的时候,leader 就会向Client 进行应答,就会提交数据
      • 当访问的是 follower 的时候,follower 会将写请求发送给leader ,然后leader 会组织写数据,人后将返回的ack 完成指针,发送给当时的follow,由 follower 提交给 Client

这样就保证了每个写入请求都会成功的写入到集群中,若有新的服务器加入进来,也会对Leader进行数据同步,来达到集群中数据的一致性。

  • Zookeeper 动态上下线
    • 服务器启动去Zookeeper 集群注册信息(注册的都是临时节点)
    • 客户端获取服务器列表,并且注册监听
    • 当某个服务器下线的时候,因为是 临时节点,所以相应的节点会删除
    • 节点删除,就会通知客户端
    • 客户端就会执行process ()方法重新获取服务器的监听列表,
    • 达到如果要去访问服务器的时候,访问的都是 正常启动的服务器

你可能感兴趣的:(zookeeper,zookeeper)