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

这篇具有很好参考价值的文章主要介绍了【TiDB理论知识 05】TiKV-Raft协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一 概念

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

1 Raft日志复制

1 Raft日志复制流程

2 名词解释

分层次理解TIKV

2 Raft Leader选举

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

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

初始化时的特殊情况

raft 参数与Tidb 参数对应关系


一 概念

【TiDB理论知识 05】TiKV-Raft协议,TiDB,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日志复制

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

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 名词解释

通过名词再次理解

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

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

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

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

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

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

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

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选举流程

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

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

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

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

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

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

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

初始化时的特殊情况

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

多个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文章来源地址https://www.toymoban.com/news/detail-581054.html

到了这里,关于【TiDB理论知识 05】TiKV-Raft协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TiDB(6):数据迁移-TiDB Lightning

    1 TiDB Lightning介绍 TiDB Lightning 是一个将全量数据高速导入到 TiDB 集群的工具,目前支持 Mydumper 或 CSV 输出格式的数据源。你可以在以下两种场景下使用 Lightning: 迅速导入大量新数据。 备份恢复所有数据。 TiDB Lightning 主要包含两个部分: (1)tidb-lightning(“前端”):主要完

    2024年02月13日
    浏览(66)
  • TiDB实战篇-TiDB Lightning 导入数据

    使用TiDB Lightning 导入数据。 它是使用物理导入的模式,将SQL文件直接导入到TiKV中,它是一种初始化的导入,也就是说目标的数据库和表都是不能够存在的(注意事项,在这种方式导入的时候TiKV要切换到导入模式才行) 。      先导入数据,然后在导入索性。   Logical Impo

    2024年02月04日
    浏览(44)
  • TiDB(4):TiDB-SQL操作

    1 创建、查看和删除数据库 (1)要创建一个名为 samp_db 的数据库,可使用以下语句: (2)使用 SHOW DATABASES 语句查看数据库: (3)使用 DROP DATABASE 语句删除数据库,例如: (4)再次查看数据库: 2 创建、查看和删除表 (1)先创建一个库 (2)使用 SHOW TABLES 语句查看数据库

    2024年02月12日
    浏览(45)
  • TIDB简介及TIDB部署、原理和使用介绍

    数据库分类 ​ 介绍TiDB数据库之前,先引入使用场景。如今的数据库种类繁多,RDBMS(关系型数据库)、NoSQL(Not Only SQL)、NewSQL,在数据库领域均有一席之地,可谓百家争鸣之势。那么我们为什么要学习使用TiDB呢?接下来就从我们最熟悉的MySQL的使用说起。 MySQL痛点 ​ 假设

    2023年04月20日
    浏览(32)
  • TiDB 源码编译之 PD/TiDB Dashboard 篇

    作者: ShawnYan 原文来源: https://tidb.net/blog/a16b1d46 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时

    2024年02月14日
    浏览(43)
  • BenchmarkSQL 支持 TiDB 驱动以及 tidb-loadbalance

    作者: GangShen 原文来源: https://tidb.net/blog/3c274180 TiDB-JDBC **是基于 MySQL 8.0.29 的定制版本。TiDB-JDBC 基于 MySQL 官方 8.0.29 版本编译,修复了原 JDBC 在 prepare 模式下多参数、多字段 EOF 的错误,并新增 TiCDC snapshot 自动维护和 SM3 认证插件等功能。 tidb-loadbalance 是应用端的负载均衡

    2024年02月14日
    浏览(41)
  • TiDB 应急运维脚本,更加方便的管理TiDB集群

    TiDB 应急运维脚本,更加方便的管理TiDB集群 使用方法 修改权限 使用示例

    2024年02月12日
    浏览(48)
  • [tidb] tiup升级tidb的版本到 v7.1.1

    为了避免数据丢失,升级前需要备份当前tidb集群的数据,参考 TiDB 备份与恢复概述 | PingCAP 文档中心 说明 由于新版本的tidb的tiflash需要cpui支持avx2,所有升级前先验证当前升级的服务器是否支持avx2。升级的文档可以参考 使用 TiUP 升级 TiDB | PingCAP 文档中心 ### 验证cpu是否支持

    2024年02月13日
    浏览(38)
  • tidb流式读取配置

    程序中执行会话变量(显示数据速度):--后是tidb默认值。 配合流式读取,作如下读取速度限制, 限制fullscanindex速度: 以下是在java中的示例,com.adata.common.tidb.read.是java包类名: com.adata.common.tidb.read.tidb_distsql_scan_concurrency=1; --15 com.adata.common.tidb.read.tidb_init_chunk_size=8; --32 com.a

    2024年02月21日
    浏览(36)
  • tidb之旅——生成列

    作者: 有猫万事足 原文来源: https://tidb.net/blog/15d0fbf6 之前弄好了TiDB集群,也弄好了dm集群,把写入流量整个切入了TiDB集群运行起来了。但是有个别比较大的日志表,OLAP查询的表现还是不太行。正好7.1版本发布了,我看到tiflash支持存算分离且可以把数据放在s3上——没错,

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包