seo网站做推广公司,徐州网约车公司哪家好,网站特效 站长,如何写软文目录 1.绪论
2.什么是分布式系统#xff0c;和集群的区别
3.CAP理论
3.1 什么是CAP理论
3.2 一致性
3.2.1 计算机的一致性说明
1.事务中的一致性
2.并发场景下的一致性
3.分布式场景下的一致性
3.2.2 一致性分类
3.2.3 强一致性
1.线性一致性
a) 定义
a) Raft算法…目录 1.绪论
2.什么是分布式系统和集群的区别
3.CAP理论
3.1 什么是CAP理论
3.2 一致性
3.2.1 计算机的一致性说明
1.事务中的一致性
2.并发场景下的一致性
3.分布式场景下的一致性
3.2.2 一致性分类
3.2.3 强一致性
1.线性一致性
a) 定义
a) Raft算法是如何实现线性一致性的
2.顺序一致性
a顺序一致性的定义
b) 顺序一致性和线性一致性的区别
c) zookeeper是如何实现顺序一致性的
3.2.4 弱一致性
3.2.5 最终一致性
3.3 可用性
3.4 分区容忍性
3.5 CAP组合
4.Base理论
4.1 Base理论的定义
4.1.1基本可用
4.1.2 软状态
4.1.3 最终一致性
5.拜占庭将军问题
6.引用 1.绪论
本文主要介绍的分布是系统中的一些常见的理论知识比如CAP理论BASE理论拜占庭将军问题等。
2.什么是分布式系统和集群的区别
分布式系统就是将整个系统根据业务拆分多个微服务服务之间通过Rpc进行通信。
集群是将多个相同应用部署到不同的集群模式上本质上是为了提高吞吐量已经保证高可用性。
3.CAP理论
3.1 什么是CAP理论
CAP理论是分布式系统的理论基础,即一个分布式系统最多满足CAP这三项中的两项。即只能满足一致性(Consistance)、可用性Aviablity、分区容忍性Partition tolerance中的两项。
3.2 一致性
在CAP理论中一致性指的是每次读取到的数据一定是当前最新的数据否者报错。可以看出一致性其实指的是强一致性。
3.2.1 计算机的一致性说明
在计算机中机中有很多地方都会出现一致性这个概念我们也经常将他们混淆一谈这里将根据我的经验来说明不同的一致性表达的含义。
1.事务中的一致性
事务有4个性质分别是ACID原子性一致性隔离性持久性。什么是一致性呢我认为这里的一致性是事务的操作逻辑应该客观事实一致。比如张三向李四转账50元张三卡中减少50李四增加50钱的总数是不变的。如果张三卡中减少50而李四卡中余额未变相当于钱的总数增加50这是不符合客观事实的。
2.并发场景下的一致性
在并发场景下由于资源的共享导致锁竞争所以可能出现每次请求到结果是不一样的问题这样就会出现一致性问题。
3.分布式场景下的一致性
分布式场景下的一致性其实是并发场景下的一致性的演变。我们可以想象分布式场景下由于有副本的概念可能因为同步时延问题或者其他问题导致不同的副本之间数据是不完全一致的所以访问不同的节点会有不同的结果这也会有一致性问题。
那为什么说这个一致性是并发场景下一致性的演变呢在JMM里面我们讲到过为什么会有一致性问题主要原因是java的缓存采用二级缓存的方式线程A读取本地缓存前可能线程B更新数据到了共享缓存中但是线程A读取到的还是老数据。所以这里一致性本质上是解决线程A、B、C的本地缓存之间数据不一致问题。 由于不同副本之间需要网络同步所以在同一个时刻不同的客户端访问不同的节点可能得到的数据是不一致的。 可以看出并发场景下的一致性和分布式系统中的一致性其实都是为了解决同一个时刻多个副本之间数据一致的问题。
3.2.2 一致性分类
我们这里主要介绍的是分布式场景下的一致性问题这里一致性主要分为强一致性弱一致性和最终一致性。
3.2.3 强一致性
1.线性一致性
a) 定义
线性一致性是要求最高的一种一致性他要求无论从哪个副本读取数据一定读到的是当前整个集群里面最新的数据。其实在并发的一致性中我们可以常用加悲观锁的方式使得整个程序像是在单线程中执行一样。
像Paxos、Raft等共识算法其实就实现了线性一致性。
a) Raft算法是如何实现线性一致性的
在讲Raft算法是如何实现一致性之前我们先来大概了解一下Raft算法接受写请求的原理其实就是通过二阶段提交来保证数据的一致性。Raft算法详细介绍可以看深度解析RocketMq源码-高可用存储组件一 raft协议详解 1.主节点接收写请求 2.主节点向所有的从节点发送预写请求 3.从节点返回ack给主节点 4.当主节点收到超过半数的从节点返回ack过后将数据commit并且应用到状态机中。 5.向所有的从节点发送commit请求从节点将数据应用到状态机中。 注这里状态机是什么Raft算法是一个共识算法目的是为了让所有节点达成共识也即可以将客户端接收的数据写入到磁盘中而写入磁盘这个动作其实就是交给状态机来实现的。状态机其实就是应用Raft算法达到共识过后的逻辑处理。 我们知道Raft算法的写请求只能交给主节点处理我们如果要保证线性一致性的话可以在有写请求到达的时候将全部节点加锁此时所有节点不能处理任何请求当主节点接收请求并且应用到状态机中过后同时将数据同步给所有的节点都成功(不只是半数以上节点成功)才给客户端返回成功并且释放锁。这样后面所有的读请求无论访问哪个节点数据一定是一样的。但是这样性能太低所以Raft算法是如何实现的呢 1.写写顺序性写请求只能交给主节点处理并且Raft算法是交给主线程来处理写请求的这样其实就保证了写写的顺序性。 2.写读顺序性当读请求来的时候。如果访问的是主节点主节点首先会判断当的lastApplyIndex和lastCommitIndex是否相等如果不相等便等待。这里lastApplyIndex表示的是最后的应用状态机的indexlastCommitIndex表示的是最后达成共识的index因为主节点可能在达成共识过后就给客户端返回成功但是还没有将数据应用到状态机如果此时有读请求到达主节点会返回老数据如果访问的的是从节点从节点首先会发送一个请求获取lastCommitIndex的请求到达主节点只有当前从节点的lastApplyIndex和主节点的lastCommitIndex相等才能返回数据此时一定返回的是最新的数据。 2.顺序一致性
a顺序一致性的定义
顺序一致性主要满足两点:
1.对于单个线程来说它的所有操作一定是保证顺序性的
2.对于多个线程的写操作需要需要按照时间排列。即所有线程的写操作是放到一个队列中先到达的写先被读取。
b) 顺序一致性和线性一致性的区别 对于写写的关系顺序一致性和线性一致性都要求全局有序对于写读操作线性一致性要求全局写读有序但是顺序一致性只要求本线程类写读有序。比如客户端A更新了集群的数据客户端B来读取数据如果是线性一致性一定能够读取到客户端A更新的数据。如果是顺序一致性客户端B可能读取老数据但是在过一定的时间后一定能够读取到A更新的数据。 c) zookeeper是如何实现顺序一致性的
zookeeper是采用自己的zab协议来实现顺序一致性的。就我的理解zab中的顺序一致性其实只实现了写写的顺序性没有实现单个客户端之间写读的顺序性。我们来看看zab是如何实现写写的一致性的。
1.和Raft协议一样zab也是一个单主节点共识算法所以他会通过选举得到一个主节点来接收写请求。
2.如果写请求到达的时候会给每个日志维护一个全局递增的zxid并且采用二阶段提交的方式将数据同步给从节点。
3.当超过半数以上的节点返回同步成功(ack)响应的时候主节点会将数据应用到状态机中并且给从节点发送应用请求。
4.从节点应用数据到状态机。
可以看出zab协议和raft协议的最本质的区别就是否实现线性一致性读(保证写读的顺序性)这也是线性一致性和顺序一致性最本质的区别。
3.2.4 弱一致性
弱一致性包括因果一致性会话一致性等子模型并不常见这里不再过多叙述。
3.2.5 最终一致性
最终一致性不关心的请求执行的先后顺序只关心结果正确的就行。比如有A-B-C三个写请求最终一致性要求无论你先执行A还是B或者C只要结果正确便满足最终一致性。而顺序一致性要求执行结果一定是按照请求到达顺序执行的这也是最终一种性和顺序一致性的区别。
3.3 可用性
在CAP理论中可用性指的是每次读取到的数据一定要返回数据可以是旧数据。
3.4 分区容忍性
分区容忍性就是当某个网络节点宕机或者丢包的情况下依然能够向外提供服务。
3.5 CAP组合
cap理论中c和a其实是天然矛盾的两个性质所以在分布式系统中是不能够共存的。对于单点系统其实是保证ca两个性质而对于zookeeper这种保证的是cp两个性质; 对于redis其实保证的是ap两个性质。
4.Base理论
4.1 Base理论的定义
base理论主要由基本可用、软状态、最终一致性三个性质组成.
4.1.1基本可用
基本可用指的是服务在某些情况下比如流量突增等情况下可以对某些边缘服务进行降级只保证核心服务可用即可。
4.1.2 软状态
软状态指的是运行系统存在中间状态比如下下单支付两个微服务下单成功过后不需要立刻进行支付并支付成功存在一个中间状态-支付中这个状态就是软状态。在支付中这个状态中如果我们扣款失败可以进行重试直到扣款成功。
4.1.3 最终一致性
最终一致性在前面已经讲过其实就是不关心中间状态只需要保证最后的结果达成一致性即可。
5.拜占庭将军问题
拜占庭将军问题描述的是拜占庭的一队军队需要攻打一个城市攻打成功需要不同的将军进行系统决策但是有些将军可能是叛徒他们可能发出虚假的信息干扰决策如何让每个将军在不知道哪些将军是叛徒的情况下做出决策。
常见的解决方式就是就是采用少数服从多数的原则每个将军会对一个指令进行投票只要超过半数的将军的投票通过该协议便被达成共识。只要叛徒数不超过一半那一定能做出正确的决定。
这个解决方案在Raft协议zab协议中都会用到Raft协议和zab协议本质上是为了选举出拥有最新日志的节点成为主节点这就是将军们的决议。所以在选举的时候只要超过半数节点同意某个节点成为主节点(选举的规则就是备选举节点拥有比超过半数的节点新的日志)该节点便会升为leader。为了保证叛徒节点不超过半数Raft协议或者zab协议在同步日志的时候二阶段提交的时候要求半数以上节点同步成功日志才会返回成功保证了整个集群至少有半数的节点拥有最新日志。
6.引用
[1] 深度剖析zookeeper原理
[2] 手写SOFA-JRAFT实现线性一致读功能
[3] 分布式系统一致性模型线性一致性和顺序一致性_线性一致性 顺序一致性-CSDN博客
[4] 图解一致性模型 - 哔哩哔哩