利用ProxySQL构建PolarDB-X三节点高可用集群

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 作者介绍:廖银华,重庆市中冉数字科技有限公司系统分析师;邓海林,重庆市中冉数字科技有限公司项目经理;何龙建,重庆远通电子技术开发有限公司信息系统项目管理师作者聚焦数据治理中台架构设计与AI+业务深度融合实践,在数据质量、智能分析及高效数据处理等领域积累了扎实的实战经验,精通打造高效安全、稳定可扩展的数据中台解决方案

前言

ProxySQL作为一款高性能的MySQL中间件代理,是构建高可用、高性能MySQL集群架构的关键组件。

关于为什么要用ProxySQL构建PolarDB-X上层服务?

  • 读写分离自动化:ProxySQL能根据SQL语句类型(如SELECTINSERTUPDATE)自动区分读写请求,将写操作定向至主库,读操作分发到从库;
  • 高可用保障:实时健康检测-ProxySQL持续监控PolarDB-X各个节点的状态;
  • 负载均衡化:支持基于连接数、权重、响应时间多种负载均衡算法;路由配置通过表数据操作就可完成,可以清晰看见路由链路。

除开以上能力外,最重要的一点是可以统一开放IP,在企业内网中网络开放申请一般针对某个IP和端口。ProxySQL能提供一个IP和端口供应用层系统使用,避免了由应用端去管理节点切换。

PolarDB-X标准版三节点集群搭建

详情可参考PolarDB开源社区官方操作文档,PolarDB-X支持多种形态的快速部署能力,可以结合各自需求选择,本文直接通过开源官网下载RPM包进行安装。

环境准备与依赖项

- 硬件/操作系统要求(CentOS 7+/Ubuntu 18.04等)
- 网络规划(私有化部署IP分配、防火墙策略)  
- 三台机器:
--10.xxx.xxx.82;
--10.xxx.xxx.83;
--10.xxx.xxx.84;

部署PolarDB-X标准版集群

1、PolarDB-X标准版RPM安装包,可以手动编译生成或从PolarDB开源官网下载,目前最新为v2.4.2。本人已经测试该版本与本文使用的ProxySQL版本兼容性,目前生产稳定运行中。

2、将下载的RPM包分别上传到三台服务器上并进行安装:

[root@10-xxx-xxx-82 opt]# rpm -ivh   t-polardbx-engine-8.4.19-20241112.el7.x86_64.rpm
完成后的目录是这样的
[root@10-xxx-xxx-82 polardbx_engine]# ll
总用量 704
drwxr-xr-x  2 root root   4096  8月 25 22:17 bin
drwxr-xr-x  2 root root     87  8月 25 22:17 docs
drwxr-xr-x  3 root root    282  8月 25 22:17 include
drwxr-xr-x  6 root root    207  8月 25 22:17 lib
-rwxr-xr-x  1 root root 283374  8月 25 22:17 LICENSE
-rwxr-xr-x  1 root root 121462  8月 25 22:17 LICENSE.router
-rwxr-xr-x  1 root root 283374  8月 25 22:17 LICENSE-test
drwxr-xr-x  4 root root     30  8月 25 22:17 man
-rwxr-xr-x  1 root root   1622  8月 25 22:17 mysqlrouter-log-rotate
-rwxr-xr-x  1 root root    952  8月 25 22:17 README
-rwxr-xr-x  1 root root    679  8月 25 22:17 README.router
-rwxr-xr-x  1 root root    952  8月 25 22:17 README-test
drwxr-xr-x  2 root root      6  8月 25 22:17 run
drwxr-xr-x 28 root root   4096  8月 25 22:17 share
drwxr-xr-x  2 root root     77  8月 25 22:17 support-files
drwxr-xr-x  3 root root     17  8月 25 22:17 var

3、创建polarx用户并切换

useradd -ms /bin/bash polarx
echo "polarx:polarx" | chpasswd
echo "polarx    ALL=(ALL)    NOPASSWD: ALL" >> /etc/sudoers
su - polarx

