写点什么

TiProxy 尝鲜

  • 2023-08-04
    北京
  • 本文字数:1484 字

    阅读完需:约 5 分钟

作者: HappyUncle 原文来源:https://tidb.net/blog/bbf3f52d

说明

最近发现 tidb 有个 https://github.com/pingcap/TiProxy 仓库,抱着好奇的心态想试试这个组件的使用效果。于是按照文档的介绍在本地环境使用 tiup 做了一些实验,现在将实验过程和实验结果分享给大家。

TiProxy 介绍

官方 README 介绍的已经很清楚了,最重要的特性是在 TiDB 升级、重启、扩缩节点时候可以保证连接不断。牛!


TiProxy is a database proxy that is based on TiDB. It keeps client connections alive while the TiDB server upgrades, restarts, scales in, and scales out.


此外还有一些特性


  • 连接管理:当 tidb 节点重启或者关机后,在这个节点上建立的连接会迁移到其他实例上,这个动作对 client 是透明的,client 无感知

  • 负载均衡:新建连接会对后端 tidb-server 进行打分,然后进行多个 tidb 实例间的均衡

  • 服务发现:TiProxy 通过跟 pd 交互获取最新的 tidb 实例信息,当有新的 tidb 启动时,proxy 会自动发现并迁移连接至此。

实验说明

使用 tiup 搭建下测试环境,启动 1 个 pd、1 个 tikv、1 个 tidb-server、1 个 tiproxy,通过 tiproxy 连接数据库,测试 case 如下:


  • 启动两个终端连接数据库,然后加 1 个 tidb-server 节点,看看 client 无感的负责均衡效果

  • 上一步完成后,我们有了 2 个 tidb-server,那么缩掉一个,看看 proxy 是怎么做到会话迁移的

启动集群

查阅资料 发现 TiProxy 仅支持 v6.4.0 及以后版本,所以使用 tiup 启动这个版本的集群。


  1. tidb 和 tiproxy 使用 toekn 认证方式,所以生成一个证书

  2. 准备配置文件 tidb.toml 和 tiproxy.yaml

  3. 启动 tidb

  4. 启动 tiproxy

实验

1、加节点自动负载均衡

集群启动后,使用两个终端连接 proxy,然后执行 show processlist 可以看到对方的会话,说明连接到了一个 tidb 节点上



执行 tiup 添加一个 tidb-server 节点


tiup playground scale-out --db 1
复制代码


然后分别执行 show processlit 查询,发现每个终端看不到对方的会话了,说明各自连接到了一个 tidb 实例。



仔细查看发现其中一个连接的信息从 127.0.0.1:53240 变成了 127.0.0.1:54328,也确实说明发生了重连接。


这里补充个说明:因为我测试的时候没有开启 proxy 协议,所以 show processlist 看到的 host 不是 client 真实的信息,是 proxy 和 tidb 建立连接的信息,tidb 把 proxy 当成 client 出来了。


测试结果很好,负载均衡 client 无感。

2、缩节点会话自动迁移

在这个基础上,执行 tiup 缩掉一个 tidb-server


tiup playground scale-in --pid 91609
复制代码


然后执行 show processlist,可以看到对方的会话,说明又连接到了同一个 tidb 节点上。



执行 sql 的时候没有报错,client 无感知。

加餐

实验至此一切都丝般顺滑、符合预期。但是测试的场景未免有些简单。下面做个带有事务的 case:


使用 tiup 搭建下测试环境,启动 1 个 pd、1 个 tikv、1 个 tidb-server、1 个 tiproxy,通过 tiproxy 连接数据库,打开两个终端并显示执行一个 begin,然后分别执行个写入操作,之后再添加 1 个 tidb-server,看看会话是否会被迁移。



这说明在执行中的事务不会做迁移。在设计文档 中也的确有这样的描述


Transactions are hard to be restored, so Session Manager doesn’t support restoring a transaction. Session Manager must wait until the current transaction finishes or the TiDB instance exits due to shut down timeout.


符合预期。

总结

本次基于 v6.4.0 版本做了 3 个简单的实验,对于 tidb 节点扩缩有会话自动迁移的能力的确很丝滑。


整个过程 cleint 无报错、无感知。被迁移的会话如果有未提的事务,则会等到事务结束后再迁移。


赞👍🏻


发布于: 刚刚阅读数: 5
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiProxy 尝鲜_实践案例_TiDB 社区干货传送门_InfoQ写作社区