TiDB 的高可用实践:一文了解代理组件 TiProxy 的原理与应用

导读

TiProxy 是 TiDB 官方推出的高可用代理组件,旨在替代传统的负载均衡工具如 HAProxy 和 KeepAlived,为 TiDB 提供连接迁移、故障转移、服务发现等核心能力。 本文全面解析了 TiProxy 的设计理念、主要功能及适用场景,并通过实际案例展示了其在扩缩容、故障处理和流量捕捉与回放中的强大能力。


前言

TiDB 是一款典型的分布式存算分离架构的数据库,其中计算层由多个无状态的 TiDB Server 组成,这些 TiDB Server 同时对外承担连接请求。为了可以将连接分发到多个 TiDB Server 节点上,一般需要借助外部负载均衡组件如硬件负载均衡 F5、软件负载均衡 HAProxy 等。

为了实现全链路的高可用架构,我们经常也需要考虑负载均衡组件本身的高可用性,比如通过 KeepAlived 来保证 HAProxy 的高可用。这无疑增加了整体的使用成本,尤其是对于使用最小规模的 TiDB 集群部署已经能够完全承载业务体量的系统而言。

什么是 TiProxy

如果用户本身没有现成的负载均衡设备,则必须搭建一套类似 KeepAlived+HAProxy 的高可用负载均衡层,增加了维护的成本, KeepAlived 和 HAProxy 本身也不属于 TiDB 数据库生态的组件,出现问题也只能寻找现网的解决方法。TiProxy 是 TiDB 官方的代理组件,它为 TiDB 提供负载均衡、连接保持、服务发现等功能,是替换开源的 KeepAlived+HAProxy 或其他负载均衡软件有效的方案。

什么是 TiProxy

TiProxy 的主要能力

TiProxy 的主要功能包括:连接迁移、故障转移、服务发现和一键部署。

TiProxy 的主要功能

  • 连接迁移。 连接迁移就是说可以把客户端连接从 A 计算节点迁移到 B 计算节点而不影响业务。这种通常在 扩缩容、滚动升级、滚动重 启 场景使用,是一种计划内的动作,如果是计算节点异常下线这种情况,则不属于连接迁移的范畴。
  • 故障转移。 故障转移就是说当发现有计算节点故障的时候,比如 OOM 或是发现与 PD/TiKV 组件无法连接时,TiProxy 可以发现故障并将连接转移到正常的计算节点上。
  • 服 务发现。 使用外部的负载均衡组件时无法自动感知到有计算节点变化的情况,比如对计算节点做了扩缩容,而使用 TiProxy 就能自动的发现新增/删除的计算节点,不需要人工介入。
  • 一键部署。 TiProxy 被集成到 TiUP、TiOperator 管理工具中,可通过 tiup 命令直接扩容的方式安装即可,不需要单独下载并单独安装。

TiProxy 的适用场景

基于上述介绍的 TiProxy 主要能力,我们可以梳理出 TiProxy 比较适用的场景。

TiProxy 的适用场景

  • 可用性要求高的业务。 有些业务系统通常要求 7*24 对外提供服务,这些系统对可用性要求极高,比如要满足 4 个 9 或 5 个 9 之类的不停机时间。然而系统在长时间运行的环境中,无法避免因为业务变更或程序漏洞需要进行计划性的调整,这就要求数据库能够支持不影响业务的前提下进行在线重启、升级等操作。使用 TiProxy 的连接迁移功能结合 TiDB 数据库的滚动重启功能可以完美的解决这一场景。
  • 敏态类的业务。 某些业务系统可能在大部分的时间段业务都处于低峰期,但在某些时间段内业务会比平时增加 10 倍或者更多,比如电商促销活动期间。这要求数据库在短时间内能够支持快速的扩缩容操作,以应对高峰时段的业务负载。TiProxy 也非常适合这样的场景,可以保证在扩缩容操作过程中对业务无影响。
  • 提前规避系统风险。 分布式系统由多个节点组成,每个节点都对外提供服务。无论是因为业务自身的原因,还是因为数据库内部机制,节点之间出现不均衡的状态是无法避免的。通过监控节点的均衡状态,我们可以提前发现可能存在 CPU 或内存资源严重不均的情况,结合 TiProxy,将异常节点的连接提前转移到正常节点,并在恢复之后再将连接均衡回来。