4、创建安装目录

mkdir polardbx-engine
cd polardbx-engine && mkdir log mysql run data tmp

5、在polardbx-engine目录下准备my.cnf配置文件

vim my.cnf

贴入模版内容,根据具体情况修改相应配置,polardb-x和mysql配置基本一致

[mysqld]
basedir = /opt/polardbx_engine
log_error_verbosity = 2
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = mysql-binlog
binlog_format = row
binlog_row_image = FULL
master_info_repository = TABLE
relay_log_info_repository = TABLE
# change me if needed
datadir = /home/polarx/polardbx-engine/data
tmpdir = /home/polarx/polardbx-engine/tmp
socket = /home/polarx/polardbx-engine/tmp.mysql.sock
log_error = /home/polarx/polardbx-engine/log/alert.log
bind-address = 0.0.0.0
port = 4886
cluster_id = 1
cluster_info = 10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@1
server_id = 1
[mysqld_safe]
pid_file = /home/polarx/polardbx-engine/run/mysql.pid

注意:这里讲集群模式的my.cnf 配置, 以三副本模式运行,my.cnf 中的

server_id 参数在三个副本节点需要配置为不同的值;

cluster_id是用于标识一个PolarDB-X集群的唯一ID;

cluster_info参数用于指定集群的元数据信息,包括集群中所有节点的地址和端口,指定PolarDB-X集群中所有节点的信息,用于节点间的通信和元数据管理;

其他信息可自行查阅官方文档

查看polardbx-engine目录下内容:

[polarx@10-xxx-xxx-82 ~]$ cd polardbx-engine/
[polarx@10-xxx-xxx-82 polardbx-engine]$ ll
总用量 12
drwxr-xr-x 22 polarx polarx 4096 10月 14 15:55 data
drwxr-x---  2 polarx polarx   50  8月 26 14:48 log
-rw-rw-r--  1 polarx polarx  665  8月 26 15:33 my.cnf
drwxrwxr-x  2 polarx polarx    6  8月 25 22:13 mysql
drwxrwxr-x  2 polarx polarx   23  8月 26 15:33 run
drwxrwxr-x  2 polarx polarx    6  8月 26 15:33 tmp

7、集群初始化

按前述步骤,安装 RPM 后,准备好 my.cnf 和目录 (如果有任何步骤失败,请完全清理 log mysql run data tmp 等目录,重新创建。)。 然后在 3 个机器上,分别按如下方式启动:

# 10.xxx.xxx.82上执行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@1' \
--initialize-insecure
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@1' \
&
# 10.xxx.xxx.83上执行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@2' \
--initialize-insecure
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@2' \
&
# 10.xxx.xxx.84上执行 
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@3' \
--initialize-insecure
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@3' \
&

注意到,我们在启动时修改了 cluster-info 的配置项,其中的格式为 [host1]:[port1];[host2]:[port2];[host3]:[port3]@[idx] ,不同的机器,只有 [idx] 不同,[idx] 也反映了该机器是第几个 [host][port]。请根据实际机器的 ip 修改该配置项。

另外,如果要让 PolarDB-X 的副本启动为 Logger 模式(Logger 会占用更少的资源,推荐让其中一个副本配置为 Logger),需要设置cluster-log-type-node=ON。Logger为节省成本而设计的副本类型,仅提供多数派协议服务,不提供数据服务。

# 比如我们把第三个主机,配置为logger模式
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
cluster-log-type-node=ON \
--cluster-info='10.xxx.xxx.82:14886;10.xxx.xxx.83:14886;10.xxx.xxx.84:14886@3' \
&
# 如果配置了Logger节点,则该节点无法提供数据服务,只会存储日志,本案采用的是3个数据副本启动

启动后可进入log目录查看alert.log日志

[polarx@10-xxx-xxx-82 polardbx-engine]$ tail -f ./log/alert.log

8、验证安装

