为什么说TiDB在线扩容对业务几乎没有影响

news2024/10/6 12:21:54

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/e82b2c5f

当前的数据库种类繁多,墨天轮当前统计的所有国产数据库已经有 290个 ,其中属于关系型数据库的有 166个 。关系型数据库从部署架构上又可以分为集中式(典型代表为达梦DM8、金仓KES)、分库分表(典型代表为中兴GoldenDB、腾讯TDSQL)以及原生分布式架构(典型代表为PingCAP TiDB、阿里OceanBase)。

昨天和别人交流PingCAP TiDB时,这位同学对“**TiDB在线扩容对业务几乎没有影响”**这一点表示不太理解,惊讶TiDB到底是怎么做到的。。细聊下来,发现这位同学是一位主要负责集中式和早期分布式架构数据库的DBA人员,比较熟悉Oracle、Greenplum。于是我有点理解他的惊讶了,因为Oracle和Greenplum我也是有一点点经验,本文简单针对一般分布式数据库和TiDB在扩容机制上谈一点个人的理解。

一. 一般分布式数据库在线扩容是怎么做的?

集中式数据库因为其架构本身的限制,一般来说想要实现在线扩容是比较困难的,这里暂且不予讨论,我们主要了解一下一般分布式数据库的扩容是如何进行的。不管是Greenplum这种MPP数据库,还是其它的分库分表数据库,为了实现数据的均衡分布,通常需要在表上定义相关的分布键。通过分布键,再结合哈希算法,可以把数据哈希散列到不同的数据节点中,类似于 hash(key)% N(key代表分布键,N代表数据节点编号) 。举个例子,假如一个分布式数据库有3个数据节点,表的分布键为ID(ID是一个递增序列),那么基于哈希算法散列后数据的分布大致如下图所示:

image.png

现在我们需要扩容一个节点,从原来的3节点扩容到4节点。为了保证原来哈希散列结果的一致性数据需要重新平衡,平衡后的数据分布应该如下面图中所示。可以发现,这个时候大部分的数据基本都搬迁了一遍。先不说数据的迁移是否对业务造成阻塞,光是这现有的大面积数据均衡足以导致整个系统的IO消耗极高, 严重影响整个系统的可用性

image.png

Greenplum在官方文档中还明确指出“ 正在被重新分布的表或者分区会被锁定并且不可读写。 当其重新分布完成后,常规操作才会继续。 ”可以明确的说,Greenplum早期版本里面根本就不支持所谓的“**在线”**扩容。

时代在进步,数据库技术也在进步。为了尽可能实现在线扩容的能力,Greenplum数据库包括其他的分库分表数据库开始引入一些新的算法来优化此事。 一致性哈希算法 开始被普遍应用,它与传统哈希算法最主要的不同是 不再使用节点编号来进行散列 ,而是使用2^32这样一个固定值做取模运算。一致性哈希算法将表中的数据和节点编号映射到一个圆环上,当增加节点时影响的数据范围只是圆环上的一小段数据范围。比如下图中增加节点4,影响的数据只有节点1到节点4之间的这部分数据。

image.png

一致性哈希算法解决了数据重分布时大量数据搬迁的问题,减少了数据搬迁时的网络IO和磁盘IO。不过要真正实现不影响业务,还需要改进数据重分布内部的机制,比如 重分布时锁表等 问题。

二. TiDB的扩容是怎么做的以及为什么它几乎不影响业务?

TiDB的扩容机制离不开TiDB整体的架构实现。作为一个存算分离的原生分布式架构,TiDB集群主要由三大模块构成:用于集群元数据管理及集群调度的PD、用于接收外部请求并解析编译执行SQL的计算引擎TiDB Server以及用于数据存储以及多副本数据一致性保证的存储引擎TiKV/TiFlash。

image.png

基于存算分离的架构,TiDB可以单独进行计算层扩容和存储层扩容。计算层的扩容相对简单,因为TiDB Server本身是 无状态 的。TiDB Server节点 不持久化数据 ,每个节点也是 完全对等 的,当TiDB Server计算资源不够了,只需要增加TiDB Server节点,然后修改上层的负载均衡组件将客户端连接均衡分发到新的TiDB Server节点即可(目前大多数负载均衡组件都支持动态修改配置)。因此, 计算节点的扩容完全不会影响现有的业务。

image.png

针对存储节点,TiKV的扩容与一般分布式数据库的扩容机制是完全不同的,这主要因为TiKV是一种 基于Multi Raft协议的分布式存储引擎 ,而不是像Greenplum或分库分表那种底层是多个MySQL或PG的单机数据库。

