TiKV 与 Raft
- TiKV 简介
- Raft 协议
1. TiKV 简介
TiKV 是一个分布式事务型的键值数据库,提供了满足 ACID 约束的分布式事务接口,并且通过 Raft 协议保证了多副本数据一致性以及高可用。TiKV 作为 TiDB 的存储层,为用户写入 TiDB 的数据提供了持久化以及读写服务,同时还存储了 TiDB 的统计信息数据。
1.1 ACID
是数据库事务正确执行的四个基本要素。它们分别指:
- 原子性(atomicity)
- 一致性(consistency)
- 隔离性(isolation)
- 持久性(durability)
1.2 什么是 Raft 协议?
Raft 协议是一种分布式一致性协议,相对 Paxos 协议,他更好理解。Paxos 也是一种一致性协议,它可以说是一致性协议研究的起点,也以难以理解闻名。后文将会对其进行细致的学习。
1.3 什么是 TiDB ?
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品。具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。
1.4 什么是分布式分布式数据库?
分布式数据库(DDB)的定义是:数据分布在计算机网络的不同计算机上,网络中的每个结点具有独立处理的能力,同时,每个结点也能通过网络通信子系统执行全局应用。负责分布式数据库管理的软件,称为分布式数据库管理系统(DDBMS)其中,每个节点都有自己的操作系统。
2. Raft 协议
一致性协议包括:两阶段协议协议、三阶段提交协议、Paxos协议、Raft协议等,先学习 RITF 协议。
2.1 分布一致性
在单节点数据库系统中,从客户端写入一个值到服务器,只需要写入一个节点就可以了,很简单的实现了一致性。但是,企业常常采用多节点系统,如何在多系统间通信存在延迟的情况下保持一致性呢?就需要采用分布一致性协议。
2.2 Leader 选举过程
Raft是分布式一致性的实现协议,那它是如何工作的呢?
Raft 定义了一个节点的3种状态:
- Follower state
- Candidate state
- Leader state
一开始,所有的节点都是Follower状态,我们称这些节点为Follower(跟随者)。当所有的Follower都无法感知到Leader的存在时,他们会变成candidate(参选者),candidate向其他节点发起投票,其他节点反馈投票的结果,即是否同意。如果投票获得大部分同意,则该candidate会成为leader。
如果选举可能出现多个Leader,则本次选举失效,进行下一轮选举。选举失效的检测很简单,因为它们不可能同时满足大多数原则(vote count> == n/2+1)。
2.3 随即选举超时
如何确保在有限的时间内确定出Leader呢?Raft提出了随即选举超时方法。这使得每个sever的timeout不同(150ms到300ms之间),这使得每一个sever不是同时开始的新一轮选举,使得新一轮选举会很快选出Leader。
2.4 日志复制
Leader选出来之后,任何改变都需要通过Leader来传达。日志复制过程是:
每一次变更都会作为一个entry加入到Leader节点日志中,这时entry的状态是未提交状态(uncommitted),所以这并不会改变节点的当前值。为了能够提交entry:
- Leader将entry复制到所有Follower节点
- leader开始等待直到大多数节点都写入成功了entry为止
- leader提交entry,节点值发生变更。
- leader通知所有Follower entry is committed
- 最后所有节点都达到了一致的状态
2.5 心跳检测
当一个节点成为leader后,会间隔指定时间发送 Append Entries 消息给他的Follower,间隔时间是由心跳超时控制的(heartbeat timeout,即第二种超时类型),follower收到消息后会重置等待时间,目的是阻止Follower成为candidate。
这个过程会一直持续下去,直到一个Follower停止接收heatbeats,并且成为candidate为止。
2.6 网络分区下的一致性
Raft 协议的优秀之处在于网络分区(比如节点部署在不同机房,不同网段)下仍然可以确保节点数据一致。这是如何实现的呢?
假设有5个节点(abcde)组成的网络,a、b位于一个机房,c、d、e位于一个机房,此时的Leader是a节点。由于网络故障造成2个机房节点通信失败,位于一个机房的c、d、e发现Leader心跳不再了,则发起选举过程,设节点c获得了多数选票成为了新的Leader,此时5个节点会同时存在2 Leader(a、c)。
此时,一个客户端尝试修改a的值。由于节点a无法与c、d、e通信,在做日志复制时无法得到大多数的应答,那么这条entry将一直是uncommited状态。但是,一个客户端尝试修改节点c的值却可以获得大多数的应答,所以这次操作entry可以正常提交。
当网络故障被修复,节点a、b都会广播心跳并携带,此时节点a发现了更高的election term,则将自己降级为follower,且a、b同时需要回滚他们未提交的entry,并且匹配new Leader日志。