登录三台数据库。如果直接使用本文的 my.cnf 模板,可以用mysql -h127.0.0.1 -P4886 -uroot 登录数据库。 (需要预先在机器上安装 mysql 客户端,centos 系统可以使用 yum install mysql 安装。)

[polarx@10-xxx-xxx-82 polardbx-engine]$ mysql -h 127.0.0.1 -P 4886 -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 72906
Server version: 8.0.32-X-Cluster-8.4.19-20241112 Source distribution
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

分别登录每个数据库副本,执行下面的命令,可以看到每个副本的角色(Leader,Follower,Logger)。

mysql> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_LOCAL \G
*************************** 1. row ***************************
          SERVER_ID: 1
       CURRENT_TERM: 69
     CURRENT_LEADER: 10.xxx.xxx.82:14886
       COMMIT_INDEX: 22100326
      LAST_LOG_TERM: 69
     LAST_LOG_INDEX: 22100326
               ROLE: Leader
          VOTED_FOR: 1
   LAST_APPLY_INDEX: 22100326
SERVER_READY_FOR_RW: Yes
      INSTANCE_TYPE: Normal
1 row in set (0.00 sec)
# 在 Leader 节点上执行下面的命令,可以看到整个集群的状态。
mysql>  SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL;
+-----------+--------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
| SERVER_ID | IP_PORT            | MATCH_INDEX | NEXT_INDEX | ROLE     | HAS_VOTED | FORCE_SYNC | ELECTION_WEIGHT | LEARNER_SOURCE | APPLIED_INDEX | PIPELINING | SEND_APPLIED |
+-----------+--------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
|         1 | 10.xxx.xxx.82:14886 |    22100388 |          0 | Leader   | Yes       | No         |               5 |              0 |      22100388 | No         | No           |
|         2 | 10.xxx.xxx.83:14886 |    22100388 |   22100389 | Follower | Yes       | No         |               5 |              0 |        208402 | Yes        | No           |
|         3 | 10.xxx.xxx.84:14886 |    22100387 |   22100389 | Follower | No        | No         |               5 |              0 |      22100385 | Yes        | No           |
+-----------+--------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
3 rows in set (0.00 sec)
mysql>

到这里三节点的高可用集群就安装完毕了。


通过ProxySQL构建PolarDB-X高可用集群

ProxySQL执行图,6032是admin管理端口、6033是客户端应用端口(SQL操作)

ProxySQL部署

本文操作版本选择ProxySQLv2.4.8(兼容性已验证),安装方式(RPM包或源码编译);

下载地址:https://github.com/sysown/proxysql/releases/tag/v2.4.8


1、在指定机器安装ProxySQL服务(本文档案例部署在10.xxx.xxx.82机器上):