假如某集群要从3个TiKV节点扩容到4个TiKV节点,扩容步骤大致可以概括如下:

1. **扩容TiKV节点。**集群增加一个TiKV 4节点,此时TiKV 4上没有任何Region。PD节点识别到新的TiKV节点启动负载调度机制,计算哪些Region需要迁移到TiKV4。

image.png

2. **调度算法确定迁移Region。**PD节点根据调度机制,确定将哪些Region副本迁移到TiKV 4上(假如开始3个节点上各有6个Region,平均到4个节点后每个节点的Region数为18/4=4~5个副本)。PD对TiKV1~3上Region对应的Leader副本发起复制指令。

image.png

**3. 复制Region到新节点。**在TiKV上创建要复制的Region的副本,通过Raft机制开始复制数据。此过程中应用读写访问不受影响,不过因复制过程产生的IO消耗可能会对性能产生一点影响,不过TiDB本身提供了流控,可以动态调整复制的速度。

image.png

**4. 删除多余Region。**Region复制完成且数据一致后,PD将发起删除原有副本指令,保证每个Region的副本只有3个。

image.png

**5. Leader重新均衡。**PD根据调度机制,需要均衡Leader副本,将一部分Region的Leader切换到新增节点TiKV 4上,保证Leader的均衡。Leader切换完成后,读写业务将自动路由到TiKV 4上实现业务负载均衡。

image.png

上述步骤简单理解下来就是说,TiKV的扩容是一种 先生成副本再迁移Leader 的一个过程,扩容对业务有影响的地方主要在于生成副本产生的IO消耗以及Leader切换的影响。对于前者,数据库有流控机制可以保证对业务几乎没有影响;对于后者,一方面Leader的切换本身时间非常短,另一方面当TiDB意识到Region迁移后也能够通过内部重试保证前端业务的正常执行。因此, 存储节点的扩容也几乎不会影响现有的业务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI克隆自己的声音只需5秒,MockingBird实现AI克隆声音!

一、环境搭建 搭建Anaconda运行环境 搭建Anaconda运行环境请跳转链接查看https://blog.csdn.net/m0_50269929/article/details/136036402安装pytorch pip3 install torch torchvision torchaudio安装ffmpeg 打开官网 https://ffmpeg.org/download.html#get-packages 下载地址…

Python实现PDF到HTML的转换

PDF文件是共享和分发文档的常用选择,但提取和再利用PDF文件中的内容可能会非常麻烦。而利用Python将PDF文件转换为HTML是解决此问题的理想方案之一,这样做可以增强文档可访问性,使文档可搜索,同时增强文档在不同场景中的实用性。此…

InnoDB 锁系统(小白入门)

1995年 ,MySQL 1.0发布,仅供内部使用! 开发多用户、数据库驱动的应用时,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另一方面还要确保每个用户能以一致性的方式读取和修改数据。 MVCC 并发…

list基本使用

list基本使用 构造迭代器容量访问修改 list容器底层是带头双向链表结构&#xff0c;可以在常数范围内在任意位置进行输入和删除&#xff0c;但不支持任意位置的随机访问&#xff08;如不支持[ ]下标访问&#xff09;&#xff0c;下面介绍list容器的基本使用接口。 template <…

CSS-IN-JS

CSS-IN-JS 为什么会有CSS-IN-JS CSS-IN-JS是web项目中将CSS代码捆绑在JavaScript代码中的解决方案。 这种方案旨在解决CSS的局限性&#xff0c;例如缺乏动态功能&#xff0c;作用域和可移植性。 CSS-IN-JS介绍 1&#xff1a;CSS-IN-JS方案的优点&#xff1a; 让css代码拥…

探索数据可视化:Matplotlib在Python中的高效应用

探索数据可视化&#xff1a;Matplotlib在Python中的高效应用 引言Matplotlib基础安装和配置Matplotlib基础概念绘制简单图表线形图散点图柱状图 图表定制和美化修改颜色、线型和标记添加标题、图例和标签使用样式表和自定义样式 高级图表类型绘制高级图表多图布局和复杂布局交互…

ES6中新增Array.of()函数的用法详解

new Array()方法 ES6为Array增加了of函数用一种明确的含义将一个或多个值转换成数组。因为用new Array()构造数组的时候&#xff0c;是有二意性的。 构造时&#xff0c;传一个参数&#xff0c;实际上是指定数组的长度&#xff0c;表示生成多大的数组。 构造时&#xff0c;传…

SpringbootV2.6整合Knife4j 3.0.3 问题记录

