raft云数据库(raft服务器搭建)

admin 176 2023-03-13

阿里云服务器优惠多,折扣错,惊喜多,请咨询:www.wqiis.com

本文目录一览:

分库分表 VS newsql数据库

最近与同行 科技 交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好坏其实有失公允。

本文通过对两种模式关键特性实现原理对比,希望可以尽可能客观、中立的阐明各自真实的优缺点以及适用场景。

首先关于“中间件+关系数据库分库分表”算不算NewSQL分布式数据库问题,国外有篇论文pavlo-newsql-sigmodrec,如果根据该文中的分类,Spanner、TiDB、OB算是第一种新架构型,Sharding-Sphere、Mycat、DRDS等中间件方案算是第二种(文中还有第三种云数据库,本文暂不详细介绍)。

基于中间件(包括SDK和Proxy两种形式)+传统关系数据库(分库分表)模式是不是分布式架构?我觉得是的,因为存储确实也分布式了,也能实现横向扩展。但是不是"伪"分布式数据库?从架构先进性来看,这么说也有一定道理。"伪"主要体现在中间件层与底层DB重复的SQL解析与执行计划生成、存储引擎基于B+Tree等,这在分布式数据库架构中实际上冗余低效的。为了避免引起真伪分布式数据库的口水战,本文中NewSQL数据库特指这种新架构NewSQL数据库。

NewSQL数据库相比中间件+分库分表的先进在哪儿?画一个简单的架构对比图:

这些大多也是NewSQL数据库产品主要宣传的点,不过这些看起来很美好的功能是否真的如此?接下来针对以上几点分别阐述下的我的理解。

这是把双刃剑。

CAP限制

想想更早些出现的NoSQL数据库为何不支持分布式事务(最新版的mongoDB等也开始支持了),是缺乏理论与实践支撑吗?并不是,原因是CAP定理依然是分布式数据库头上的颈箍咒,在保证强一致的同时必然会牺牲可用性A或分区容忍性P。为什么大部分NoSQL不提供分布式事务?

那么NewSQL数据库突破CAP定理限制了吗?并没有。NewSQL数据库的鼻主Google Spanner(目前绝大部分分布式数据库都是按照Spanner架构设计的)提供了一致性和大于5个9的可用性,宣称是一个“实际上是CA”的,其真正的含义是 系统处于 CA 状态的概率非常高,由于网络分区导致的服务停用的概率非常小 ,究其真正原因是其打造私有全球网保证了不会出现网络中断引发的网络分区,另外就是其高效的运维队伍,这也是cloud spanner的卖点。详细可见CAP提出者Eric Brewer写的《Spanner, TrueTime 和CAP理论》。

完备性 :

两阶段提交协议是否严格支持ACID,各种异常场景是不是都可以覆盖?

2PC在commit阶段发送异常,其实跟最大努力一阶段提交类似也会有部分可见问题,严格讲一段时间内并不能保证A原子性和C一致性(待故障恢复后recovery机制可以保证最终的A和C)。完备的分布式事务支持并不是一件简单的事情,需要可以应对网络以及各种硬件包括网卡、磁盘、CPU、内存、电源等各类异常,通过严格的测试。之前跟某友商交流,他们甚至说目前已知的NewSQL在分布式事务支持上都是不完整的,他们都有案例跑不过,圈内人士这么笃定,也说明了 分布式事务的支持完整程度其实是层次不齐的。

但分布式事务又是这些NewSQL数据库的一个非常重要的底层机制,跨资源的DML、DDL等都依赖其实现,如果这块的性能、完备性打折扣,上层跨分片SQL执行的正确性会受到很大影响。

性能

传统关系数据库也支持分布式事务XA,但为何很少有高并发场景下用呢? 因为XA的基础两阶段提交协议存在网络开销大,阻塞时间长、死锁等问题,这也导致了其实际上很少大规模用在基于传统关系数据库的OLTP系统中。

NewSQL数据库的分布式事务实现也仍然多基于两阶段提交协议,例如google percolator分布式事务模型,

采用原子钟+MVCC+ Snapshot Isolation(SI),这种方式通过TSO(Timestamp Oracle)保证了全局一致性,通过MVCC避免了锁,另外通过primary lock和secondary lock将提交的一部分转为异步,相比XA确实提高了分布式事务的性能。