rpm -ivh proxysql-2.4.8-1-centos7.x86_64.rpm --nodeps
[root@10-xxx-xxx-82 opt]# sudo systemctl start proxysql
[root@10-xxx-xxx-82 opt]# sudo systemctl status proxysql
● proxysql.service - High Performance Advanced Proxy for MySQL
   Loaded: loaded (/etc/systemd/system/proxysql.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2025-02-13 18:50:39 CST; 17h ago
  Process: 23894 ExecStart=/usr/bin/proxysql --idle-threads -c /etc/proxysql.cnf $PROXYSQL_OPTS (code=exited, status=0/SUCCESS)
 Main PID: 23896 (proxysql)
    Tasks: 32
   Memory: 31.0M
   CGroup: /system.slice/proxysql.service
           ├─23896 /usr/bin/proxysql --idle-threads -c /etc/proxysql.cnf
           └─23897 /usr/bin/proxysql --idle-threads -c /etc/proxysql.cnf
Feb 13 18:50:39 10-xxx-xxx-82 systemd[1]: Starting High Performance Advanced Proxy for MySQL...
Feb 13 18:50:39 10-xxx-xxx-82 proxysql[23894]: 2025-02-13 18:50:39 [INFO] Using config file /etc/proxysql.cnf
Feb 13 18:50:39 10-xxx-xxx-82 proxysql[23894]: 2025-02-13 18:50:39 [INFO] Current RLIMIT_NOFILE: 102400
Feb 13 18:50:39 10-xxx-xxx-82 proxysql[23894]: 2025-02-13 18:50:39 [INFO] Using OpenSSL version: OpenSSL 3.0.8 7 Feb 2023
Feb 13 18:50:39 10-xxx-xxx-82 proxysql[23894]: 2025-02-13 18:50:39 [INFO] SSL keys/certificates found in datadir (/var/lib/proxysql): loading them.
Feb 13 18:50:39 10-xxx-xxx-82 systemd[1]: Started High Performance Advanced Proxy for MySQL.

2、配置PolarDB-X集群(目的让ProxySQL识别PolarDB-X集群的leader\follower)

通过PolarDB集群的Leader节点创建依赖视图。(通过主节点创建视图后,follower节点会自动同步)

本案例中当前Leader节点为:10.xxx.xxx.82 机器

CREATE VIEW sys.gr_member_routing_candidate_status AS 
SELECT IF(ROLE='Leader' OR ROLE='Follower', 'YES', 'NO' ) as viable_candidate,
       IF(ROLE <>'Leader', 'YES', 'NO' ) as read_only,
       IF (ROLE = 'Leader', 0, LAST_LOG_INDEX - LAST_APPLY_INDEX) as transactions_behind,
       0 as 'transactions_to_cert' 
FROM information_schema.ALISQL_CLUSTER_LOCAL;
--注意如果有Logger节点服务,不能提供数据服务,该地方只录入了Leader和Follower节点

创建ProxySQL监控账户“proxysql_monitor”,ProxySQL运行通用依赖

create user 'proxysql_monitor'@'%' identified with mysql_native_password by '123456';
GRANT SELECT on sys.* to 'proxysql_monitor'@'%';
--注意这里的密码请修改为复核您自己要求的密码

创建一个测试用户

create user 'admin2'@'%' identified with mysql_native_password by '123456';
GRANT all privileges on *.* to 'admin2'@'%';
--注意这个用户也可以直接创建一个可使用的高权限用户,密码也需要调整

检查配置是否生效

mysql> select @@port;
+--------+
| @@port |
+--------+
|   4886 |
+--------+
1 row in set (0.00 sec)
mysql> select * from information_schema.ALISQL_CLUSTER_GLOBAL;
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | NEXT_INDEX | ROLE     | HAS_VOTED | FORCE_SYNC | ELECTION_WEIGHT | LEARNER_SOURCE | APPLIED_INDEX | PIPELINING | SEND_APPLIED |
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
|         1 | 10.xxx.xxx.84:14886 |          18 |         19 | Follower | Yes       | No         |               5 |              0 |            18 | Yes        | No           |
|         2 | 10.xxx.xxx.83:14886 |          18 |         19 | Follower | Yes       | No         |               5 |              0 |            18 | Yes        | No           |
|         3 | 10.xxx.xxx.82:14886 |          18 |          0 | Leader   | Yes       | No         |               5 |              0 |            17 | No         | No           |
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
3 rows in set (0.00 sec)
--Logger节点不能提供数据服务
  mysql>  select * from sys.gr_member_routing_candidate_status ;
+------------------+-----------+---------------------+----------------------+
| viable_candidate | read_only | transactions_behind | transactions_to_cert |
+------------------+-----------+---------------------+----------------------+
| YES              | NO        |                   0 |                    0 |
+------------------+-----------+---------------------+----------------------+
1 row in set (0.00 sec)
mysql>  select User,Host from mysql.user where User in ('admin2', 'proxysql_monitor');
+------------------+------+
| User             | Host |
+------------------+------+
| admin2           | %    |
| proxysql_monitor | %    |
+------------------+------+
2 rows in set (0.00 sec)

3、后端节点注册与路由规则

连接ProxySQL服务管理端

mysql -uadmin -padmin -h 127.0.0.1 -P 6032 -A

检查需要配置的表单

#检查
mysql> select * from mysql_group_replication_hostgroups;
Empty set (0.00 sec)
mysql> select * from mysql_servers;
Empty set (0.00 sec)
mysql> select * from mysql_query_rules;
Empty set (0.00 sec)

mysql_replication_hostgroups表中的记录包含了主机组的相关信息,包括主机组ID、主服务器和从服务器的配置、读写分离规则、复制延迟等。通过对该表的配置,可以定义并管理ProxySQL的主从复制配置,实现高可用和负载均衡的数据库访问。


mysql_servers表是ProxySQL中用于配置MySQL服务器信息的表。它存储了与每个MySQL服务器相关的详细信息,包括主机名、端口、用户名、密码、权重、状态等。

通过在mysql_servers表中添加或更新记录,你可以告诉ProxySQL如何连接到MySQL服务器。这些记录定义了ProxySQL与后端MySQL服务器之间的连接和负载均衡策略。每个记录代表一个MySQL服务器实例


mysql_query_rules表是ProxySQL中用于定义查询规则的表;

在ProxySQL中,查询规则决定了如何处理不同类型的查询语句。通过在mysql_query_rules表中定义查询规则,可以实现灵活的查询路由和行为控制;


将我们在前面创建的监控账号更新到proxySQL中

UPDATE global_variables SET variable_value='proxysql_monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='123456' WHERE variable_name='mysql-monitor_password';
#检查:
mysql> select * from global_variables where variable_name in ('mysql-monitor_username', 'mysql-monitor_password');
+------------------------+------------------+
| variable_name          | variable_value   |
+------------------------+------------------+
| mysql-monitor_password | 123456           |
| mysql-monitor_username | proxysql_monitor |
+------------------------+------------------+
2 rows in set (0.00 sec)

添加测试账号

INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('admin2','123456',10);
#检查
mysql> select * from mysql_users;
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+
| username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections | attributes | comment |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+
| admin2   | 123456   | 1      | 0       | 10                | NULL           | 0             | 1                      | 0            | 1       | 1        | 10000           |            |         |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+
1 row in set (0.00 sec)

mysql_users表是ProxySQL中的一个配置表,用于存储与MySQL用户相关的信息

在ProxySQL中,mysql_users表定义了在连接到MySQL服务器时使用的用户名和密码,以及该用户在ProxySQL中的权限和其他属性。通过在mysql_users表中配置用户信息,ProxySQL可以根据客户端的连接请求进行身份验证,并根据定义的权限规则控制对MySQL服务器的访问。


设置读写组,写组10,备写组20,读组30,离线组40,主节点可作为读节点

INSERT INTO mysql_group_replication_hostgroups (writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup,active,writer_is_also_reader) VALUES(10,20,30,40,1,1);
#检查
mysql> select * from mysql_group_replication_hostgroups;
+------------------+-------------------------+------------------+-------------------+--------+-------------+-----------------------+-------------------------+---------+
| writer_hostgroup | backup_writer_hostgroup | reader_hostgroup | offline_hostgroup | active | max_writers | writer_is_also_reader | max_transactions_behind | comment |
+------------------+-------------------------+------------------+-------------------+--------+-------------+-----------------------+-------------------------+---------+
| 10               | 20                      | 30               | 40                | 1      | 1           | 1                     | 0                       | NULL    |
+------------------+-------------------------+------------------+-------------------+--------+-------------+-----------------------+-------------------------+---------+
1 row in set (0.00 sec)

添加后端mysql_servers,leader节点定义为写组10, follower节点定义为备写库20。 注意这里port为节点的PolarDB-X标准版的监听端口port。


INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'10.xxx.xxx.82',4886);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (20,'10.xxx.xxx.83',4886);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (20,'10.xxx.xxx.84',4886);
mysql>  select * from mysql_servers;
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 10           | 10.xxx.xxx.82 | 4886 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 20           | 10.xxx.xxx.83 | 4886 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 20           | 10.xxx.xxx.84 | 4886 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
3 rows in set (0.00 sec)
mysql>

