1、什么是zoopkeeper ?
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务。
2、为什么要使用zoopkeeper?
- (顺序一致性)从同一个客户端发起的事务请求,最终将会严格按照其发起顺序被应用到zookeeper中;
- (原子性)所有事物请求的处理结果在整个集群中所有机器上的应用情况是一致的;
- (单一视图)无论客户端连接的是哪个zookeeper服务器,其看到的服务端数据模型都是一致的;
- (可靠性)一旦服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直保留下来,除非有另一个事务又对其进行了改变;
- (实时性)zookeeper并不是一种强一致性,只能保证顺序一致性和最终一致性,只能称为达到了伪实时性。
3、zoopkeeper架构
几个概念介绍
- Client(客户端)
客户端,我们的分布式应用集群中的一个节点,从服务器访问信息。对于特定的时间间隔,每个客户端向服务器发送消息以使服务器知道客户端是活跃的。类似地,当客户端连接时,服务器发送确认码。如果连接的服务器没有响应,客户端会自动将消息重定向到另一个服务器。- Server
我们的ZooKeeper总体中的一个节点,为客户端提供所有的服务。向客户端发送确认码以告知服务器是活跃的。- Ensemble
ZooKeeper服务器组。形成ensemble所需的最小节点数为3。- Leader
服务器节点,如果任何连接的节点失败,则执行自动恢复。Leader在服务启动时被选举。- Follower
跟随leader指令的服务器节点,后备leader。
4、zoopkeeper结构如何?
ZooKeeper是一个文件系统的采用树结构。ZooKeeper节点称为 znode 。每个znode由一个名称标识,并用路径(/)序列分隔。结构就像你使用tree
命令列出linux的一个非空文件。
copy张图,大概长下面这样子:
其中Znode有三种类型:
- 持久节点(persistent):
- 创建特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
顺序节点(sequential):
- 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。
临时节点(ephemeral):
- 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。
5、zoopkeeper怎样工作?
首先保证zoopkeeper已经启动,客户端会连接到ZooKeeper集合中的一个leader或follower节点。一旦建立连接,节点将向特定客户端分配会话ID并向该客户端发送确认。如果客户端没有收到确认,它将尝试连接ZooKeeper集合中的另一个节点。 一旦连接到节点,客户端将以有规律的间隔向节点发送心跳,以确保连接不会丢失。
关于节点数量:
zoopkeeper集合中最好设置奇数个节点,因为zoopkeeper有这样一个规则:假如集合中挂掉的节点数量没有超过总节点一半数量的话,节点之间都可通过重新选举新的leader恢复数据(不一定完整恢复,但会恢复到剩余几个完好节点中数据更新时间点最新的时刻)。
6、那么zoopkeeper怎样进行leader选举呢?
- 所有节点创建具有相同路径 /root/leader_election/guid_ 的顺序、临时节点。
ZooKeeper集合将附加10位序列号到路径,创建的znode将是/root/leader_election/guid_0000000001,/root/leader_election/guid_0000000002等。 - 对于给定的实例,在znode中创建最小数字的节点成为leader,而所有其他节点是follower。
- 每个follower节点监视下一个具有最小数字的znode。例如:guid_0000000008的节点将监视guid_0000000007,guid_0000000007的节点将监视guid_0000000006。
- 如果leader关闭,则其相应的目录会被删除。
- 下一个在线follower节点将通过监视器获得关于leader移除的通知。
- 下一个在线follower节点将检查是否存在其他具有最小数字的znode。如果没有,那么它将承担leader的角色。否则,它找到的创建具有最小数字的znode的节点将作为leader。