【TiDB理论知识 05】TiKV-Raft协议

2024-03-20 01:10

本文主要是介绍【TiDB理论知识 05】TiKV-Raft协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一 概念

二 raft共识算法对于TiKV的几个重要功能

1 Raft日志复制

1 Raft日志复制流程

2 名词解释

分层次理解TIKV

2 Raft Leader选举

集群初始状态时Leader选举流程

数据正在复制时Leader选举流程

初始化时的特殊情况

raft 参数与Tidb 参数对应关系


一 概念

leader  :数据在TiKV中是以region为单位存储的,每个region默认有三个副本,其中一个副本的角色为leader,所有客户端的读写流量都是走leader的,follower是不参加读写的,leader会周期性的向follower发出心跳通知信息,同时也会把自己写的数据以日志的方式传递给其他follower

follower:被管理者,对其他服务作出相应,同时接受leader的日志并进行复制,如果长时间接收不到leader的通知信息,follower的角色就会转变为candidate(候选者),候选者会发起投票,告诉大家,leader不在了 ,你们要选我。candidate是由follower转变而来 ,转变的前提是leader长时间没有通知信息了

TiDB写数据的只写leader ,然后通过日志的方式,向其他follower进行复制。

数据在region中的存储region是一个逻辑概念,是键值对的集合,region中是以key的排序的。region 中存储的kv达到96M后,会写下一个region。初始的region中的key连续的,region是一个左闭右开的区间。当region的大小达到144M之后,就会发生分裂split。当对region的数据进行大量删除时,region的大小过小时(可以自己设定这个值),也可以进行合并

raft group:多个region 构成raft goup

multi raft :多个raft group构成multi raft

region中key数量过多的性能问题

当region的数量太多时,比如一个TiKV node中超过5w个region时 ,随之而来的就是管理成本很高,因为每个region需要定期的向PD进心跳的汇报。

二 raft共识算法对于TiKV的几个重要功能

1 Raft日志复制

1 Raft日志复制流程

当客户端TiDB  server需要写入数据时,会把数据发送给TiKV中某个region 的leader角色,

第一步是 propose,会把写入请求转换为写入日志 Raft log。Raft log的格式:region号_日志序号.log,例如4_2.log { put key=3,name = nico}, 通过raft log的这种格式,可以明确确认操作的region以及日志的先后顺序。

第二步是 append, 然后就把raft log 存储在leader本地的Rocksdb中,进行持久化

第三步是 replicate,通过raft算法将日志发送给其他follower ,follower收到日志后也会持久化到本地RocksDB中,然后follower会返回append成功的消息,当大多数follower返回消息后,leader就会认为这条日志持久化成功,leader就会就行committed

每个TiKV node 中有两个RocksDB   一个存储KV 一个存储Raft log。

2 名词解释

通过名词再次理解

Propose:当客户端比如TIDB server,或者你自己开发的可以写入TiKV的客户端,写入的是一条日志Raft log

Append:Propose之后接收到Raft log,leader将Raft log持久化到rocksdb。目前之后leader的Raft log持久化了。

Repicate:将Leader的raft log复制到其他的副本所在的节点上。其他副本接受到日志后进行append

Committed: 超过半数的节点进行了append 并返回消息给follower ,就可以进行这条Raft log 进行了持久化不会丢失。这里的Committed是指的是raft log的Committed。这里的Committed不是事务中的,现在用户还是看不到这次日志所涉及的数据的修改。

Apply :将Raft log 转换 并写到 RocksDB  KV中

分层次理解TIKV

为了实现持久化 :使用了开源单机数据存储引擎Rocksdb,可以理解为一个巨大的key-value map。

为了实现数据高可用,避免单机故障:持久化之后要做数据多副本,数据多副本的一致性算法使用Raft 协议。

为了实现存储水平扩展:引入了Region

为了提高系统并发 写不阻塞读:引入MVCC层 ,数据多版本。

为了实现事务:引入Tranaction层

2 Raft Leader选举

Raft 共识算法中term:

term:时间时期的概念,官方定义 将时间分为一小段,每个Termd的长度不确定,他代表一段稳定的关系.举个例子:每个term就是一个恋爱关系,A和B 关系很好很稳定,这个term的长度就很长,如果A和B关系破裂了,A就进入下一个term。

集群初始状态时Leader选举流程

集群在刚开始创建的时候,没有leader ,每个region都是follower 。

每个region有个计时器 叫做 election timeout,假设为10秒,当超过这个时间,没有收到leader的心跳信息,就会认为集群中没有leader,那么这时候某个follower率先突破了election timeout这个时间(一般是150ms -300ms),要打破这种没有leader的关系。自己的角色转换为candidate,term 也加1。

然后想其他的follow发送投票的请求,其他的follower的term 比较小,会投票给term大。这样就产生了leader,进入下一段关系。

数据正在复制时Leader选举流程

此时的raft group中的region处于一种稳定的复制关系中 ,突然出现了宕机或者网络中断。当follower 超过某个时间没有收到leader的心跳信息时 ,这个时间为heartbeat time interval,就会认为leader挂了,然后就要起义,角色变为candidate,同时term +1 ,然后发起选举 ,term 小的会投投票给term比较大的region。

初始化时的特殊情况

多个region 都成为了candidate ,系统会重新发起投票,直到产生leader ,但是也有可能出现多次投票的状况,为了解决这个问题 Raft 共识算法引入了参数 random  election timeout ,指定一个范围,比如100ms ~ 300ms ,这样大家都成为candidate的概率会降低很多。

raft 参数与Tidb 参数对应关系

ticks 代表多少个raft-base-tick-interval参数设置时间单位

Election timeout  对应   raft-election-time-ticks * raft-base-tick-interval

Heartbeat time interval  对应 raft-heartbead-ticks * raft-base-tick-interval 

raft-base-tick-interval  默认是1秒 raft-election-time-ticks = 5 ,则Election timeout 为5秒

参考

三篇文章了解 TiDB 技术内幕 - 说存储 | PingCAP

这篇关于【TiDB理论知识 05】TiKV-Raft协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827808

相关文章

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

DNS协议基础笔记

1.定义 DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 2.域名解析过程 当用户在浏览器中输入一个域名,浏览器首先会检查自己的缓存中是否有该域名对应的 IP 地址。本地 DNS 服务器收到查询请求后,首先会检查自己的缓存中是否有该域名对应的 IP 地址。根域名服务器收到查询请

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

HTTP协议 HTTPS协议 MQTT协议介绍

目录 一.HTTP协议 1. HTTP 协议介绍 基本介绍: 协议:  注意: 2. HTTP 协议的工作过程 基础术语: 客户端: 主动发起网络请求的一端 服务器: 被动接收网络请求的一端 请求: 客户端给服务器发送的数据 响应: 服务器给客户端返回的数据 HTTP 协议的重要特点: 一发一收,一问一答 注意: 网络编程中,除了一发一收之外,还有其它的模式 二.HTT

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g++ 编译2.5 运行可执行文件 GCC编译器 GCC(GNU Compiler Collection)是一个开源编译器集