配置读写分离规则。对于SELECT FOR UPDATE配置到写库,纯SELECT配置到读库

INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^select.*for update$',10,1);
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^select',30,1);
mysql> select * from mysql_query_rules;
+---------+--------+----------+------------+--------+-------------+------------+------------+--------+--------------+----------------------+----------------------+--------------+---------+-----------------+-----------------------+-----------+--------------------+---------------+-----------+---------+---------+-------+-------------------+----------------+------------------+-----------+--------+-------------+-----------+---------------------+-----+-------+------------+---------+
| rule_id | active | username | schemaname | flagIN | client_addr | proxy_addr | proxy_port | digest | match_digest | match_pattern        | negate_match_pattern | re_modifiers | flagOUT | replace_pattern | destination_hostgroup | cache_ttl | cache_empty_result | cache_timeout | reconnect | timeout | retries | delay | next_query_flagIN | mirror_flagOUT | mirror_hostgroup | error_msg | OK_msg | sticky_conn | multiplex | gtid_from_hostgroup | log | apply | attributes | comment |
+---------+--------+----------+------------+--------+-------------+------------+------------+--------+--------------+----------------------+----------------------+--------------+---------+-----------------+-----------------------+-----------+--------------------+---------------+-----------+---------+---------+-------+-------------------+----------------+------------------+-----------+--------+-------------+-----------+---------------------+-----+-------+------------+---------+
| 1       | 1      | NULL     | NULL       | 0      | NULL        | NULL       | NULL       | NULL   | NULL         | ^select.*for update$ | 0                    | CASELESS     | NULL    | NULL            | 10                    | NULL      | NULL               | NULL          | NULL      | NULL    | NULL    | NULL  | NULL              | NULL           | NULL             | NULL      | NULL   | NULL        | NULL      | NULL                | NULL | 1     |            | NULL    |
| 2       | 1      | NULL     | NULL       | 0      | NULL        | NULL       | NULL       | NULL   | NULL         | ^select              | 0                    | CASELESS     | NULL    | NULL            | 30                    | NULL      | NULL               | NULL          | NULL      | NULL    | NULL    | NULL  | NULL              | NULL           | NULL             | NULL      | NULL   | NULL        | NULL      | NULL                | NULL | 1     |            | NULL    |
+---------+--------+----------+------------+--------+-------------+------------+------------+--------+--------------+----------------------+----------------------+--------------+---------+-----------------+-----------------------+-----------+--------------------+---------------+-----------+---------+---------+-------+-------------------+----------------+------------------+-----------+--------+-------------+-----------+---------------------+-----+-------+------------+---------+
2 rows in set (0.00 sec)