但不管如何优化,相比于1PC,2PC多出来的GID获取、网络开销、prepare日志持久化还是会带来很大的性能损失,尤其是跨节点的数量比较多时会更加显著,例如在银行场景做个批量扣款,一个文件可能上W个账户,这样的场景无论怎么做还是吞吐都不会很高。

虽然NewSQL分布式数据库产品都宣传完备支持分布式事务,但这并不是说应用可以完全不用关心数据拆分,这些数据库的最佳实践中仍然会写到,应用的大部分场景尽可能避免分布式事务。

既然强一致事务付出的性能代价太大,我们可以反思下是否真的需要这种强一致的分布式事务?尤其是在做微服务拆分后,很多系统也不太可能放在一个统一的数据库中。尝试将一致性要求弱化,便是柔性事务,放弃ACID(Atomicity,Consistency, Isolation, Durability),转投BASE(Basically Available,Soft state,Eventually consistent),例如Saga、TCC、可靠消息保证最终一致等模型,对于大规模高并发OLTP场景,我个人更建议使用柔性事务而非强一致的分布式事务。关于柔性事务,笔者之前也写过一个技术组件,最近几年也涌现出了一些新的模型与框架(例如阿里刚开源的Fescar),限于篇幅不再赘述,有空再单独写篇文章。

HA与异地多活

主从模式并不是最优的方式,就算是半同步复制,在极端情况下(半同步转异步)也存在丢数问题,目前业界公认更好的方案是基于paxos分布式一致性协议或者其它类paxos如raft方式,Google Spanner、TiDB、cockcoachDB、OB都采用了这种方式,基于Paxos协议的多副本存储,遵循过半写原则,支持自动选主,解决了数据的高可靠,缩短了failover时间,提高了可用性,特别是减少了运维的工作量,这种方案技术上已经很成熟,也是NewSQL数据库底层的标配。

当然这种方式其实也可以用在传统关系数据库,阿里、微信团队等也有将MySQL存储改造支持paxos多副本的,MySQL也推出了官方版MySQL Group Cluster,预计不远的未来主从模式可能就成为 历史 了。

需要注意的是很多NewSQL数据库厂商宣传基于paxos或raft协议可以实现【异地多活】,这个实际上是有前提的,那就是异地之间网络延迟不能太高 。以银行“两地三中心”为例,异地之间多相隔数千里,延时达到数十毫秒,如果要多活,那便需异地副本也参与数据库日志过半确认,这样高的延时几乎没有OLTP系统可以接受的。

数据库层面做异地多活是个美好的愿景,但距离导致的延时目前并没有好的方案。 之前跟蚂蚁团队交流,蚂蚁异地多活的方案是在应用层通过MQ同步双写交易信息,异地DC将交易信息保存在分布式缓存中,一旦发生异地切换,数据库同步中间件会告之数据延迟时间,应用从缓存中读取交易信息,将这段时间内涉及到的业务对象例如用户、账户进行黑名单管理,等数据同步追上之后再将这些业务对象从黑名单中剔除。由于双写的不是所有数据库操作日志而只是交易信息,数据延迟只影响一段时间内数据,这是目前我觉得比较靠谱的异地度多活方案。

另外有些系统进行了单元化改造,这在paxos选主时也要结合考虑进去,这也是目前很多NewSQL数据库欠缺的功能。

Scale横向扩展与分片机制

paxos算法解决了高可用、高可靠问题,并没有解决Scale横向扩展的问题,所以分片是必须支持的。NewSQL数据库都是天生内置分片机制的,而且会根据每个分片的数据负载(磁盘使用率、写入速度等)自动识别热点,然后进行分片的分裂、数据迁移、合并,这些过程应用是无感知的,这省去了DBA的很多运维工作量。以TiDB为例,它将数据切成region,如果region到64M时,数据自动进行迁移。

分库分表模式下需要应用设计之初就要明确各表的拆分键、拆分方式(range、取模、一致性哈希或者自定义路由表)、路由规则、拆分库表数量、扩容方式等。相比NewSQL数据库,这种模式给应用带来了很大侵入和复杂度,这对大多数系统来说也是一大挑战。

这里有个问题是NewSQL数据库统一的内置分片策略(例如tidb基于range)可能并不是最高效的,因为与领域模型中的划分要素并不一致,这导致的后果是很多交易会产生分布式事务。 举个例子,银行核心业务系统是以客户为维度,也就是说客户表、该客户的账户表、流水表在绝大部分场景下是一起写的,但如果按照各表主键range进行分片,这个交易并不能在一个分片上完成,这在高频OLTP系统中会带来性能问题。

