一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
1. ETCD-Raft 模块如何实现分布式一致性
1.1 Raft介绍以及接口
在分布式环境中,常用数据复制来避免单点故障,实现多副本,提高服务的高可用性以及系统的吞吐量。
ETCD-Raft对外提供的接口有
- Tick:时钟,触发选举或者发送心跳
- Propose:通过channel向raft StateMachine提交一个Op,提交的是本地MsgProp类型的消息
- Step:节点收到Peer节点发送的Msg时,会通过该接口提供给raft状态机,Step接口通过 recvc channel 向 raft StateMachine 传递Msg
1.2 节点状态
- Candidate:候选人状态,该状态意味着将进行一次新的选举
- Follower:跟随者状态,该状态意味着选举结束
- Leader:领导者状态,选举出来的节点,所有数据必须先提交到Leader上
raft一致性算法实现的关键有Leader选举、日志复制和安全性限制
1.3 选举
第一步是选举Leader,只有在Candidate或是Follower状态下的节点才有可能发起一个选举流程。
- 节点启动时,都以Follower启动,同时随机生成自己的选举超时时间。
- 在Follower的tickElection函数中,当选举超时,节点向自己发送MsgHup消息。就是这次选举并没有产生Leader。
- 在状态机函数raft.Step函数中,收到MsgHup消息之后,节点首先判断当前有没有apply的配置变成消息,如果有就忽略该消息。
- 否则进入campaign函数中进行选举:首先将任期号增加1,然后广播给其他节点选举消息,带上其他字段,包括:节点当前的最后一条日志索引,最后一条日志对应的任期号,选举任期号,Context字段。
- 如果在一个选举超时期间内,发起新的选举流程的节点,得到了超过半数的节点投票,那么状态就切换到Leader状态。
2. MVCC 多版本并发控制
2.1 MVCC 简介
并发控制机制用作对并发操作进行正确调度,保证事务的隔离性,数据库的一致性。
- 悲观锁:一种排他锁,事务在操作数据时把这部分数据锁定,直接操作完毕后再解锁这种方式容易造成系统吞吐量和性能方面的损失
- 乐观锁:在提交操作时检查是否违发数据完整性,大多数基于版本机制实现,MVCC就是一种乐观锁
2.2 BoltDB
基于 B 树的KV 存储数据库