将 TiDB 与 ProxySQL 集成
本文档提供了 ProxySQL 的高层次介绍,描述了在 开发环境 和 生产环境 中如何将 ProxySQL 与 TiDB 集成,并通过 查询路由的典型场景演示了主要的集成优势。
如果你有兴趣了解更多关于 TiDB 和 ProxySQL 的信息,可以参考以下一些有用的链接:
什么是 ProxySQL?
ProxySQL 是一个高性能的开源 SQL 代理。它具有灵活的架构,可以以多种不同方式部署,非常适合各种用例。例如,ProxySQL 可以通过缓存频繁访问的数据来提升性能。
ProxySQL 从设计之初就追求快速、高效、易用。它与 MySQL 完全兼容,支持你期望的所有高质量 SQL 代理功能。此外,ProxySQL 还具有一些独特的特性,使其成为各种应用的理想选择。
为什么要集成 ProxySQL?
- ProxySQL 可以通过减少与 TiDB 交互时的延迟,帮助提升应用性能。无论你在构建什么样的应用,无论是使用无服务器函数(如 Lambda)实现的可扩展应用(工作负载具有不确定性且可能出现峰值),还是需要执行加载大量数据的查询的应用,利用 ProxySQL 的强大功能(如 连接池 和 缓存频繁使用的查询)都能立即获得好处。
- ProxySQL 可以作为额外的应用安全层,防御 SQL 漏洞(如 SQL 注入),这得益于其 查询规则 功能,配置简单。
- 由于 ProxySQL 和 TiDB 都是开源项目,你可以享受到零供应商锁定的优势。
部署架构
将 ProxySQL 与 TiDB 部署的最常见方式是将 ProxySQL 作为应用层与 TiDB 之间的独立中介。然而,这种方式的可扩展性和容错性无法得到保证,而且由于网络跳转,还会增加额外的延迟。为避免这些问题,另一种部署架构是将 ProxySQL 作为 sidecar 部署,示意如下:
开发环境
本节介绍在开发环境中如何将 TiDB 与 ProxySQL 集成。在你准备好所有 前提条件 后,可以根据你的 TiDB 集群类型选择以下任意一种方案开始集成。
- Option 1: 将 TiDB Cloud 与 ProxySQL 集成
- Option 2: 将 TiDB(自托管)与 ProxySQL 集成
前提条件
根据你选择的方案,可能需要以下软件包:
你可以按照以下安装指引操作:
下载 并启动 Docker(Docker Desktop 已包含 Docker Compose)。
运行以下命令安装 Python 和
mysql-client
:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install python mysql-client
curl -fsSL https://get.docker.com | bash -s docker
yum install -y git python39 docker-ce docker-ce-cli containerd.io docker-compose-plugin mysql
systemctl start docker
下载并安装 Git。
从 Git Windows 下载 页面下载 64-bit Git for Windows Setup 包。
按照安装向导完成安装,点击 Next 多次使用默认设置。
下载并安装 MySQL Shell。
从 MySQL 社区服务器下载 页面下载 ZIP 格式的 MySQL 安装包。
解压后,找到
mysql.exe
在bin
文件夹中。需要将bin
文件夹路径添加到系统变量中,并在 Git Bash 中设置到PATH
变量:echo 'export PATH="(your bin folder)":$PATH' >>~/.bash_profile source ~/.bash_profile例如:
echo 'export PATH="/c/Program Files (x86)/mysql-8.0.31-winx64/bin":$PATH' >>~/.bash_profile source ~/.bash_profile
下载并安装 Docker。
从 Docker 下载 页面下载 Docker Desktop 安装包。
双击运行安装程序,安装完成后会提示重启。
下载最新的 Python 3 安装包,从 Python 下载 页面下载安装。
Option 1: 将 TiDB Cloud 与 ProxySQL 集成
此方案中,你将使用 ProxySQL Docker 镜像 和一个 TiDB Cloud Serverless 集群。以下步骤将会在端口 16033
上部署 ProxySQL,请确保此端口可用。
步骤 1. 创建 TiDB Cloud Serverless 集群
创建一个免费 TiDB Cloud Serverless 集群。记住你为集群设置的 root 密码。
获取你的集群主机名、端口和用户名,备用。
- 在 Clusters 页面,点击你的集群名称进入集群概览页面。
- 在集群概览页面,找到 Connection 面板,复制
Endpoint
、Port
和User
字段,Endpoint
即为你的集群主机名。
步骤 2. 生成 ProxySQL 配置文件
克隆 集成示例代码仓库:
git clone https://github.com/pingcap-inc/tidb-proxysql-integration.gitgit clone https://github.com/pingcap-inc/tidb-proxysql-integration.gitgit clone https://github.com/pingcap-inc/tidb-proxysql-integration.git进入
tidb-cloud-connect
文件夹:cd tidb-proxysql-integration/example/tidb-cloud-connectcd tidb-proxysql-integration/example/tidb-cloud-connectcd tidb-proxysql-integration/example/tidb-cloud-connect运行
proxysql-config.py
生成配置文件:python3 proxysql-config.pypython3 proxysql-config.pypython proxysql-config.py提示时,输入你的集群端点作为
Serverless Tier Host
,然后输入集群的用户名和密码。以下为示例输出。你会看到在当前
tidb-cloud-connect
文件夹下生成了三个配置文件。[Begin] generating configuration files.. tidb-cloud-connect.cnf generated successfully. proxysql-prepare.sql generated successfully. proxysql-connect.py generated successfully. [End] all files generated successfully and placed in the current folder.
步骤 3. 配置 ProxySQL
启动 Docker。如果已启动,可跳过此步骤:
双击已安装的 Docker 图标启动。
systemctl start docker双击已安装的 Docker 图标启动。
拉取 ProxySQL 镜像并在后台启动容器:
docker compose up -ddocker compose up -ddocker compose up -d通过运行以下命令,将
proxysql-prepare.sql
在 ProxySQL 管理界面 内执行,集成配置:docker compose exec proxysql sh -c "mysql -uadmin -padmin -h127.0.0.1 -P6032 < ./proxysql-prepare.sql"docker compose exec proxysql sh -c "mysql -uadmin -padmin -h127.0.0.1 -P6032 < ./proxysql-prepare.sql"docker compose exec proxysql sh -c "mysql -uadmin -padmin -h127.0.0.1 -P6032 < ./proxysql-prepare.sql"以下为示例输出。你会看到输出中显示了你的集群主机名,表示 ProxySQL 与 TiDB Cloud Serverless 集群的连接已建立。
*************************** 1. row *************************** hostgroup_id: 0 hostname: gateway01.us-west-2.prod.aws.tidbcloud.com port: 4000 gtid_port: 0 status: ONLINE weight: 1 compression: 0 max_connections: 1000 max_replication_lag: 0 use_ssl: 1 max_latency_ms: 0 comment:
步骤 4. 通过 ProxySQL 连接你的 TiDB 集群
运行
proxysql-connect.py
,连接到你的 TiDB 集群。脚本会自动启动 MySQL 客户端,并使用你在 步骤 2 中指定的用户名和密码。python3 proxysql-connect.pypython3 proxysql-connect.pypython proxysql-connect.py连接成功后,可以用以下 SQL 语句验证连接:
SELECT VERSION();如果显示了 TiDB 版本信息,说明你已成功通过 ProxySQL 连接到你的 TiDB Cloud Serverless 集群。随时可以输入
quit
并按 enter 退出 MySQL 客户端。若要停止并删除容器,返回上级目录,运行以下命令:
docker compose down cd -docker compose down cd -docker compose down cd -
Option 2: 将 TiDB(自托管)与 ProxySQL 集成
此方案中,你将使用 TiDB 和 ProxySQL 的 Docker 镜像搭建环境。你也可以尝试 其他安装 TiDB(自托管)的方法。
以下步骤将在端口 6033
和 4000
上部署 ProxySQL 和 TiDB,请确保这些端口可用。
启动 Docker。如果已启动,可跳过此步骤:
双击已安装的 Docker 图标启动。
systemctl start docker双击已安装的 Docker 图标启动。
克隆 集成示例代码仓库:
git clone https://github.com/pingcap-inc/tidb-proxysql-integration.gitgit clone https://github.com/pingcap-inc/tidb-proxysql-integration.gitgit clone https://github.com/pingcap-inc/tidb-proxysql-integration.git拉取最新的 ProxySQL 和 TiDB 镜像:
cd tidb-proxysql-integration && docker compose pullcd tidb-proxysql-integration && docker compose pullcd tidb-proxysql-integration && docker compose pull启动包含 TiDB 和 ProxySQL 的集成环境:
docker compose up -ddocker compose up -ddocker compose up -d你可以使用
root
用户名,空密码,连接到 ProxySQL6033
端口。连接到 TiDB 通过 ProxySQL:
mysql -u root -h 127.0.0.1 -P 6033mysql -u root -h 127.0.0.1 -P 6033mysql -u root -h 127.0.0.1 -P 6033连接成功后,可以用以下 SQL 语句验证连接:
SELECT VERSION();如果显示了 TiDB 版本信息,说明你已成功通过 ProxySQL 连接到你的 TiDB 容器。
若要停止并删除容器,返回上级目录,运行以下命令:
docker compose down cd -docker compose down cd -docker compose down cd -