分布式SQL支持

常见的单分片SQL,这两者都能很好支持。NewSQL数据库由于定位与目标是一个通用的数据库,所以支持的SQL会更完整,包括跨分片的join、聚合等复杂SQL。中间件模式多面向应用需求设计,不过大部分也支持带拆分键SQL、库表遍历、单库join、聚合、排序、分页等。但对跨库的join以及聚合支持就不够了。

NewSQL数据库一般并不支持存储过程、视图、外键等功能,而中间件模式底层就是传统关系数据库,这些功能如果只是涉及单库是比较容易支持的。

NewSQL数据库往往选择兼容MySQL或者PostgreSQL协议,所以SQL支持仅局限于这两种,中间件例如驱动模式往往只需做简单的SQL解析、计算路由、SQL重写,所以可以支持更多种类的数据库SQL。

SQL支持的差异主要在于分布式SQL执行计划生成器,由于NewSQL数据库具有底层数据的分布、统计信息,因此可以做CBO,生成的执行计划效率更高,而中间件模式下没有这些信息,往往只能基于规则RBO(Rule-Based-Opimization),这也是为什么中间件模式一般并不支持跨库join,因为实现了效率也往往并不高,还不如交给应用去做。

存储引擎

传统关系数据库的存储引擎设计都是面向磁盘的,大多都基于B+树。B+树通过降低树的高度减少随机读、进而减少磁盘寻道次数,提高读的性能,但大量的随机写会导致树的分裂,从而带来随机写,导致写性能下降。NewSQL的底层存储引擎则多采用LSM,相比B+树LSM将对磁盘的随机写变成顺序写,大大提高了写的性能。不过LSM的的读由于需要合并数据性能比B+树差,一般来说LSM更适合应在写大于读的场景。当然这只是单纯数据结构角度的对比,在数据库实际实现时还会通过SSD、缓冲、bloom filter等方式优化读写性能,所以读性能基本不会下降太多。NewSQL数据由于多副本、分布式事务等开销,相比单机关系数据库SQL的响应时间并不占优,但由于集群的弹性扩展,整体QPS提升还是很明显的,这也是NewSQL数据库厂商说分布式数据库更看重的是吞吐,而不是单笔SQL响应时间的原因。

成熟度与生态

分布式数据库是个新型通用底层软件,准确的衡量与评价需要一个多维度的测试模型,需包括发展现状、使用情况、社区生态、监控运维、周边配套工具、功能满足度、DBA人才、SQL兼容性、性能测试、高可用测试、在线扩容、分布式事务、隔离级别、在线DDL等等,虽然NewSQL数据库发展经过了一定时间检验,但多集中在互联网以及传统企业非核心交易系统中,目前还处于快速迭代、规模使用不断优化完善的阶段。

相比而言,传统关系数据库则经过了多年的发展,通过完整的评测,在成熟度、功能、性能、周边生态、风险把控、相关人才积累等多方面都具有明显优势,同时对已建系统的兼容性也更好。

对于互联网公司,数据量的增长压力以及追求新技术的基因会更倾向于尝试NewSQL数据库,不用再考虑库表拆分、应用改造、扩容、事务一致性等问题怎么看都是非常吸引人的方案。

对于传统企业例如银行这种风险意识较高的行业来说,NewSQL数据库则可能在未来一段时间内仍处于 探索 、审慎试点的阶段。基于中间件+分库分表模式架构简单,技术门槛更低,虽然没有NewSQL数据库功能全面,但大部分场景最核心的诉求也就是拆分后SQL的正确路由,而此功能中间件模式应对还是绰绰有余的,可以说在大多数OLTP场景是够用的。

限于篇幅,其它特性例如在线DDL、数据迁移、运维工具等特性就不在本文展开对比。

总结

如果看完以上内容,您还不知道选哪种模式,那么结合以下几个问题,先思考下NewSQL数据库解决的点对于自身是不是真正的痛点:

如果以上有2到3个是肯定的,那么你可以考虑用NewSQL数据库了,虽然前期可能需要一定的学习成本,但它是数据库的发展方向,未来收益也会更高,尤其是互联网行业,随着数据量的突飞猛进,分库分表带来的痛苦会与日俱增。当然选择NewSQL数据库你也要做好承担一定风险的准备。

如果你还未做出抉择,不妨再想想下面几个问题:

如果这些问题有多数是肯定的,那还是分库分表吧。在软件领域很少有完美的解决方案,NewSQL数据库也不是数据分布式架构的银弹。相比而言分库分表是一个代价更低、风险更小的方案,它最大程度复用传统关系数据库生态,通过中间件也可以满足分库分表后的绝大多数功能,定制化能力更强。 在当前NewSQL数据库还未完全成熟的阶段,分库分表可以说是一个上限低但下限高的方案,尤其传统行业的核心系统,如果你仍然打算把数据库当做一个黑盒产品来用,踏踏实实用好分库分表会被认为是个稳妥的选择。

很多时候软件选型取决于领域特征以及架构师风格,限于笔者知识与所属行业特点所限,以上仅为个人粗浅的一些观点,欢迎讨论。

木筏求生有云存档吗

木筏求生有云存档,玩家在steam联网的时候玩这款游戏,在存档的时候就会自动保存到云空间,玩家在其他电脑上只要登录steam账号,就可以从云端下载存档继续游戏。

如果玩家没有用steam账号登录游戏,则存档是保存在本地的,玩家在更换电脑之后就无法使用原存档进行游戏了。

木筏求生玩家注意事项。

玩家在玩木筏求生时要注意,开局时用钩子收集资源,注意不要漏木桶,勾不到就下水捞,先造杯子和煮水器,然后造炉子和鱼竿。保证死不了后造把长矛,初期鲨鱼啃木板很伤,尤其怕咬到放物品的木板。网造够10个以上就可以了,可以开始铺地板了,每隔3-5分钟回来网里收收东西。

raft算法与paxos算法相比有什么优势,使用场景有什么差异

Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。因此从20世纪80年代起对于一致性算法的研究就没有停止过。节点通信存在两种模型:共享内存(Sharedmemory)和消息传递(Messagespassing)。Paxos算法就是一种基于消息传递模型的一致性算法。不仅只用在分布式系统,凡是多个过程需要达成某种一致性的都可以用到Paxos算法。一致性方法可以通过共享内存(需要锁)或者消息传递实现,Paxos算法采用的是后者。下面是Paxos算法适用的几种情况:一台机器中多个进程/线程达成数据一致;分布式文件系统或者分布式数据库中多客户端并发读写数据;分布式存储中多个副本响应读写请求的一致性。Lamport最初Paxos算法的论文ThePart-TimeParliament在理解起来比较有挑战性,个人认为部分原因是Lamport通过故事的方式来表述、解释这个问题,所以在阅读文章的时候读者需要透过故事讲的本身看到作者想说明什么。比如文章中会有很多讲到Paxos文明没有被发现和考证的,这些映射到实际系统中往往是简单、大家都心知肚明的基础,但如果读者苦于想知道这些内容是什么时,就上当了。下面章节安排如下:第二节对应原文的1.1-2.1。第三节对应原文2.2-3.2。

深入浅出 Raft - 基本概念

因为一直在跟 Raft 打交道,虽然对 Raft 很熟悉了,但如果你要我去给一个完全不知道什么是 Raft 的人讲 Raft,我觉得难度还是非常大的。所以我决定使用我一贯罗里吧嗦,用比喻和讲故事的方式,来尝试说说 Raft。

如果你跟你孩子一起看过小猪佩奇,你大概就能知道我为啥用了这么怪的取名。如果没看过的,强烈推荐你去看看,这真的是一部很不错的儿童动画。

兔小姐准备在泥坑小镇成立一家银行(就叫泥坑银行吧)。对于银行储蓄系统的设计,兔小姐找来了猪爸爸。

兔小姐:『猪爸爸,我们要保证,无论怎样用户的金钱不能有错误。假如客户存了 100 块钱,那么他的账户就会多出来 100 块钱,不会是 101,也不会是 99。』

猪爸爸:『好的,兔小姐,我觉得我们可以这样。如果一个客户来存钱,那么,首先我们可以将交易依次顺序记录下来,然后兔先生再把客户实际的钱放到金库对应的保险柜里面。当兔先生把钱放好之后,我们就可以告诉客户这笔交易完成了』

兔小姐:『好主意,猪爸爸,不过为什么要先将交易记录下来呢?直接放到金库不就可以了吗?』