保存配置并载入内存生效

save mysql users to disk;
save mysql servers to disk;
save mysql query rules to disk;
save mysql variables to disk;
save admin variables to disk;
load mysql users to runtime;
load mysql servers to runtime;
load mysql query rules to runtime;
load mysql variables to runtime;
load admin variables to runtime;

利用远程连接工具验证是否正常:

image.png


因为本案例ProxySQL部署和PolarDB-X集群主节点部署在一台机器上,所以链接的IP地址为:10.xxx.xxx.82,端口为ProxySQL默认服务端口:6033

ProxySQL常见故障

可能会出现的问题

1、ProxySQL Error: connection is locked to hostgroup 2 but trying to reach hostgroup 1

解决方案:登上proxysql的管理端执行以下命令

set mysql-set_query_lock_on_hostgroup=0;
#修改后,需要加载到RUNTIME,并保存到disk
load mysql variables to runtime;
save mysql variables to disk;
# 也可以在安装后尚未启动时修改配置文件,增加上这个参数:
mysql_variables=
{
    ......
    set_query_lock_on_hostgroup=0
}

2、java.sql.SQLException: Unknown system variable query_cache_size(记得修改proxysql内置mysql的版本号,登上proxysql的管理端执行以下命令)

update global_variables set variable_value="8.0.4" where variable_name='mysql-server_version';
#修改后,需要加载到RUNTIME,并保存到disk
load mysql variables to runtime;
save mysql variables to disk;
mysql> select * from global_variables where variable_name='mysql-server_version';
+----------------------+------------------+
| variable_name        | variable_value   |
+----------------------+------------------+
| mysql-server_version | 8.0.4 (ProxySQL) |
+----------------------+------------------+
1 row in set (0.00 sec)
mysql>
相关文章
|
24天前
|
SQL 关系型数据库 MySQL
开源新发布|PolarDB-X v2.4.2开源生态适配升级
PolarDB-X v2.4.2开源发布,重点完善生态能力:新增客户端驱动、开源polardbx-proxy组件,支持读写分离与高可用;强化DDL变更、扩缩容等运维能力,并兼容MySQL主备复制及MCP AI生态。
开源新发布|PolarDB-X v2.4.2开源生态适配升级
|
20天前
|
SQL 关系型数据库 MySQL
开源新发布|PolarDB-X v2.4.2开源生态适配升级
PolarDB-X v2.4.2发布,新增开源Proxy组件与客户端驱动,支持读写分离、无感高可用切换及DDL在线变更,兼容MySQL生态,提升千亿级大表运维稳定性。
384 24
开源新发布|PolarDB-X v2.4.2开源生态适配升级
|
20天前
|
SQL 人工智能 关系型数据库
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
AI Agent的规划能力需权衡自主与人工。阿里云RDS AI助手实践表明:开放场景可由大模型自主规划,高频垂直场景则宜采用人工SOP驱动,结合案例库与混合架构,实现稳定、可解释的企业级应用,推动AI从“能聊”走向“能用”。
695 38
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
|
SQL Kubernetes 关系型数据库
如何一键安装部署PolarDB-X
《PolarDB-X 动手实践》系列第一期,体验如何一键安装部署PolarDB-X。
|
21天前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
314 37
|
26天前
|
存储 人工智能 前端开发
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
本文介绍如何利用Qoder、阿里云ADB Supabase和通义千问图像编辑模型,快速搭建AI手办生图Flutter应用。无需传统后端,实现从前端生成到数据存储、AI服务集成的全链路敏捷开发,展现Vibe Coding的高效实践。
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
|
20天前
|
存储 消息中间件 Kafka
Confluent 首席架构师万字剖析 Apache Fluss(三):湖流一体
原文:https://jack-vanlightly.com/blog/2025/9/2/understanding-apache-fluss 作者:Jack Vanlightly 翻译:Wayne Wang@腾讯 译注:Jack Vanlightly 是一位专注于数据系统底层架构的知名技术博主,他的文章以篇幅长、细节丰富而闻名。目前 Jack 就职于 Confluent,担任首席技术架构师,因此这篇 Fluss 深度分析文章,具备一定的客观参考意义。译文拆成了三篇文章,本文是第二篇。
276 25
Confluent 首席架构师万字剖析 Apache Fluss(三):湖流一体
|
机器学习/深度学习 人工智能 自然语言处理
如何构建企业级数据智能体:Data Agent 开发实践
本篇将介绍DMS的一款数据分析智能体(Data Agent for Analytics )产品的技术思考和实践。Data Agent for Analytics 定位为一款企业级数据分析智能体, 基于Agentic AI 技术,帮助用户查数据、做分析、生成报告、深入洞察。
|
20天前
|
文字识别 测试技术 开发者
Qwen3-VL新成员 2B、32B来啦!更适合开发者体质
Qwen3-VL家族重磅推出2B与32B双版本,轻量高效与超强推理兼备,一模型通吃多模态与纯文本任务!
1250 11