【️Zookeeper是CP还是AP的?】

在这里插入图片描述

😊引言

🎖️本篇博文约3000字,阅读大约10分钟,亲爱的读者,如果本博文对您有帮助,欢迎点赞关注!😊😊😊

✅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就能保证拿到的是最新数据了。

相关推荐

  1. Eureka、Nacos、Zookeeper、Redis等应用APCP

    2023-12-16 12:54:02       15 阅读
  2. Redis到底APCP

    2023-12-16 12:54:02       7 阅读
  3. AI程序员:编程界新贵险象环生?

    2023-12-16 12:54:02       24 阅读
  4. 生成式 AI 发展方向,应当 Chat Agent?

    2023-12-16 12:54:02       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-16 12:54:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-16 12:54:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-16 12:54:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-16 12:54:02       20 阅读

热门阅读

  1. 屈臣氏中国销售业务转型

    2023-12-16 12:54:02       43 阅读
  2. 我的创作纪念日

    2023-12-16 12:54:02       47 阅读
  3. Kotlin 中的作用域函数

    2023-12-16 12:54:02       37 阅读
  4. 牛客后端开发面试题3

    2023-12-16 12:54:02       40 阅读
  5. 设计模式的应用——《职责链模式》

    2023-12-16 12:54:02       32 阅读
  6. react之useContext全局状态管理

    2023-12-16 12:54:02       46 阅读
  7. 软件测试面试中基础与功能的问题

    2023-12-16 12:54:02       35 阅读
  8. opencv一些报错的解决方案

    2023-12-16 12:54:02       32 阅读
  9. 飞天使-docker知识点7-docker-compose与namespaces

    2023-12-16 12:54:02       34 阅读
  10. LeetCode 每日一题(Hard) Day 11||单调栈

    2023-12-16 12:54:02       35 阅读
  11. 使用Python编写简单的文本编辑器

    2023-12-16 12:54:02       36 阅读
  12. PostgreSql 设置自增字段

    2023-12-16 12:54:02       42 阅读
  13. Python中的列表与数组

    2023-12-16 12:54:02       38 阅读