通过zookeeper浅谈一致性算法

CAP定理介绍

CAP 定理指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

通俗来说:

一致性(C):当系统数据发生更新操作后,各个主机中的数据仍然处于一致的状态。

可用性(A):对于用户的每一个请求,系统总是可以在有限的时间内对用户做出响应。

分区容错性(P):分布式系统在遇到任何网络分区故障时,仍能够保证对外提供满足一致性或可用性的服务。

对于分布式系统来说,网络🛜环境是相对不可控制的,出现网络分区是不可避免的。网络分区的出现很可能就会带来脑裂问题(例如:机房之间的网络通信出现故障),这就会导致集群分裂成两个或多个,它们都认为只有自己没有崩溃,都可以独立运行。对于zk这分布式协调系统来说,数据的一致性是基本的要求,它需要保证在任何时刻访问都能得到一致性的数据结果,所以分区容错性是需要保证的。zk默认是通过“过半机制”防止脑裂的。

不难发现,一致性和可用性是不能同时保证的。原因:数据同步是需要时间的,在同步的期间,若允许client访问,则client从不同节点读取到的数据就可能是不同的(牺牲了一致性保证了可用性)。若不允许client访问,则client在同步期间无法获取服务,但是在同步后无论访问哪个节点读取的数据都会是一样的(牺牲了可用性从而保证一致性)。

网络分区是指在分布式系统中,由于网络故障、节点故障等原因,导致集群中的节点被分割成多个独立的子集,每个子集之间无法进行通信的现象。网络分区会导致分布式系统的可用性和一致性受到影响,因此需要采取一定的措施来避免或解决网络分区问题。

BASE 理论

BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的简写,BASE 是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于 CAP 定理逐步演化而来的。

BASE 理论的核心思想是:即使无法做到强一致性,但每个系统都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

1.基本可用:分布式系统出现不可预知故障的时候,允许损失部分可用性。体现在:响应时间上的损失 和 功能上的损失(服务降级)。

2.软状态:允许系统数据存在的中间状态,并认为该中间状态的存在不会影响系统的整体可用性。例如允许zk之间的数据同步存在一定的数据延迟。

3.最终一致性:强调所有的数据副本在经过一段时间后,最终能够达到一个一致性的状态。

从zk的角度谈cp

在zk集群中,leader节点宕机后,整个集群会有一段时间是不能被访问的,后面又可以访问了。在这段不可访问的时间内,zk集群是在做leader选举,期间是不接受客户端的读写操作的。也可以这么理解在leader选举期间,zk集群是处于瘫痪期间的,同步完毕后读取到的数据是一致性的数据。满足了一致性,牺牲了一定的可用性。

分布式一致性

通俗来说,分布式事务是将多个操作组成一个事务来完成,并且这多个操作要么一起成功,要么一起失败。这个很有名的一个处理分布式事务的组件就是阿里的seats。一般分布式一致性是由分布式事务实现的,需要保证客户端从分布式系统中的每一个server节点获取的数据,在某一段时间是可以保证是一致的(最终一致性)。

2PC算法:每一个server对本地事务的确认,需要经历两个阶段,prepare阶段和commit阶段。在MySQL中通过2pc保证Redo和Binlog的保持一致。1)当事务提交时InnoDB存储引擎进行prepare操作,将数据写入到binglog日志中。2)InnoDB存储引擎将事务写入到Redo Log文件中。在seata的事务模式中XA,AT,TCC都是2PC的。

3PC算法:在2PC的基础上新增一个Accept阶段(提交指令阶段)。该阶段主要是事务协调者(TC)向资源管理者(RM)发送accept指令,RM收到指令后判断是否可以完成自己的事物并且将判断结果给TC。

Paxos算法:该算法要解决的问题是在分布式系统中如何就某个决议达成一致。ZAB(Zookeeper Atomic Broadcast)协议是Paxos算法的一种工业实现。在zookeeper中使用一个单一主进程来接收并处理客户端的所有请求(写请求),当数据发生变更,ZAB采用原子广播协议,以事务提案 Proposal 的形式广播到所有的副本进程上并且为每一个事务分配一个全局递增的编号Xid. 客户端连接到一个z k集群后,如果是读请求,那么当前节点就会根据自己保存的数据对其进行相应数据返回。如果是写请求并且不是leader节点,那么当前节点就会首先将请求转发给leader节点,leader节点以提案的方式广播该写操作,只有超过过半的节点同意该写操作该写请求才会被提交,然后leader广播给所有的follower节点,通知它们同步数据。

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

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

相关文章

安信可小安派AiPi 代码下载

安信可小安派AiPi 代码下载笔记记录 AiPi 代码下载(直接使用命令行操作,仅需要Type-C接口线即可) 在完成环境搭建,和代码编写前提下,使用Type-C接口线下载代码,当然可以自己使用usb-ttl串口线下载程序&am…

g++入门教程

