1,将数据存储在集群中的高可用的K-V存储
2,允许应用实时监听存储中的K-V变化
3,能够容忍单点故障 能够应对网络分区
原理:
上图5个节点的集群
2N+1 5个节点的集群大多数是N+1 3个节点 只要有3个节点能被赋值,那么这个日志就能被提交,不会被丢失
1-7日志是成功被提交的日志,8是失败的
上图由7个节点组成的raft节点 大多数为zn+1=7 n+1=4大多数为4
1,第一任村长为f节点而且成功赋值给了其它节点,接着down机了,然后马上重启,因为leader重启了,所以重新选举
a-f看谁运气好了,每个节点都有3个编码为1的日志,任一节点都可能成为leader,
2,从图可以看出f运气比较好第二次又被选为村长了
此时f得到3编码为2的3条日志但是马上又挂掉了,接着又重启收到编码为3的5条日志又挂了
此时f节点虽然日志多 但是成功提交的和其它节点是一样的多 编码为1的 2 ,3 没有成功提交
3,编码为4的日志可以看出e为编码为4的节点,而且成功复制了2条日志给其它节点,此时e又down机了
。。。。。。。。。。。。不一一分析了。。。。。有兴趣的可以继续分析。。。。
总结:
leader在down机重启后发现 已经有了新的leader 此时会拉取到新的数据发现 该数据是大多数节点认可的,就会覆盖本地的
实战任务:
*搭建单机etcd 熟悉命令行操作
*golang调用etcd的put/get/delete/lease/watch
*使用txn事务功能 实现分布式乐观锁