猪爸爸:『首先,如果交易记录都没成功,那么我们就不用再麻烦将钱放到金库了。其次,假设同时很多人来存钱,兔先生有点处理不过来,没准就会弄错。我们有记录的话,兔先生就可以按照记录一个一个处理,虽然这样慢一点,但不会出错。另外,交易记录永远不可能被篡改或者被覆盖,譬如如果我们在记录 N 这个位置记录下客户 A 存了 100 块钱,那么这条记录 N 后面一定是这笔交易,而不可能在变成客户 B 取了 100 块钱。』

兔小姐:『嗯,听起来很有道理,那么我们就这么做吧。』

好了,虽然上面的例子有点不切合实际,毕竟如果银行真这么玩,离倒闭也就不远了,但各位还是先认为这套机制能很好的工作吧。在 Raft 里面,交易记录,我们可以叫做日志,而金库,则是状态机。对于任何的操作,Raft 会首先将其记录到日志,然后等这个日志提交之后,我们再将其对应的数据写入到状态机里面。每一条日志都有一个唯一的编号,这个编号是严格按照加一单调递增的,也就是说,leader 只会追加日志,而不会覆盖日志。假设现在的日志编号是 10,那么下一条日志的编号就一定是 11。如果这条日志被应用到了状态机,那么我们就可以认为这条日志已经是被 applied 了。

不久之后,泥坑银行储蓄系统第一个版本就上线了。一切工作的良好,直到有一天,电闪雷鸣,泥坑银行停电了。用户发现根本没办法进行交易了,虽然狗爷爷尽了最大的努力,但让整个银行正常工作也花了不少时间。银行正常营业之后,兔小姐找来了猪爸爸。

兔小姐:『猪爸爸,现在看起来我们必须要保证,即使在泥坑小镇的银行出现了问题,譬如停电这种的,用户仍然能够正常的进行交易。』

猪爸爸:『是的,兔小姐。那要做到这样,我们必须在其他地方建立另一个银行网点,这样,即使在泥坑小镇银行不能对外提供服务了,但客户还是能在其他银行网点进行交易。』

兔小姐:『好主意,猪爸爸,那么我们 就在回音山谷建立一个分部,当泥坑小镇的银行出现了故障,用户仍然能够在回音山谷进行交易。』

猪爸爸:『兔小姐,恐怕只是在回音山谷建立一个分部,是不行的。』

兔小姐:『为什么呢?猪爸爸,我有点不明白了。』

猪爸爸:『现在假设我们在泥坑小镇和回音山谷都部署好系统,如果一个客户到泥坑小镇存钱,我们首先要在泥坑小镇这边记录这笔交易,然后在通知回音山谷那边也记录这笔交易,只有我们知道回音山谷记录交易成功了,我们才可以进行下一步,也就是将用户的钱放到金库里面,同时告诉回音山谷那边,也需要将对应钱放到那边的金库,这样如果泥坑小镇出现了问题,客户仍然能到回音山谷那边取钱。』

兔小姐:『这听起来很复杂,但这样看起来没问题,所以将系统放到两个地方,没问题呀!』

猪爸爸:『不不,兔小姐。上面我说的是都两边都能正常工作的情况,但实际会有很多异常情况。譬如,假设泥坑小镇这边的系统能正常工作,但回音山谷的出现了问题,那么客户来泥坑小镇存钱,因为我们没办法在回音山谷记录这笔交易,所以用户仍然不能存钱。』

兔小姐:『出现这种情况,我们还是先让客户能存钱吧,等回音山谷系统好了再把相关的交易记录放到那边去,这样不行吗?』

猪爸爸:『当然不可以,兔小姐。因为我们要保证客户金钱的绝对安全。假设客户先在泥坑小镇这边存了钱,回音山谷那边可能因为出现了问题并不知道这笔交易,如果泥坑小镇这边的系统出现了问题,那么用户去回音山谷取钱,就会发现,他在回音山谷的钱还是之前的总额,这样问题就大了。所以,如果只有两个地方有系统,我们必须要保证这两个地方的系统都完全能正常工作,任何一方出现了问题,整个系统就是不可用的。』

兔小姐:『哦,我大概明白了,那我们怎么办?』

猪爸爸:『如果我们要容忍一个地方的银行不能对外提供服务,但客户还是能正常的进行交易,我们至少需要在三个地方部署系统。』

兔小姐:『哦,我有点糊涂了,你能仔细解释下吗,为什么三个就可以呢?』

