分布式系统中,每个节点都要将自己收到的请求发送给其他节点,其他节点再执行相同的操作,从而保证数据的一致性.但是由于时钟不同步,网络不可靠,节点崩溃等因素会导致数据的不一致.
例如,A向 C发送a=a*2,B向C发送a=a+1;当a=0时,若A指令先到达,a最终是1,当b指令先到达,a最终是2.
CAP理论分布式系统有一个著名的CAP理论.
C-----consistency:一致性性,所有节点的数据保持一致
A------avalability:可用性,系统是可用的
P------partitiion tolerance:当由于网络的原因导致系统中各个分区的信息不同,不同的分区仍然可以访问到数据.
一般来讲,分区容错性是必须要保证的,所以必须在一致性和可用性中放弃一个.
SpringCloud中eureka保证的是可用性,每个eureka节点都是平等的
zookeeper,redis保证的是一致性,当集群无法达到数据一致时就停止服务.
Raft算法Raft算法就是实现的强一致性.在raft算法中会选出一个leader节点,其余节点都是follower节点,leader节点负责执行写命令,然后再发送给follower节点.
Raft算法将一致性问题转为3个子问题:
- 领导选举:leader下线或集群启动需要选举一个新的leader(过半机制)
- 日志复制:leader将请求记录到日志中,并广播给其他节点
- 数据安全:如果日志已经被集群提交,那么该日志就不能被覆盖或修改.



