万字带你入门 ZooKeeper
单点故障问题,如果协调者挂了那么整个系统都处于不可用的状态了。
阻塞问题,即当协调者发送 prepare 请求,参与者收到之后如果能处理那么它将会进行事务的处理但并不提交,这个时候会一直占用着资源不释放,如果此时协调者挂了,那么这些资源都不会再释放了,这会极大影响性能。
数据不一致问题,比如当第二阶段,协调者只发送了一部分的 commit 请求就挂了,那么也就意味着,收到消息的参与者会进行事务的提交,而后面没收到的则不会进行事务提交,那么这时候就会产生数据不一致性问题。
CanCommit阶段:协调者向所有参与者发送 CanCommit 请求,参与者收到请求后会根据自身情况查看是否能执行事务,如果可以则返回 YES 响应并进入预备状态,否则返回 NO。
PreCommit阶段:协调者根据参与者返回的响应来决定是否可以进行下面的 PreCommit 操作。如果上面参与者返回的都是 YES,那么协调者将向所有参与者发送 PreCommit 预提交请求,参与者收到预提交请求后,会进行事务的执行操作,并将 Undo 和 Redo 信息写入事务日志中,最后如果参与者顺利执行了事务则给协调者返回成功的响应。如果在第一阶段协调者收到了任何一个 NO 的信息,或者在一定时间内并没有收到全部的参与者的响应,那么就会中断事务,它会向所有参与者发送中断请求(abort),参与者收到中断请求之后会立即中断事务,或者在一定时间内没有收到协调者的请求,它也会中断事务。
DoCommit阶段:这个阶段其实和 2PC 的第二阶段差不多,如果协调者收到了所有参与者在 PreCommit 阶段的 YES 响应,那么协调者将会给所有参与者发送 DoCommit 请求,参与者收到 DoCommit 请求后则会进行事务的提交工作,完成后则会给协调者返回响应,协调者收到所有参与者返回的事务提交成功的响应之后则完成事务。若协调者在 PreCommit 阶段收到了任何一个 NO 或者在一定时间内没有收到所有参与者的响应,那么就会进行中断请求的发送,参与者收到中断请求后则会通过上面记录的回滚日志来进行事务的回滚操作,并向协调者反馈回滚状况,协调者收到参与者返回的消息后,中断事务。
Proposer提案者:负责提出 proposal,每个提案者在提出提案时都会首先获取到一个 具有全局唯一性的、递增的提案编号 N,即在整个集群中是唯一的编号 N,然后将该编号赋予其要提出的提案,在第一阶段是只将提案编号发送给所有的表决者。
Acceptor表决者:每个表决者在 accept 某提案后,会将该提案编号N记录在本地,这样每个表决者中保存的已经被 accept 的提案中会存在一个编号最大的提案,其编号假设为 maxN。每个表决者仅会 accept 编号大于自己本地 maxN 的提案,在批准提案时表决者会将以前接受过的最大编号的提案作为响应反馈给 Proposer。
Leader:集群中唯一的写请求处理者 ,能够发起投票(投票也是为了进行写请求)。
Follower:能够接收客户端的请求,如果是读请求则可以自己处理,如果是写请求则要转发给 Leader。在选举过程中会参与投票,有选举权和被选举权。
Observer:就是没有选举权和被选举权的 Follower。
持久节点:一旦创建就一直存在,直到将其删除。
持久顺序节点:一个父节点可以为其子节点维护一个创建的先后顺序,这个顺序体现在节点名称上,是节点名称后自动添加一个由 10 位数字组成的数字串,从 0 开始计数。
临时节点:临时节点的生命周期是与客户端会话绑定的,会话消失则节点消失。临时节点只能做叶子节点,不能创建子节点。
临时顺序节点:父节点可以创建一个维持了顺序的临时节点(和前面的持久顺序性节点一样)。
czxid:Created ZXID,该数据节点被创建时的事务ID。
mzxid:Modified ZXID,节点最后一次被更新时的事务ID。
ctime:Created Time,该节点被创建的时间。
mtime:Modified Time,该节点最后一次被修改的时间。
version:节点的版本号。
cversion:子节点的版本号。
aversion:节点的 ACL 版本号。
ephemeralOwner:创建该节点的会话的 sessionID,如果该节点为持久节点,该值为 0。
dataLength:节点数据内容的长度。
numChildre:该节点的子节点个数,如果为临时节点为 0。
pzxid:该节点子节点列表最后一次被修改时的事务 ID,注意是子节点的 列表,不是内容。
CREATE:创建子节点的权限。
READ:获取节点数据和子节点列表的权限。
WRITE:更新节点数据的权限。
DELETE:删除子节点的权限。
ADMIN:设置节点 ACL 的权限。
分布式与集群的区别。
2PC、3PC 以及 paxos 算法这些一致性框架的原理和实现。
ZooKeeper 专门的一致性算法 ZAB 原子广播协议的内容(Leader 选举、崩溃恢复、消息广播)。
ZooKeeper 中的一些基本概念,比如 ACL,数据节点,会话,watcher机制等等。
ZooKeeper 的典型应用场景,比如选主,注册中心等等。