在做HIS研发工作的时候一直想完善其数据组件,想做一个分布式的数据库支持系统。
但一直以来都不清楚这个选举算法应怎么做,原来有一个叫raft的算法
https://www.cnblogs.com/justinli/p/raft.html
摘抄结尾处的数据安全的说明
四、安全性
下面通过分析一种情行来看Raft是如何保证日志复制的安全性的。
在a这个时间点,S1为Leader,进入b时间点后,复制日志索引2位置日志到S2,这时如果S1挂了,S5被选举为Leader(通过S3,S4,S5的选票)。从客户端接收了不一样的日志条目存放在索引2位置,进入到阶段C,这时S5挂掉,S1已经恢复了,S1重新被选举为Leader(通过S1,S2,S3),并复制任期2阶段的日志条目到大多数结点且未提交,这时S1挂了,s5重新被选举为leader,进入阶段d,并将自己任期内的日志条目复制到集群中其他结点,并覆盖了索引2处的日志。反之,如果在崩溃之前,S1 把自己主导的新任期里产生的日志条目复制到了大多数机器上,就如 (e) 中那样,那么在后面任期里面这些新的日志条目就会被提交(因为S5 就不可能选举成功)。 这样在同一时刻就同时保证了,之前的所有老的日志条目就会被提交。
为了消除上图中描述的情况,Raft 永远不会通过计算副本数目的方式去提交一个之前任期内的日志条目。只有*当前任期里的日志条目通过计算副本数目可以被提交;一旦当前任期的日志条目以这种方式被提交,那么由于日志匹配特性,之前的日志条目也都会被间接的提交。即在日志复制的过程中,会从当前*当前的任期的日志条目开始复制直到最近一次提交的日志条目处。这样能够保证旧的任期的日志不会被更新的任期的日志条目所覆盖。
参考:https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf