随着互联网飞速发展,数据流量和企业所需要存储的信息也越来越多,单一的机器已经不能满足日常的需求,那么分布式系统也就应运而生。而在分布式系统中,最重要的问题就是如何保证数据的一致性。为了保证数据的一致性,我们必须要找到一种共识算法,来确保各机器之间的数据一致性。
在分布式系统中,由于机器可能宕机,网络可能短连等许多问题,Paxos算法既能解决这个问题也能保证数据的一致性。
"基于Paxos一致性协议,开发一个三节点集群KV存储服务PaxosKv。假定,该PaxosKv用于存储某游戏中的玩家、家族或者联盟的纯英文Slogan,该游戏活跃id 10000个。Slogan长度限制为32字节。Slogan中,需要包含客户端发送请求时刻,的毫秒级时间戳。"
以上是对本项目的简单描述,具体来说,有以下要求
本项目需要提供KV形式的数据更新和数据插入。
需要保证三个节点之间的数据一致性。
需要支持并发地读写。
上面的三个需求中,只有第一个是功能性需求,第二个和第三个都是非功能性需求。
本项目的主要难点在于算法,客户逻辑比较简单,用户只能执行更新数据和读写数据两个操作。以下为用例图
虽然客户逻辑比较简单,但是后台需要使用Paxos算法实现基于状态机的数据同步,而这一部分需要比较多的处理,所以有如下对象:
用户(用户ID,更新Slogan,读取Slogan)
PaxosKV(服务器ID,KV数据存储,Paxos算法实例,更新数据回应,读取数据回应,本地执行)
Paxos(服务器ID,提案ID,Log存储,提出提案,提交提案)
Log(Log对应的提案ID,需要读取或更新的Key,需要读取或更新的Value)
UML图如下
本项目实现的是KV数据库,所以无需建立关系型数据库的表。
这里,客户端可以重复地读取和写入数据。
在数据库端,Paxos算法的流程如下:
阶段一为准备阶段
Proposer 选择一个Number n,然后向大多数Acceptor发送Number 为n的Prepare request。
如果一个Acceptor接收到Number为n的Prepare request,并且n大于任何它已经回复的Prepare request的Number,那么它将承诺不再接受任何Number 小于 n的proposal,并且回复已经接受的最大Number的 proposal。
阶段二为接受阶段
如果Proposer 接受了来自大多数Acceptor对它的Prepare request 的回 复,那么接下来它将给这些 Acceptor发送Number为n,Value为v的 Proposal作为Accept request。其中v是收到的回复中最大 Number 的Proposal的Value,或者如果回复中没有Proposal的话,就可以是它自己选的任意值。
如果 Acceptor 收到一个Number 为n的Accept request,如果它没有对Number 大于n的Prepare request进行过回复,那么就接受该Accept request。
通过以上的两个阶段,我们可以保证Log的完整并且顺序。
然后由于状态机的特性,只要我们按序执行Log,就能保证KV的一致性。
我的工程实践偏向于算法的研究,所以业务上只有很简单的读取和写入KV数据两个操作,但是通过整个分析,也能够了解软件工程分析在具体项目中提纲挈领的作用。
原文:https://www.cnblogs.com/trafalgarricardolu/p/14091101.html