zookeeper两个经典问题-带着问题看源码
2016-12-19 21:51
399 查看
1. 机器1,机器2,机器3.
机器3是Leader.
机器3接受到a,b,c消息.
机器2接受到a的proposal和commit. 没有收到b的消息.
当收到c的proposal和commit时会怎么办? 数据是否错乱?
2. zk数据同步是拉取还是推送?
3.机器1,2,机器3
机器3是Leader. 机器2断开了. 机器2重新选举,连接到Leader上,同步相关数据.
相关代码如下:
线程A:
}
线程B:
Leader.sendPacket(QuorumPacket) (org.apache.zookeeper.server.quorum)
调用方1 Leader.propose(Request) (org.apache.zookeeper.server.quorum)
调用方1 Leader.commit(long) (org.apache.zookeeper.server.quorum)
同步数据推送完毕,但是因为时间差后续新的proposal请求和commit又没有推送给Follower.
例如 Leader 有 a(已提交) b(已多数通过但未提交) c(已prososal但未多数通过) 三个消息.
此时Follower将三个数据都同步过来. 此时Leader对c进行commit, 又接受了一个d的proposal. 都没有发到机器2.
此时机器2上的 queuedList为 a,b,c ; commitList为a,b;
然后Leader收到d的半数通过,发给机器2 d的commit ;
此时机器2上的 queuedList为 a,b,c ; commitList为a,b d.
请问这种情况会发生么?
答案:
1.答案在zookeeper的源代码实现里.
zk依赖于长连接进行集群间通信.
一旦数据没有发送到,就代表连接断了. 抛异常,重启.
2.
线程A:
}
线程B:
Leader.sendPacket(QuorumPacket) (org.apache.zookeeper.server.quorum)
调用方1 Leader.propose(Request) (org.apache.zookeeper.server.quorum)
调用方1 Leader.commit(long) (org.apache.zookeeper.server.quorum)
不会因为有锁.
消息c的commit肯定会同步给机器2
机器3是Leader.
机器3接受到a,b,c消息.
机器2接受到a的proposal和commit. 没有收到b的消息.
当收到c的proposal和commit时会怎么办? 数据是否错乱?
2. zk数据同步是拉取还是推送?
3.机器1,2,机器3
机器3是Leader. 机器2断开了. 机器2重新选举,连接到Leader上,同步相关数据.
相关代码如下:
线程A:
synchronized public void processSync(LearnerSyncRequest r){
synchronized public long startForwarding(LearnerHandler handler,...){ ...
addForwardingFollower(handler); //加入到转发队列之后,leader才会将proposal和commit数据提交....
}
synchronized public void processAck(long sid, long zxid, SocketAddress followerAddr) {}
线程B:
/** * send a packet to all the followers ready to follow * * @param qp * the packet to be sent */ void sendPacket(QuorumPacket qp) { synchronized (forwardingFollowers) { for (LearnerHandler f : forwardingFollowers) { f.queuePacket(qp); } } }
Leader.sendPacket(QuorumPacket) (org.apache.zookeeper.server.quorum)
调用方1 Leader.propose(Request) (org.apache.zookeeper.server.quorum)
调用方1 Leader.commit(long) (org.apache.zookeeper.server.quorum)
同步数据推送完毕,但是因为时间差后续新的proposal请求和commit又没有推送给Follower.
例如 Leader 有 a(已提交) b(已多数通过但未提交) c(已prososal但未多数通过) 三个消息.
此时Follower将三个数据都同步过来. 此时Leader对c进行commit, 又接受了一个d的proposal. 都没有发到机器2.
此时机器2上的 queuedList为 a,b,c ; commitList为a,b;
然后Leader收到d的半数通过,发给机器2 d的commit ;
此时机器2上的 queuedList为 a,b,c ; commitList为a,b d.
请问这种情况会发生么?
答案:
1.答案在zookeeper的源代码实现里.
zk依赖于长连接进行集群间通信.
一旦数据没有发送到,就代表连接断了. 抛异常,重启.
2.
线程A:
synchronized public void processSync(LearnerSyncRequest r){
synchronized public long startForwarding(LearnerHandler handler,...){ ...
addForwardingFollower(handler); //加入到转发队列之后,leader才会将proposal和commit数据提交....
}
synchronized public void processAck(long sid, long zxid, SocketAddress followerAddr) {}
线程B:
/** * send a packet to all the followers ready to follow * * @param qp * the packet to be sent */ void sendPacket(QuorumPacket qp) { synchronized (forwardingFollowers) { for (LearnerHandler f : forwardingFollowers) { f.queuePacket(qp); } } }
Leader.sendPacket(QuorumPacket) (org.apache.zookeeper.server.quorum)
调用方1 Leader.propose(Request) (org.apache.zookeeper.server.quorum)
调用方1 Leader.commit(long) (org.apache.zookeeper.server.quorum)
不会因为有锁.
消息c的commit肯定会同步给机器2
相关文章推荐
- 经典面试问题:12小球问题算法(源码)
- 经典面试问题:12小球问题算法(源码)
- apache 经典的两个问题
- 什么是 “动态规划” , 用两个经典问题举例。
- 【经典问题】判断单链表是否存在环,判断两个链表是否相交问题详解
- 经典面试问题:12小球问题算法(源码)
- 什么是 “动态规划” , 用两个经典问题举例。
- C++/C经典算法百题--(39-42)年龄几何,三色球问题,两个正整数的最大公约数和(GCD)和最小公倍数(LCM)
- String经典问题(==和equals区别,new String为什么创建了两个对象)
- 什么是 “动态规划” , 用两个经典问题举例
- 经典面试问题:12小球问题算法(源码)
- 经典面试问题:12小球问题算法(源码)
- 经典面试问题:12小球问题算法(源码)
- 动态规划的两个经典问题--01背包
- 经典面试问题:12小球问题算法(源码)
- 经典面试问题:12小球问题算法(源码)
- 经典面试问题:12小球问题算法(源码)
- 经典面试问题:12小球问题算法(源码)
- 经典面试问题:12小球问题算法(源码)
- 什么是 “动态规划” , 用两个经典问题举例。