桃城区网站制作公司,做我的世界壁纸的网站,网站建设与维护 参考文献,网站建设价目#x1f60a;引言 #x1f396;️本篇博文约3000字#xff0c;阅读大约10分钟#xff0c;亲爱的读者#xff0c;如果本博文对您有帮助#xff0c;欢迎点赞关注#xff01;#x1f60a;#x1f60a;#x1f60a; #x1f5a5;️Zookeeper是CP还是AP的#xff1f; ✅… 引言 ️本篇博文约3000字阅读大约10分钟亲爱的读者如果本博文对您有帮助欢迎点赞关注 ️Zookeeper是CP还是AP的 ✅Zookeeper是CP还是AP✅ 拓展知识仓✅如何保证真正的强一致性 ✅Zookeeper是CP还是AP
ZooKeeper作为分布式协调服务它的职责是保证数据(注: 配置数据状态数据)在其管辖下的所有服务之间保持同步、一致。所以我们可以认为Zookeeper是一个CP的分布式系统。所以他会牺牲可用性也就是在极端环境下ZooKeeper可能会丢弃一些请求消费者程序需要重新请求才能获得结果。
而且作为ZooKeeper的核心实现算法 Zab就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。
如果 ZooKeeper下所有节点都断开了或者集群中出现了网络分割的故障(注: 由于交换机故障导致交换机底下的子网间不能互访;那么ZooKeeper 会将它们都从自己管理范围中剔除出去外界就不能访问到这些节点了即便这些节点本身是“健康”的可以正常提供服务的:所以导致到达这些节点的服务请求被丢失了。
但是请一定要注意这里面的一致性他确实是强一致性但是Zookeeper保证的是强一致性模型中的顺序一致性而不是线性一致性。这个很少有人提
博主的博文链接: 什么是分布式系统的一致性
这一点在ZK的官网 Zookeeper上明确的说过 这里明确的提了Zookeeper是保证的顺序一致性也就是说ZooKeeper不保证在每个时间点两个不同的客户端将具有相同的ZooKeeper数据视图。但是他能保证我们在每人节点上读取到的一定是他最后一次更新的内容。
具体的案例就是当Zookeeper在进行数据同步的过程中如果半数节点同步成功它就提交当前事务但此时集群内还有可能有节点没有同步到数据如果此时读请求发送到没有同步到数据的节点那么就会读到旧的数据。
但是Zookeeper是会保证这个节点最终也会按照顺序执行成功的。
下面是如何在ZooKeeper客户端中使用ZooKeeper API来实现创建一个顺序节点Demo import org.apache.zookeeper.*; /*** author 昕宝爸爸爱编程*/
public class ZooKeeperDemo { // 定义ZooKeeper连接字符串 private static final String CONNECT_STRING localhost:2181; // 定义会话超时时间 private static final int SESSION_TIMEOUT 5000; // 定义ZooKeeper对象 private ZooKeeper zooKeeper; // 连接ZooKeeper服务 public void connect() throws IOException, InterruptedException { zooKeeper new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, new Watcher() { Override public void process(WatchedEvent event) { System.out.println(Receive watched event: event); } }); System.out.println(ZooKeeper connection established.); } // 创建顺序节点 public void createSequentialZNode() throws KeeperException, InterruptedException { // 定义节点路径以/sequentialNode-开头会自动添加递增的计数器保证顺序一致性 String path /sequentialNode-; // 创建节点返回创建的节点路径 String createdPath zooKeeper.create(path, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println(Created sequential znode: createdPath); } // 主函数执行连接和创建节点的操作 public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ZooKeeperDemo demo new ZooKeeperDemo(); demo.connect(); demo.createSequentialZNode(); }
}首先连接到ZooKeeper服务然后创建一个顺序的、临时的znode。create方法的CreateMode.EPHEMERAL_SEQUENTIAL参数告诉ZooKeeper创建一个顺序的、临时的znode。在这个znode的名字后面ZooKeeper会自动添加一个唯一的、递增的计数器以保证顺序一致性。
✅ 拓展知识仓
✅如何保证真正的强一致性 想要让Zookeeper真正的保证强一致性或者说保证线性一致性也是有办法的那就是通过sync命令。 当我们对一个Follower调用sync命令的时候会使得他和Leader节点进行数据同步并等待服务器同步完成之后再返回。这样下一次的read就能保证拿到的是最新数据了。