乱序日志同步成员变更方案

尝试着论证下使用阻塞日志场景下,成员变更的正确性(支持变更少数派个成员,不能同时进行上线和下线两个操作):

1)备机slave收到[Cold,Cnew]的确认条件是要求之前的日志都已经收到,这样保证如果[Cold, Cnew]日志得到Cold, Cnew两个集群的多数派应答,那么[Cold, Cnew]之前的日志都已经在Cnew上形成了多数派;

2)[Cold, Cnew]和[Cnew]两条日志都是阻塞日志,即集群工作状态所有的成员变更日志都是阻塞日志。这里阻塞日志的概念和日照邮件中指出的是一致的,即备机对收到的比[Cold, Cnew](或[Cnew]) logID大的日志的确认条件是,备机已收到[Cold, Cnew](或[Cnew])日志,如果未收到成员变更日志,备机不会对后续的日志做确认(可以先缓存起来,避免再向主机要)。阻塞日志的实现见后,这样保证了[Cold, Cnew]之前,[Cold, Cnew]到[Cnew]之间,[Cnew]之后三个区间的日志对集群的认知都是一致的,其取得多数派的条件也是一致的,不会出现不同server在宕机重启恢复时,对不同日志所处集群认知不一致的情况。 这样就和raft的成员变更阶段保持一致了。

3)阻塞日志的实现: 每条日志都有一个专门的状态,我们称作为mc_term (membership change term),这个值初始是0,leader在发送每个成员变更日志时递增这个mc_term的值,在后续的日志中都带新值。 备机会在本地的内存中缓存这个值,备机收到每条日志都会检查这个值和自己保存的值,如果收到的值比保存的值大,表示这个日志之前有副本变更日志没有收到,则不会对此日志做确认。备机会在收到成员变更日志并落盘,且成员变更日志和本地保存的mc_term值只差一(避免收到的成员变更日志不连续)会更新本地缓存的这个mc_term值。由于备机写到磁盘的日志都是可以被确认的,宕机恢复时,server只需要检查自己保存的logid最大的日志即可获知恢复后这个值是多少,无需再额外保存副本变更日志做处理;

4)选举条件保持和raft一致,取最后一条logid的termID和logID。

5)副本变更日志为阻塞日志不会影响可用性,会稍微影响乱序的性能(实际上只在[Cold,Cnew]和[Cnew]这两个点后续的日志要求一定的顺序性),leader仍是要求收到每一条的多数派即可提交。每个server(无论主备)保存的成员变更日志都是全的。

6)在投票时要求核对选举组,及[Cold]可以给[Cold]/[Cold,Cnew]投票,[Cold, Cnew]可以给[Cold,Cnew]/[Cnew]投票,反之不成立。这实际上一方面保证选举组有效,另一方面保证选出的leader都在更新的选举组里。对应到实现上,及一台Server只给比自己mc_term大于等于的server投票,不会给比自己mc_term小的server投票。

阻塞日志的概念同样适用于freeze和checkpoint的实现。

时间: 2024-10-15 20:30:10

乱序日志同步成员变更方案的相关文章

日志同步工具

我们怎么去做日志同步呢? 方案一:在Log4j的体系中有个东西叫做LoggerFilter,这个类的工具是用来做日志过滤,每次我们打印日志的时候都会经过这个filter,来决定是否打印日志.比如: public int decide(LoggingEvent event) { if(this.levelMin != null) { if (event.getLevel().isGreaterOrEqual(levelMin) == false) { // level of event is le

RAFT中成员变更过程以及失败回滚分析

RAFT提供了一个颇具实践意义的分布式一致性协议的工程实现模板,具有很高的知名度.其大部分设计和viewstamp基本类似,而系统成员变更这一部分可以算作其真正的原创工作,但这一部分相比于论文其他部分,确实讲解最不详细的地方,最近在设计OCEANBASE的分布式系统,涉及到了成员变更的问题,仔细分析了RAFT的成员变更做法,和大家分享一下. 成员变更指的是系统成员变化,即server的上下线,这和由于宕机故障导致的上下线是不同的.宕机或者重启导致的上下线,是不会影响系统的注册的成员数量的,也就不

IOCP 乱序

         关于IOCP乱序的探讨                   2011-07-14 10:55:49 标签:职场 休闲 IOCP乱序 关于IOCP的探讨 本文主要探讨一下windows平台上的完成端口开发及其与之相关的几个重要的技术概念,这些概念都是与基于IOCP的开发密切相关的,对开发人员来讲,又不得不给予足够重视的几个概念: 1) 基于IOCP实现的服务吞吐量 2)IOCP模式下的线程切换 3)基于IOCP实现的消息的乱序问题. 一.IOCP简介     提到IOCP,大家都

10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). 关于中位数:数据排序后,位置在最中间的数值.即将数据分成两部分,一部分大于该数值,一部分小于该数值.中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了). 分析:明显是一道工

在一个文件中有10G个整数,乱序排列,要求找出中位数

 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). 关于中位数:数据排序后,位置在最中间的数值.即将数据分成两部分,一部分大于该数值,一部分小于该数值.中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了). 分析:明显是一道

C语言结构体声明中冒号的使用(占位符) & C结构体的乱序初始化

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示.一.位 域的定义和位域变量的说明位域定义与

Android ListView异步加载图片乱序问题,原因分析及解决方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不

关于使用map存放数据乱序”问题“

今天做项目中遇到了一个比较低级的错误,如果没注意将会变的更麻烦... 其实吧,也不难,要求就是将list中的值转为map后,再顺序输出map中的值,list的顺序怎样,加入到map的顺序也应怎样,不能乱序! 一开始做之前没注意那么多,习惯性使用 1 Map<String,Object> jsonMap = new HashMap<>(); 这样做之后的结果可想而知,虽然说查询数据快,但数据肯定是乱序的,毕竟它是根据hashcode码来排序, 之后使用TreeMap,但依然没有得到想

linux云自动化运维基础知识10(日志同步和时间同步)

####1.系统日志默认分类#### /var/log/messages    ##系统服务及日志,包括服务的信息,报错等等/var/log/secure        ##系统认证信息日志/var/log/maillog    ##系统邮件服务信息/var/log/cron        ##系统定时任务信息/var/log/boot.log    ##系统启动信息 ####2.日志管理服务rsyslog#### 1.rsyslog负责采集日志和分类存放日志2.rsyslog日志分类vim /