更新时间:2022-06-16 10:06:58 来源:极悦 浏览535次
随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架构,不得不提的就是分布式。在关于分布式事务、两阶段提交协议、三阶提交协议一文中主要用于解决分布式一致性问题的集中协议,那么这篇文章主要讲解业内公认的比较难的也是最行之有效的paxos算法。
Paxos 算法是分布式一致性算法用来解决一个分布式系统如何就某个值(决议)达成一致的问题。
人们在理解paxos算法是会遇到一些困境,那么接下来,我们带着以下几个问题来学习paxos算法:
1.paxos到底在解决什么问题?
2.paxos到底如何在分布式存储系统中应用?
3.paxos的核心思想是什么?
在关于分布式一致性的探究中我们提到过,分布式的一致性问题其实主要是指分布式系统中的数据一致性问题。所以,为了保证分布式系统的一致性,就要保证分布式系统中的数据是一致的。
在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。
所以,paxos算法主要解决的问题就是如何保证分布式系统中各个节点都能执行一个相同的操作序列。
上图中,C1是一个客户端,N1、N2、N3是分布式部署的三个服务器,初始状态下N1、N2、N3三个服务器中某个数据的状态都是S0。当客户端要向服务器请求处理操作序列:op1op2op3时(op表示operation)(这里把客户端的写操作简化成向所有服务器发送相同的请操作序列,实际上可能通过Master/Slave模式处理)。如果想保证在处理完客户端的请求之后,N1、N2、N3三个服务器中的数据状态都能从S0变成S1并且一致的话(或者没有执行成功,还是S0状态),就要保证N1、N2、N3在接收并处理操作序列op1op2op3时,严格按照规定的顺序正确执行opi,要么全部执行成功,要不就全部都不执行。
所以,针对上面的场景,paxos解决的问题就是如何依次确定不可变操作opi的取值,也就是确定第i个操作什么,在确定了opi的内容之后,就可以让各个副本执行opi操作。
Paxos是一个十分巧妙的一致性算法,但是他也十分难以理解,就连他的作者Lamport都被迫对他做过多种讲解。我认为对paxos算法讲解的最清楚的就是维基百科了。但是要看懂维基百科中的介绍需要很强的数学思维(paxos毕竟是一个算法),而且有很多关于定理的推论、证明等过程。那么本篇文章主要站在程序的角度,通俗的,循序渐进的讲解到底什么是paxos算法。
我们先把前面的场景简化,把我们现在要解决的问题简化为如何确定一个不可变变量的取值(每一个不可变变量可以标识一个操作序列中的某个操作,当确保每个操作都正确之后,就可以按照顺序执行这些操作来保证数据能够准确无误的从一个状态转变成另外一个状态了)。
接下来,请跟我一步一步的学习paxos算法。
要学习paxos算法,我们就要从他要解决的问题出发,假如没有paxos算法,当我们面对如何确定一个不可变变量的取值这样一个问问题的时候,我们应该如何解决呢?
这里暂不介绍paxos中的角色的概念,读者可以自行从维基百科中了解。不了解的话也可以直接往下看,看着看着就了解了。
问题抽象
我们把确定一个不可变变量的取值问题定义成:
设计一个系统,来存储名称为var的变量。
var的取值可以是任意二进制数
系统内部由多个Accepter组成,负责管理和存储var变量。
系统对外提供api,用来设置var变量的值propose(var,V) =><ok,f> or<error>
将var的值设置为V,系统会返回ok和系统中已经确定的取值f,或者返回error。
外部有多个Proposer机器任意请求系统,调用系统API(propose(var,V) =><ok,f> or<error> )来设置var变量的值。
系统对外提供api,用来设置var变量的值propose(var,V) => or
将var的值设置为V,系统会返回ok和系统中已经确定的取值f,或者返回error。
外部有多个Proposer机器任意请求系统,调用系统API(propose(var,V) => or )来设置var变量的值。
系统需要保证var的取值满足一致性
如果var没有被设置过,那么它的初始值为null
一旦var的值被设置成功,则不可被更改,并且可以一直都能获取到这个值
系统需要满足容错特性
可以容忍任意proposer出现故障可以容忍少数acceptor故障(半数以下)
暂时忽略网络分化问题和acceptor故障导致var丢失的问题。
到这里,问题已经抽象完成了,读者可以再仔细看看上面的系统描述。如果这样设置一个系统,是不是就可以保证变量var的不可变性了呢?
这里还是再简单讲解一下,上面的系统确实可以保证变量var的不可变性。
因为var的初始值为null,当有proposer请求接口propose(var,v)设置var的值的时候,系统会将var设置为v,并返回f(f==v)。
var变量被初始化以后,再有proposer请求propose(var,v)设置var的值的时候,系统会直接返回系统中已有的var的值f,而放弃proposer提供的v。
以上就是关于“分布式一致性算法:paxos算法”的介绍,大家如果想了解更多相关知识,可以关注一下极悦的Java极悦在线学习,里面的课程内容细致全面,从入门到精通,很适合没有基础的小伙伴学习,希望对大家能够有所帮助哦。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习