需要注意的是,如果系统对交易的 Duration 延迟要求极高,那么 TiProxy 可能不是最优的选择。相比 F5 或 HAProxy 这样的外部负载均衡组件,TiProxy 性能会稍有不足,会一定程度的降低 TPS 或增加交易延迟,这在官网文档中有相关说明。

安装并体验 TiProxy

TiProxy 是 TiDB v8 版本才发布的组件(实际支持 v6.5 及以上 TiDB 版本),对很多 TiDB 用户来说可能还属于一个新鲜的东西。考虑到这是一个新的组件,大部分用户从安全稳定的角度考虑就是否使用 TiProxy 组件还处于一个观望阶段。不过从 TiDB 的产品发布内容来看,从 v8.1 到 v8.5,我们也看到 TiProxy 一直在改进和增强,可以在一些延迟要求不是特别敏感的系统中测试并使用起来。

那么如何在一个 TiDB 集群中使用 TiProxy 呢,以下参考官网文档 TiProxy 简介 ( https://docs.pingcap.com/zh/tidb/stable/tiproxy-overview#安装和使用 ) 做一个简单的示例说明。

1 TiDB Server 实例配置

1. 升级并检查 tiup 版本

如果 TiUP 版本是 v1.15.0 之前,需要为 TiDB Server 实例生成自签名证书并配置证书的路径,否则将无法使用 TiProxy 的连接迁移功能。鉴于为 tidb server 生成自签名证书步骤比较繁琐,建议直接将 tiup 升级至 v1.15.0 版本或以上,通过以下命令升级及检查 tiup 版本。

tiup update --self
tiup -v | grep tiup

2. 配置 tidb server 的 graceful-wait-before-shutdown

根据官网提示,tidb server 的 graceful-wait-before-shutdown 应大于应用程序最长事务的持续时间,否则 tidb server 下线时客户端可能断连,最长事务持续时间可通过 grafana 监控报表查看确认。

server_configs:
  tidb:    graceful-wait-before-shutdown: 15

2 安装并配置 TiProxy

TiProxy 可以部署多个,为了保证 TiProxy 的高可用,一般建议部署两个,通过配置虚拟 IP 将流量路由到 TiProxy 实例上。

1. 准备 TiProxy 部署配置文件 tiproxy.toml

TiProxy 支持一系列参数配置,具体可参考文档 TiProxy 配置文件 ( https://docs.pingcap.com/zh/tidb/stable/tiproxy-configuration ) 。以下是一个最基本的配置文件,它表示在两个节点上分别安装版本为 v1.3.0 的 tiproxy 组件,配置 ha.virtual-ip 及 ha.interface 指定虚拟 IP,用于对外提供连接服务。

component_versions:
  tiproxy: "v1.3.0"
server_configs:
  tiproxy:
    ha.virtual-ip: "10.1.1.200/24"
    ha.interface: "eth0"
tiproxy_servers:
  - host: 10.1.1.154
  - host: 10.1.1.155

2. 安装 TiProxy 组件

如果是首次安装集群,则 TiProxy 可以与集群一同完成安装;如果是在已有集群中增加 TiProxy ,可以通过 tiup scale-out 的方式扩容 TiProxy 组件。

安装或扩容完成后,通过 tiup display 命令可以查看到相应的 tiproxy 组件,其默认的连接端口为 6000。

tiup cluster display tidb-test | grep tiproxy
10.1.1.154:6000   tiproxy       10.1.1.154  6000/3080    linux/aarch64  Up       -                                       /data1/tidb-re-deploy/tiproxy-6000
10.1.1.155:6000   tiproxy       10.1.1.155  6000/3080    linux/aarch64  Up       -                                       /data1/tidb-re-deploy/tiproxy-6000

3. 验证连接 TiProxy

上述步骤完成后,我们便可以通过连接 TiProxy 地址及端口来验证是否可以正常连接到 tidb。如果配置无误, 无论是通过 <tiproxy_ip>:6000 还是通过 <virtual_ip>:6000,应该都可以正常连接到 TiDB。

3 体验 TiProxy 连接迁移

如上面内容所述,TiProxy 具有连接迁移的能力,对于计划内的操作如扩缩容、滚动升级、滚动重启,TiProxy 可以保证完全不影响业务。TiProxy 同时也具有服务发现能力,当有计算节点增加或减少时,TiProxy 能自动感知,无须人工介入。我们通过模拟 sysbench 压测,并在压测过程中扩容和缩容计算节点,观察所有计算节点的连接变化以及业务影响情况。

1. 开启 sysbench 压测

使用 100 并发连接开启 sysbench 压力测试,场景为 oltp_read_only。观察各 tidb server 连接数情况,连接数分别为 33/33/34 ,处于相对均衡的状态。

开启 sysbench 压测

进一步查看运行时 QPS,查询 QPS 约为 27.9K

进一步查看运行时 QPS

2. 在线扩容一台 tidb server

使用 tiup scale-out 在线扩容一台 tidb server,扩容后 tidb server 从原来的 3 台变成 4 台

tiup cluster scale-out tidb-B ./scale-tidb.yaml

观察扩容过程中 sysbench 压测情况,发现运行平稳无任何报错。通过监控查看运行时 QPS,查询 QPS 约为 30.7 K ,较之前 QPS 有上升的趋势。

在线扩容一台 tidb server

观察各 tidb server 连接数情况,连接数分别为 26/26/26/22 ,处于相对均衡的状态,可以看到在运行过程中连接被自动迁移到扩容的 tidb server 节点,无须手工介入。

观察各 tidb server 连接数情况

3. 在线缩容一台 tidb server

使用 tiup scale-in 在线缩容两台 tidb server,缩容后 tidb server 从刚刚的 4 台变成 2 台

tiup cluster scale-in tidb-B -N 10.1.1.153:24000,10.1.1.154:24000

观察扩容过程中 sysbench 压测情况,发现运行平稳无任何报错。通过监控查看运行时 QPS,查询 QPS 约为 21.8K ,较之前 QPS 有明显下降的趋势。

在线缩容一台 tidb server

进一步观察各 tidb server 连接数情况,连接数分别为 50/50/0/0 ,说明在运行过程中连接被自动迁移到剩余的 2 台 tidb server 节点,无须手工介入。

进一步观察各 tidb server 连接数情况

通过上述步骤的演示,无论是在线扩容还是缩容,TiProxy 组件可以实现业务完全无感知,TiProxy 能自动识别新增或移除的计算节点,将连接自动均衡到现有的节点上。

TiProxy 新特性体验:流量捕捉与回放

TiDB v8.5.0 LTS 版本中增加了 TiProxy 流量捕捉与回放的功能,作为实验特性。流量捕捉和回放适用于在生产环境捕捉流量并在测试环境回放,适用的场景包括:

  • 数据库版本升级前验证。 比如某套业务生产环境的 TiDB 版本要进行升级,可以通过在现有生产环境捕捉一定时间段的流量并在测试环境新版本中进行回放验证,判断新版本中业务是否能平稳运行。
  • 业务改造或应用打版验证。 有时候应用可能也会进行打版或升级,可能是因为业务需求的变化,如果直接在生产环境操作存在一定的风险,可以用生产的流量在测试环境中进行回放验证。
  • 扩缩容及业务上限评估 。 有些生产环境数据库可能长期处于高压状态,需要通过扩容来满足业务需求;也有些生产环境数据库资源使用率极低,资源存在浪费的情况,可以适当缩容一些节点出来。使用 TiProxy 的流量捕捉回放功能,可以利用测试环境来评估生产的流量具体使用多少资源比较合适。

使用 TiProxy 的流量捕捉回放功能需要使用 tiproxyctl 工具,安装 tiproxyctl 步骤如下,

tiup install tiproxy
ls `tiup --binary tiproxy`ctl

当要在生产环境进行流量捕捉时,使用 tiproxyctl traffic capture 。以下命令表示捕获指定 tiproxy 地址的流量,并保存到 /tmp/traffic 目录下,持续时间为 10 分钟。

tiproxyctl traffic capture --host 10.1.1.200 --port 3080 --output="/tmp/traffic" --duration=10m

捕获的流量将保存在 TiProxy 节点的对应目录下,包含两个文件:meta 和 traffic.log,meta 是流量的元数据信息记录,traffic.log 则保存了具体的业务流量信息。

tree /tmp/traffic/
/tmp/traffic/
├── meta
└── traffic.log

0 directories, 2 files

流量捕捉完成后,使用 tiproxyctl traffic replay 在测试环境中回放流量。以下命令表示在测试环境中从指定位置回放流量,回放速度为 2 倍速生产流量。

tiproxyctl traffic replay --host 10.1.1.200 --port 3080 --username=<uname> --password=<passwd> --input="/tmp/traffic" --speed=2

本文仅对 TiProxy 流量捕捉与回放功能做一个简要的介绍说明,更多细节内容请参考官网 TiProxy 流量回放 ( https://docs.pingcap.com/zh/tidb/stable/tiproxy-traffic-replay )。

总结

本文对 TiDB 的官方代理组件 TiProxy 进行了一个整体的说明与介绍,TiProxy 是 v8 版本开始支持的可以用于代替开源负载均衡工具的一款 TiDB 生态组件。TiProxy 不仅具有连接迁移、故障转移、服务发现和一键部署的能力,在新版本中也支持流量捕捉与回放的功能,是替换开源代理组件的一个极佳方案。引入 TiProxy 在延迟要求极高的场景下可能带来一定的性能损失,建议以具体业务场景中性能测试为准。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redisson发布订阅学习

介绍 Redisson 的消息订阅功能遵循 Redis 的发布/订阅模式&#xff0c;该模式包括以下几个核心概念&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;发送消息到特定频道的客户端。在 Redis 中&#xff0c;这通过 PUBLISH 命令实现。 订阅者&#xff08;Sub…

Github 2025-01-17 Java开源项目日报 Top8

根据Github Trendings的统计,今日(2025-01-17统计)共有8个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目8TypeScript项目1Python项目1OpenAPI 生成器:基于规范自动生成API工具 创建周期:2155 天开发语言:Java协议类型:Apache License 2.0…

基于docker微服务日志ELK+Kafka搭建

ELK 是 Elasticsearch 、 Logstash 、 Kibana 的简称 Elasticsearch 是实时全文搜索和分析引擎&#xff0c;提供搜集、分析、存储数据三大功能&#xff1b;是一套开放 REST 和 JAVA API 等结构提供高效搜索功能&#xff0c;可扩展的分布式系统。它构建于 Apache Lucene 搜索引…

《C++11》中的显式虚函数重载:深入理解与应用

在C编程中&#xff0c;虚函数是一种强大的工具&#xff0c;它允许我们实现多态。通过虚函数&#xff0c;我们可以在派生类中重写基类的函数&#xff0c;从而实现运行时多态。然而&#xff0c;当我们在派生类中重载虚函数时&#xff0c;可能会遇到一些问题。在C11中&#xff0c;…

HTML 的基础知识及其重要性

前言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;它为我们提供了结构化内容和重要信息。无论是个人博客、企业官网还是大型电子商务平台&#xff0c;HTML 都是不可或缺的一部分。本文将介绍 HTML 的基本概念、结构及其在网页开发中的重要性。 什…

STM32 FreeRTOS 任务创建和删除实验(动态方法)

目录 实验目标 CubeMX环境准备 SysMode配置 RCC配置 ​编辑LED1引脚配置 LED2引脚配置 KEY1引脚配置 串口USART1配置 NVIC配置 项目管理 代码生成配置 生成代码 Keil配置 打开项目: 配置使用微库 配置每次烧录后“复位并运行” FreeRTOS移植 移植配置完成后的…

【Docker】——安装Docker以及解决常见报错

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Ubuntu22.04安装paddle GPU版本

文章目录 确立版本安装CUDA与CUDNN安装paddle 确立版本 查看官网信息&#xff0c;确立服务版本&#xff1a;https://www.paddlepaddle.org.cn/documentation/docs/zh/2.6/install/pip/linux-pip.html 安装CUDA与CUDNN 通过nvidia-smi查看当前显卡驱动版本&#xff1a; 通过…

【MySQL 的数据目录】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、MySQL 的数据目录 1、数据库文件的存放路径2、相关命令目录3、配置文件目录 二、数据库和文件系统的关系 1、查看默认数据库2、数据库在文件系统中的表示3、表…

【安卓开发】【Android】总结:安卓技能树

【持续更新】 对笔者在安卓开发的实践中认为必要的知识点和遇到的问题进行总结。 一、基础知识部分 1、Android Studio软件使用 软件界面 最新的版本是瓢虫&#xff08;Ladybug&#xff09;&#xff0c;bug的确挺多。笔者更习惯使用电鳗&#xff08;Electric Eel&#xff0…

openharmony电源管理子系统

电源管理子系统 简介目录使用说明相关仓 简介 电源管理子系统提供如下功能&#xff1a; 重启服务&#xff1a;系统重启和下电。系统电源管理服务&#xff1a;系统电源状态管理和休眠运行锁管理。显示相关的能耗调节&#xff1a;包括根据环境光调节背光亮度&#xff0c;和根…

SQL Server 导入Excel数据

1、选中指定要导入到哪个数据库&#xff0c;右键选择 》任务 》导入数据 2、数据源 选择Excel&#xff0c;点击 下一步(Next) 3、目前 选择OLE DB Provider &#xff0c;点击 下一步&#xff08;Next&#xff09; 4、默认 &#xff0c;点击 下一步&#xff08;Next&#xff09;…

MySQL安装-Windows

目录 官网下载地址 下载MySQL安装包或者压缩包 安装 / 添加Path环境变量 初始化mysql 无密码初始化 随机密码初始化 注册MySQL服务 / 移除已经注册过的服务 启动MySQL服务 登录mysql前修改密码 登录mysql 登录mysql后修改密码 停止MqSQL服务 企业中使用的场景 官网下…

OSPF的LSA的学习研究

OSPF常见1、2、3、4、5、7类LSA的研究 1、拓扑如图&#xff0c;按照地址表配置&#xff0c;激活OSPF划分相关区域并宣告相关网段 2、1类LSA&#xff0c;每台运行了OSPF的路由器都会产生&#xff0c;描述了路由器的直连接口状况和cost 可以看到R1产生了一条router lsa&#xff0…

ZNS SSD垃圾回收优化方案解读-1

本文解读的论文《Optimizing Garbage Collection for ZNS SSDs via In-storage Data Migration and Address Remapping》是由重庆大学相关研究团队撰写&#xff0c;发表于2024年11月。本文小编将结合论文内容进行学习解读&#xff0c;以供各位读者参考&#xff01;由于水平有限…

生产管理看板助力节能科技公司实现数据自动化管理

在节能科技公司的生产过程中&#xff0c;数据管理的自动化是提高生产效率和产品质量的关键。然而&#xff0c;许多公司在数据记录、展示、对比和存档方面仍面临诸多痛点&#xff0c;如产品检测数据无法自动记录、缺乏直观的产线状态展示、检测数据对比繁琐耗时&#xff0c;以及…

JavaScript笔记基础篇03——函数

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 目录 函数 函数的使用 1.函数的声明语法 2.函数的…

在PyCharm中使用Anaconda中的虚拟环境

1、在File菜单中找到Settings 2、Settings中搜索interpreter&#xff0c;找到Python Interpreter&#xff0c;再点击Add 3、选择第一个local interpreter 4、如图&#xff1a; 5、找到anaconda安装位置中的envs文件夹&#xff0c;在里面选择需要添加的python环境&#xff0c;如…

Windows系统安装 Rust 及其配置

1、在Rust官网下载Rust安装程序 &#xff08;1&#xff09;官网链接&#xff1a;Rust中文官网 &#xff08;2&#xff09;下载链接&#xff1a;下载Rust安装程序 &#xff08;3&#xff09;下载好后的rust安装程序&#xff0c;如下图&#xff1a; 2、运行 rustup-init.exe 安…

Python大数据可视化:基于Python对B站热门视频的数据分析与研究_flask+hive+spider

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 排行榜界面 系统管理界面 看板展示 摘要 本项目以对B站热…