参考 https://juejin.cn/post/7249173717749940284 近期由于升级到springboot2.6X&#xff0c;所以服务端很多组件都需要重新导入以及解决依赖问题。 下面就是一个很经典的问题了&#xff0c; springboot2.6与knife4j的整合。 版本对应 springboot2.6与knife4j 3.0.3 坑 …

CSRF:跨站请求伪造攻击

目录 什么是CSRF&#xff1f; DVWA中的CSRF low medium hight impossible 防御CSRF 1、验证码 2、referer校验 3、cookie的Samesite属性 4、Anti-CSRF-Token 什么是CSRF&#xff1f; CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&…

【学网攻】 第(20)节 -- 网络端口地址转换NAPT配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、NAPT是什么&#xff1f; 二、实验 1.引入 实验目的 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第…

AIGC实战——归一化流模型(Normalizing Flow Model)

AIGC实战——归一化流模型 0. 前言1. 归一化流模型1.1 归一化流模型基本原理1.2 变量变换1.3 雅可比行列式1.4 变量变换方程 2. RealNVP2.1 Two Moons 数据集2.2 耦合层2.3 通过耦合层传递数据2.4 堆叠耦合层2.5 训练 RealNVP 模型 3. RealNVP 模型分析4. 其他归一化流模型4.1 …

计算机网络——新型网络架构:SDN/NFV

1. 传统节点与SDN节点 1.1 传统节点(Traditional Node) 这幅图展示了传统网络节点的结构。在这种设置中&#xff0c;控制层和数据层是集成在同一个设备内。 以太网交换机&#xff1a;在传统网络中&#xff0c;交换机包括控制层和数据层&#xff0c;它不仅负责数据包的传输&…

FANUC机器人如何清除示教器右上角的白色感叹号?

FANUC机器人如何清除示教器右上角的白色感叹号&#xff1f; 如下图所示&#xff0c;示教器上显示白色的感叹号&#xff0c;如何清除呢&#xff1f; 具体可参考以下步骤&#xff1a; 按下示教器上白色的“i”键&#xff0c;如下图所示&#xff0c; 如下图所示&#xff0c;按…

飞天使-linux操作的一些技巧与知识点6-node,npm与jenkins执行用户

文章目录 安装node,npmjenkins执行时候出现找不到npm 命令 安装node,npm 以下是在 CentOS 7.9 上使用 nvm 安装 Node.js 的步骤&#xff1a;安装 nvm&#xff1a;bashCopy Codecurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash在终端中重新加…

Java 运用 StringJoiner 高效的拼接字符串

运用 StringJoiner 高效的拼接字符串 package com.zhong.stringdemo;import java.util.ArrayList; import java.util.StringJoiner;public class Test {public static void main(String[] args) {ArrayList<String> s new ArrayList<>();s.add("11");s.…

备战蓝桥杯---搜索(剪枝)

何为剪枝&#xff0c;就是减少搜索树的大小。 它有什么作用呢&#xff1f; 1.改变搜索顺序。 2.最优化剪枝。 3.可行性剪枝。 首先&#xff0c;单纯的广搜是无法实现的&#xff0c;因为它存在来回跳的情况来拖时间。 于是我们可以用DFS&#xff0c;那我们如何剪枝呢&#…

Vulnhub靶机:hacksudoAliens

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudoAliens&#xff08;10.0.2.46&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com…

PyTorch使用

前言 系统环境&#xff1a;win10 使用Anaconda&#xff0c;Anaconda的安装自行百度。 conda 23.7.4 目录 前言 创建虚拟环境 1、查看当前有哪些虚拟环境 2、创建虚拟环境pytorch 3、激活及关闭pytorch虚拟环境 4、删除pytorch虚拟环境 使用yolov5测试 1、切换至yolo…

UWA Pipeline 2.6.0 版本更新

UWA Pipeline是一款面向游戏开发团队的本地协作平台&#xff0c;旨在为游戏开发团队搭建专属的DevOps研发交付流水线&#xff0c;提供可视化的CICD操作界面、高可用的自动化测试以及UWA性能保障服务的无缝贴合等实用功能。 本周&#xff0c;我们迎来了全新的UWA Pipeline 2.6.…

MES系统是什么?MES软件有什么用?

在制造业领域&#xff0c;伴随着科技的不断进步和产业升级&#xff0c;企业越来越重视数字化和信息化在生产管理中的应用。引入先进的管理系统成为企业提高生产效率、降低成本、增强产品质量的关键途径。在工业4.0的大背景下&#xff0c;MES制造执行系统作为一种位于ERP企业资源…