g入门教程 目录 g入门教程 1.g简介 2.命令格式 3.命令选项 4.FAQ 4.1编译选项疑问 4.1.1-Wno-unknown-pragmas和-Wno-format -pg 4.2链接注意事项 4.2.1指定静态与动态的链接方式 本文章向大家介绍g入门教程,主要内容包括其使用实例、应用技巧、基本知识点…

4.6 static修饰符

static是一个修饰符,用于修饰类的成员属性和成员方法,还可以编写static代码块来优化程序性能。 1. static修饰属性 在Java程序中使用static修饰属性,则该属性称为静态属性(也称全局属性),静态属性可以使用…

SQL server 代理服务启动和查看

设置重启 使用管理员权限登录到运行 SQL Server 代理服务的计算机。 打开 Windows 服务管理器。可以通过按下 Windows 键 R,然后键入 "services.msc" 并按 Enter 来打开服务管理器。 在服务列表中,找到 "SQL Server Agent" 服务&…

回归算法|长短期记忆网络LSTM及其优化实现

本期文章将介绍LSTM的原理及其优化实现 序列数据有一个特点,即“没有曾经的过去则不存在当前的现状”,这类数据以时间为纽带,将无数个历史事件串联,构成了当前状态,这种时间构筑起来的事件前后依赖关系称其为时间依赖&…

解决:谷歌浏览器访问http时,自动转https访问的问题

问题背景:某个系统网站,之前一直用https域名访问,现在改成http域名后,用http访问,谷歌浏览器会自动跳转到https。 解决方法: 在浏览器中输入网址:chrome://net-internals/#hsts -》 在“Delete…

解决git action定时任务执行失败的方法

为了测试git action定时任务是否有效,你可能选择一个最近的时间测试, 但是发现怎么也触发不了,是不是觉得很苦恼。但是同样的时间,在第二天的定时任务又能成功运行。 这是什么原因? 原因就在上图,git act…

多测师肖sir_高级金牌讲师__接口测试之tonken (5.6)

接口测试之tonken 网站:http://shop.duoceshi.com/login?redirect2Fdashboard 第一个接口:uiid接口 uiid接口url:http://manage.duoceshi.com/auth/code test中语句: var jsonData JSON.parse(responseBody); postman.setEnvi…

NewStarCTF2023week4-溯源

题目描述是冰蝎进行WebShell连接的流量包,我们需要找到攻击者获取到的服务器用户名和服务器内网IP地址。 先介绍一下常见webshell工具的流量特征: 1、中国菜刀 请求体中存在eval、base64等特征字符; 连接过程中使用base64编码对发送的指令…

深入探究深度学习、神经网络与卷积神经网络以及它们在多个领域中的应用

目录 1、什么是深度学习? 2、深度学习的思想 3、深度学习与神经网络 4、深度学习训练过程 4.1、先使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练) 4.2、后自顶向下的监督学习(就是通过带标签的数…

如何在spark中使用scikit-learn和tensorflow等第三方python包

目录 1 打包需要的python包2 修改spark配置文件 1 打包需要的python包 首先我们用conda包管理工具对我们需要的python包进行虚拟环境创建: conda create -n python37 --copy -y -q python3.7 --prefix /your/workspace/path scikit-learn tensorflow下面是对每个参…

jenkins自动化操作步骤(gitblit)

1、登陆地址: http://xxxxxxxxx.org:xxxx/ admin/xxxx 2、创建任务 选择构建一个maven项目 3、配置 最多只保留一天一个任务 选择git仓库和账号密码 选择代码对应分支 build项: 1)使用父项目的pom文件:k56-boot/pom.xml 2&…

12-MySQL性能监控与调优工具推荐

MySQL性能监控与调优工具推荐 本文将介绍一些常用的MySQL性能监控与调优工具,包括命令行工具、图形界面工具和第三方工具。通过这些工具,我们可以更好地监控MySQL的性能,找出潜在的问题并进行优化。 一、命令行工具 MySQL自带的慢查询日志…

【Qt之QtConcurrent】描述及使用

描述 QtConcurrent是一个Qt库中的模块&#xff0c;用于实现多线程并发编程。它提供了一些高级API&#xff0c;使得在多核处理器上并行执行代码变得更加容易。 示例&#xff1a; 使用的话&#xff0c; 需要在pro文件中添加&#xff1a;QT concurrent模块。 #include <QC…

Leetcode刷题详解——第 N 个泰波那契数

1. 题目链接&#xff1a;1137. 第 N 个泰波那契数 2. 题目描述&#xff1a; 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&#…

从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

算法随想录算法训练营第四十五天|392.判断子序列 115.不同的子序列

392.判断子序列 题目&#xff1a;给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"…

力扣第56题 合并区间 c++ 贪心

题目 56. 合并区间 中等 相关标签 数组 排序 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例…

Flutter——最详细(Scaffold)使用教程

Scaffold简介 相当于界面的主体&#xff08;类似于安卓最外层PhoneWindow&#xff09;&#xff0c;组件的展示都必须依附于它。 使用场景&#xff1a; 每一个界面都是脚手架&#xff0c;通过它来进行架构实现&#xff0c;优美的布局效果。 属性作用appBar顶部的标题栏body显示整…

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…