猪爸爸:『好的,兔小姐。假设现在我们在三个地方有部署好了系统,譬如这三个地方就是泥坑小镇,回音山谷和海盗岛吧。假设一个客户来泥坑小镇存钱,首先,我们会在泥坑小镇记录下这笔交易,然后告诉回音山谷和海盗岛也记录下这次交易,如果回音山谷或者海盗岛有一个回复泥坑小镇这边交易已经被成功记录,我们就可以允许客户在泥坑小镇将钱存到金库了,然后在告诉回音山谷和海盗岛那边可以存入金库了。』

猪爸爸停顿了一下,喝了一口水,接着道:『上面我们说到,只要我们知道有两个地方成功记录下这次交易,我们就可以继续存钱了,即使一个地方出现了问题也不会有问题。譬如,我们知道泥坑小镇和回音山谷成功记录了交易,但海盗岛因为一些问题导致了反馈延迟,但还能正常工作。然后泥坑小镇这边突然出现了问题,不能对外提供服务了,但我们还是能正常对外提供服务,因为我们知道最新的交易信息已经被记录到了回音山谷,我们从回音山谷这边就一定能得到正确的金钱总数。但是,这时候我们仍然只有两个地方能正常工作了,所以如果第二个地方出现了问题,我们仍然不能对外提供服务了。所以,如果我们要容忍两个地方出现问题,但系统仍然能够对外提供服务,我们就需要——』

『我们就需要在五个地方部署服务了,是吧,猪爸爸。』兔小姐直接插话道。

『是的,非常正确,兔小姐。』猪爸爸由衷的赞叹道。

『那么我觉得我们先考虑三个地方吧,容忍一个地方不能工作就可以了,那就在回音山谷和海盗岛那边也建立分部吧。』

『好的,兔小姐,不过其实我有点担心海盗岛那边。。。。。。』

『就这么决定了,猪爸爸』,兔小姐没等猪爸爸说完,就直接做了决定。

好了,说了这么多,还是回到现实中来吧。上面的例子,我们可是假设了金钱能被复制成多份放到不同的金库里面的,但现实银行可不会这么干。为了要设计一个高可用的系统,单点问题是必须要解决的,毕竟如果这个点出现了问题,整个系统就没法服务了。为了解决这个问题,我们需要在多个地方部署系统,但这样就会引入另一个问题,也就是数据一致性的问题。

这里我们来简单说说 CAP,也就是一致性,可用性和分区容忍性。因为在分布式系统里面,P 一定是避免不了的,所以我们无非就是选择 C 或者选择 A 的问题。通常 A 都是能做到 HA,也就是高可用的,所以对于需要完全保证数据安全的系统,我们一定会选择 C。为了保证 C,我们在写入数据的时候,一定会保证至少 quorum 的节点都成功被写入了数据,才会认为这次写入是成功的。 在 Raft 里面,如果一条日志被 quorum 的节点成功接收,那么我们就可以认为这条日志已经被 committed 了。

通常,我们说的 C,其实就是线性一致性,也就是我在某个时间写入了一个值,那么这个时间点之后的任何时间,我们读到的就是这个最新的值,而不可能是老的。在数据写入 quorum 节点之后,我们的读取如果也能够保证在 quorum 节点读取,那么就一定能读到最新的值。这个就是 Amazon 的 Dynamo 做法,但这样就把线性一致性保证的负担落到了读取数据的客户端上面。Raft 采用了另一种简单的做法,我们后续继续说明。

好吧,说了这么多,说了这么多,其实也就提了几个 Raft 的概念。这里稍微总结一下,Raft 使用的是 Log Replication + State Machine 的方式来处理分布式数据的一致性问题,这也是现在的通用做法。对于 Raft 来说,Log 的 ID 一定是加一单调递增的,如果一个 Log 被至少 quorum 个节点接受,我们就可以认为这条日志被 committed 了,然后就可以应用这条 Log,当 Log 被应用之后,改 Log 就是 applied 了。后面,我们将开始讨论 Raft 的 Leader 了。

steam里的一款游戏《raft》 我在网吧玩保存后,换台机子,然后保存的进度,都没有了,该怎么办???

网吧的电脑基本都不能保存游戏进度,因为网吧电脑只要重启,之前这台电脑使用的痕迹就会全部被自动清空。你自己找网吧管理员吧,不过这种事情管理员一般是不会理你的。

上一篇:云服务器节点(云服务器节点转发)
下一篇:阿里云发送邮件(阿里云 发送邮件)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~