【️Zookeeper是CP还是AP的?】

news2024/11/17 22:34:55

在这里插入图片描述

😊引言

🎖️本篇博文约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就能保证拿到的是最新数据了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker及其使用思维导图

Docker的架构 构建分发运行镜像 Client(客户端):是Docker的用户端,可以接受用户命令和配置标识,并与Docker daemon通信。Images(镜像):是一个只读模板,含创建Docker容器…

Sui第八轮资助:七个项目获得资助

今天,Sui基金会宣布本月的资助获得者,他们因构建项目以推动Sui的采用和发展而获得资助。要获得资助,项目必须提交提案,详细说明他们正在构建的内容、预算明细、关键里程碑、团队经验以及对Sui社区的预期贡献。 以下七个项目致力于…

ACT、NAT、NATPT和EASY-IP

目录 一、ACL 1.ACL 2.ACL的两种应用匹配机制 3.ACL的基本类型 4.ACL命令操作 5.ACL实验: 4.ACL的应用原则: 5.匹配原则: 二、NAT 1.NAT的原理及作用: 2.NAT分类 3.NAT配置 三、EASY-ip实验 四、NATPT 五、通配符 …

解决el-table组件中,分页后数据的勾选、回显问题?

问题描述: 1、记录一个弹窗点击确定按钮后,table列表所有勾选的数据信息2、再次打开弹窗,回显勾选所有保存的数据信息3、遇到的bug:切换分页,其他页面勾选的数据丢失;点击确认只保存当前页的数据&#xff1…

spring boot集成mybatis和springsecurity实现登录认证功能

参考了很多网上优秀的教程,结合自己的理解,实现了登录认证功能,不打算把理论搬过来,直接上代码可能入门更快,文中说明都是基于我自己的理解写的,可能存在表述或者解释不对的情况,如果需要理论支…

linux内核使用ppm图片开机

什么是ppm图片 PPM(Portable Pixmap)是一种用于存储图像的文件格式。PPM图像文件以二进制或ASCII文本形式存储,并且是一种简单的、可移植的图像格式。PPM格式最初由Jef Poskanzer于1986年创建,并经过了多次扩展和修改。 PPM图像…

金蝶云星空协同开发环境应用内执行单据类型脚本

文章目录 金蝶云星空协同开发环境应用内执行单据类型脚本业务界面查询单据类型表数据导出数据执行数据库脚本单据类型xml检验是否执行成功检查数据库检查业务数据 金蝶云星空协同开发环境应用内执行单据类型脚本 业务界面 查询单据类型表数据 先使用类型中文在单据类型多语言…

Windows10之wsl-Linux子系统安装JDK、Maven环境

Windows10之wsl-Linux子系统安装JDK、Maven环境 文章目录 1.环境2.安装2.1安装JDK2.1安装maven 3.配置setting.xml4.下载编译项目插件5.总结 1.环境 首先需要在windwos10上安装wsl的Linux子系统,我选择的是CentOs的操作系统的镜像(之前的文章中采用的是docker拉取一…

嵌入式开发人员需要具备哪些能力?

大家好,今天给大家介绍嵌入式开发人员需要具备哪些能力,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 嵌入式开发人员需要具备以下能力: 熟练掌握C/C语…

腾讯云Linux云服务器禁Ping设置

腾讯云Linux服务器默认是允许ping包的,但是在一些情况下为了安全考虑起见,我们都会把服务器设置为禁ping的模式。 1、首先检查Linux服务器当前是否禁ping 执行命令: cat /proc/sys/net/ipv4/icmp_echo_ignore_all 备注: 0----代…

Android画布Canvas绘图scale translate,Kotlin

Android画布Canvas绘图scale & translate&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"…

maven jar sort

1&#xff09;往常项目结构lib包排序 2&#xff09;maven的默认是没有排序的

2019年第八届数学建模国际赛小美赛A题放射性产生的热量解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 A题 放射性产生的热量 原题再现&#xff1a; 假设我们把一块半衰期很长的放射性物质做成一个特定的形状。在这种材料中&#xff0c;原子核在衰变时会以随机的方向释放质子。我们假设携带质子的能量是一个常数。质子在穿过致密物质时&#x…

【STM32】STM32学习笔记-OLED调试工具(09)

00. 目录 文章目录 00. 目录01. STM32调试方式02. OLED简介03. 0.96寸OLED模块04. 0.96寸OLED驱动IC05. 0.96寸OLED原理图06. 硬件电路07. OLED驱动函数08. 附录 01. STM32调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串…

Tekton 克隆 git 仓库

Tekton 克隆 git仓库 介绍如何使用 Tektonhub 官方 git-clone task 克隆 github 上的源码到本地。 git-clone task yaml文件下载地址&#xff1a;https://hub.tekton.dev/tekton/task/git-clone 查看git-clone task yaml内容&#xff1a; 点击Install&#xff0c;选择一种…

微服务组件Sentinel的学习(3)

Sentinel 隔离和降级Feign整合Sentinel线程隔离熔断降级熔断策略 授权规则&#xff1a;自定义异常 隔离和降级 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范用避免雪崩&#xff0c;就要靠线程隔离(舱壁…

jmeter,读取CSV文件数据的循环控制

1、构造csv数据 保存文件时需要注意文件的编码格式 id,name,limit,status,address,start_time 100,小米100,1000,1,某某会展中心101,2023/8/20 14:20 101,小米101,1001,1,某某会展中心102,2023/8/21 14:20 2、在线程组下添加【CSV数据文件设置】元件 3、CSV文件数据的循环控…

IDEA debug窗口左边工具栏隐藏与显示

今天在debug排查代码的时候一不小心点到哪里&#xff0c;结果变成这样 我们可以这样恢复&#xff0c;右键Debug 点击show Toolbar

本地项目添加到gitlab命令操作

gitlab上面创建一个跟项目名同名的文件夹 创建文件夹&#xff0c;填写信息 添加readme文档&#xff0c;先保存下创建的文件夹 回到项目&#xff0c;复制项目的git 地址 然后进入到本地项目的文件夹&#xff0c;如d:/workspace/spring-demo&#xff0c;右键打开git bash弹框 命令…

关于“Python”的核心知识点整理大全22

目录 ​编辑 9.4.2 在一个模块中存储多个类 虽然同一个模块中的类之间应存在某种相关性&#xff0c;但可根据需要在一个模块中存储任意数量的 类。类Battery和ElectricCar都可帮助模拟汽车&#xff0c;因此下面将它们都加入模块car.py中&#xff1a; car.py my_electric_car…