【赵渝强老师】国产数据库TiDB的代理路由:TiProxy
在TiDB数据库集群中,TiProxy是PingCAP的官方代理组件,它放置在客户端和TiDB server之间,为TiDB提供负载均衡、连接保持、服务发现等功能。
提示:TiProxy是可选组件,也可以使用第三方的代理组件,或者直接连接到TiDB Server。
下图展示了基于TiProxy的TiDB集群架构。
视频讲解如下 |
---|
【赵渝强老师】TiDB的代理路由TiProxy |
一、 TiProxy的功能特性
TiProxy提供连接迁移、故障转移、服务发现和一键部署的功能。
- 连接迁移
TiProxy在保持客户端连接不变的情况下,能将一台TiDB server上的连接迁移到另一台TiDB server。连接迁移通常发生在以下场景:
- 当TiDB server进行缩容、滚动升级、滚动重启操作时,TiProxy能把连接从即将下线的TiDB server迁移到其他TiDB server上,从而保持客户端连接不断开。
- 当TiDB server进行扩容操作时,TiProxy能将已有的部分连接迁移到新的TiDB server上,从而实现了实时的负载均衡,无需客户端重置连接池。
如上图所示,原先客户端通过TiProxy连接到TiDB 1上,连接迁移之后,客户端实际连接到TiDB 2上。在TiDB1即将下线或TiDB 1上的连接数比TiDB 2上的连接数超过设定阈值时,会触发连接迁移。连接迁移对客户端无感知。
-
故障转移
当一台TiDB server存在Out of Memory(OOM)风险、连接PD或TiKV失败时,TiProxy自动感知故障,并将连接迁移到其他TiDB server上,从而保持客户端连接不断开。 -
服务发现
当TiDB server进行扩容、缩容操作时,如果使用普通负载均衡器,则需要手动更新TiDB server列表,而TiProxy能自动发现TiDB server列表,无需人工介入。 -
一键部署
TiProxy集成到了TiUP、TiDB Operator、TiDB Dashboard和Grafana中,且内置虚拟IP管理,降低了部署和运维成本。
二、 【实战】TiProxy快速上手
使用TiIUP可以非常方便地快速部署一个包含TiProxy组件的TiDB数据库集群。集群部署完成后,可以通过一个简单的测试程序来测试TiProxy的流量分发功能。下面是具体的操作步骤。
(1)启动包含TiProxy节点的TiDB数据库集群。
tiup playground v8.5.1 \--db 2 --pd 1 --kv 2 \--tiproxy 2 \--tiflash 0 --without-monitor# 提示:这里的TiDB数据库集群中包含2个TiProxy实例,由选项--tiproxy指定。
# 输出信息如下:
TiDB Playground Cluster is started, enjoy!Connect TiDB: mysql --comments --host 127.0.0.1 --port 4000 -u root
Connect TiDB: mysql --comments --host 127.0.0.1 --port 4001 -u root
Connect TiProxy: mysql --comments --host 127.0.0.1 --port 6001 -u root
Connect TiProxy: mysql --comments --host 127.0.0.1 --port 6000 -u root
TiDB Dashboard: http://127.0.0.1:2379/dashboard
(2)查看集群的节点信息。
tiup playground display# 输出的信息如下:
Pid Role Uptime
--- ---- ------
3496 pd 1m53.042378029s
3504 tikv 1m52.945817432s
3506 tikv 1m52.851553183s
3508 tidb 1m52.759561619s
3543 tidb 1m52.563103386s
3816 tiproxy 1m45.622938601s
3822 tiproxy 1m45.526132671s
(3)通过TiProxy连接TiDB数据库。
mysql --comments --host 127.0.0.1 --port 6000 -u roottidb> select version();
+--------------------+
| version() |
+--------------------+
| 8.0.11-TiDB-v8.5.1 |
+--------------------+
1 row in set (0.001 sec)
(4)开发一段简单的程序测试TiProxy的流量分发。
for a in {1..10}do mysql --host 127.0.0.1 --port 6000 -u root \-e "show global variables like 'port';";sleep 1;done# 提示:这段测试程序将通过TiProxy连接TiDB Server,并输出当前TiDB Server的端口号信息。
# 输出的信息如下:
......
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 4001 |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 4000 |
+---------------+-------+
......