14.2.4 数据库端口与前端连接层

数据库端口与前端连接层是 ProxySQL 面向业务客户端的入口,负责接收应用连接、完成身份认证、维护连接池并将请求转发到后端 MySQL 实例。该层通常监听业务端口(如 6033),与管理端口(如 6032)分离,确保生产流量与运维管理互不影响。

原理草图(前端连接层数据流):

文章图片

核心职责:
- 连接接入与协议解析:实现 MySQL 协议握手、能力协商与会话初始化。
- 认证与权限校验:基于 mysql_users 中配置的用户、密码、默认主机组和最大连接数进行验证。
- 连接复用与池化:通过连接池复用后端连接,减少频繁建立连接带来的开销。
- 会话状态管理:维护事务状态、SQL 模式、字符集、用户变量等会话信息,确保请求路由一致性。
- 流量控制与限速:支持前端连接数限制、连接超时、空闲回收等策略,避免资源耗尽。

关键配置与完整示例(含命令解释):

# /etc/proxysql.cnf
datadir="/var/lib/proxysql"

# 管理端口:6032
admin_variables=
{
  admin_credentials="admin:admin"
  mysql_ifaces="0.0.0.0:6032"
}

# 业务端口:6033
mysql_variables=
{
  interfaces="0.0.0.0:6033"
  max_connections=2000
  default_query_timeout=3000
  connect_timeout_server=2000
  ping_timeout_server=2000
}
-- 连接管理端口并配置业务用户与连接限制
-- 解释:max_connections=200 为该用户前端最大连接数
mysql -h127.0.0.1 -P6032 -uadmin -padmin

INSERT INTO mysql_users(
  username,password,default_hostgroup,active,max_connections
) VALUES ('app','app_pass',10,1,200);

-- 生效:写入运行时并持久化到磁盘
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
-- 解释:添加后端主机组,确保前端连接能获取后端连接
INSERT INTO mysql_servers(
  hostgroup_id,hostname,port,weight,max_connections
) VALUES (10,'10.0.0.11',3306,100,500);

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

业务端口连接测试与预期效果:

# 解释:使用业务端口 6033 登录,验证前端连接层可用
mysql -h127.0.0.1 -P6033 -uapp -papp_pass -e "select 1;"
# 预期输出:1

连接池与前端连接状态查看(管理端口):

-- 解释:查看前端连接数与状态
SELECT * FROM stats_mysql_connection_pool\G

-- 解释:查看当前前端会话
SELECT * FROM stats_mysql_processlist\G

安装与端口开放(基础检查示例):

# 解释:确认 ProxySQL 监听端口
ss -lntp | grep -E '6032|6033'

# 解释:仅开放业务端口给应用网段
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="6033" accept' --permanent
firewall-cmd --reload

常见排错与定位:

# 1) 连接失败:确认端口与用户配置
ss -lntp | grep 6033
# 2) 用户认证失败:核对 mysql_users 与密码
mysql -h127.0.0.1 -P6032 -uadmin -padmin -e "SELECT username,active,default_hostgroup FROM mysql_users;"
# 3) 前端能连但查询失败:检查后端主机组是否有可用连接
mysql -h127.0.0.1 -P6032 -uadmin -padmin -e "SELECT * FROM stats_mysql_connection_pool\G"
# 4) 事务路由异常:检查会话状态
mysql -h127.0.0.1 -P6032 -uadmin -padmin -e "SELECT * FROM stats_mysql_processlist\G"

运维实践建议:
- 业务端口与管理端口务必分离并限制访问来源,降低误操作与安全风险。
- 合理设置前端连接上限与后端连接池大小,避免“前端拥塞、后端空闲”或“后端耗尽、前端超时”的不均衡。
- 对长事务与大查询进行隔离或限流,防止连接池被占满。
- 在多实例部署场景中统一端口与用户策略,便于流量切换与故障转移。

练习:
1. 将业务端口从 6033 改为 6034,完成配置、重载、验证三步,并记录验证命令与输出。
2. 为用户 app 设置 max_connections=50,并使用脚本并发连接 60 次,观察被拒绝的连接数量。
3. 人为停止后端 MySQL,观察 stats_mysql_connection_pool 中状态变化并给出排错步骤。