ProxySQL 是 MySQL 数据库集群的高性能代理/负载平衡器。
ProxySQL 是免费和开源的,它在 GPL 许可下分发。
ProxySQL 支持数千个并发连接。
ProxySQL 可通过类似 SQL 的命令行界面进行高度定制。
在本文中,我们将在 CentOS 7 上为 MySQL 集群安装 ProxySQL 负载均衡器。
为 MySQL 集群配置 ProxySQL 用户
以 root 用户身份使用 ssh 连接 percona-01.onitroad.com。
使用 mysql 命令登录 MySQL 数据库实例并执行以下命令以创建数据库用户。
mysql> CREATE USER 'testuser'@'%' IDENTIFIED BY '123'; Query OK, 0 rows affected (1.19 sec) mysql> GRANT ALL ON RECIPES.* TO 'testuser'@'%'; Query OK, 0 rows affected (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.09 sec) mysql> EXIT Bye
使用 ssh 作为 root 用户连接到 proxysql-01.onitroad.com。
登录到 ProxySQL 管理面板并执行以下命令以在 ProxySQL 配置中添加相同的 MySQL 数据库用户。
ProxySQL> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('testuser','123',1); Query OK, 1 row affected (0.00 sec) ProxySQL> LOAD MYSQL USERS TO RUNTIME; Query OK, 0 rows affected (0.00 sec) ProxySQL> SAVE MYSQL USERS TO DISK; Query OK, 0 rows affected (0.01 sec)
现在通过 ProxySQL 负载均衡器连接到 MySQL 数据库集群。
[root@proxysql-01 ~]# mysql -u testuser -p123 -h 127.0.0.1 -P6033 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.5.30 (ProxySQL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> select @@hostname; +------------------------+ | @@hostname | +------------------------+ | percona-01.onitroad.com | +------------------------+ 1 row in set (0.00 sec) MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | RECIPES | +--------------------+ 2 rows in set (0.20 sec)
我们已经通过 ProxySQL 负载均衡器连接到 percona-01.onitroad.com 节点。
它表明我们的 ProxySQL 负载均衡器工作正常。
在 CentOS 7 上为 MySQL 安装 ProxySQL 负载均衡器
我们需要 MySQL 客户端工具来连接 ProxySQL 管理面板。
因此,我们使用 yum 命令安装 mariadb-client。
[root@proxysql-01 ~]# yum install -y mariadb
ProxySQL v2.0.6 可在 GitHub 上下载。
复制所需包的 URL 并使用 yum 命令在 CentOS 7 服务器上安装 ProxySQL。
[root@proxysql-01 ~]# yum install -y https://github.com/sysown/proxysql/releases/download/v2.0.6/proxysql-2.0.6-1-centos7.x86_64.rpm
启用并启动 ProxySQL 服务。
[root@proxysql-01 ~]# systemctl enable proxysql.service proxysql.service is not a native service, redirecting to /sbin/chkconfig. Executing /sbin/chkconfig proxysql on [root@proxysql-01 ~]# systemctl start proxysql.service
在 Linux 防火墙中允许 ProxySQL 服务端口 6033/tcp(它是 MySQL 默认端口 3306 的反向)。
[root@proxysql-01 ~]# firewall-cmd --permanent --add-port=6033/tcp success [root@proxysql-01 ~]# firewall-cmd --reload success
在 CentOS 7 上为 MySQL 配置 ProxySQL 负载均衡器
ProxySQL 在默认端口 6032/tcp 上运行其管理服务。
我们可以使用 MySQL 客户端工具连接到 ProxySQL 管理面板并根据我们的要求配置负载均衡器。
ProxySQL 的默认管理用户是 admin ,密码为 admin 。
[root@proxysql-01 ~]# mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='ProxySQL> ' Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. ProxySQL>
更改 ProxySQL 管理员用户的默认密码。
ProxySQL> UPDATE global_variables SET variable_value='admin:123' WHERE variable_name='admin-admin_credentials'; Query OK, 1 row affected (0.00 sec) ProxySQL> LOAD ADMIN VARIABLES TO RUNTIME; Query OK, 0 rows affected (0.00 sec) ProxySQL> SAVE ADMIN VARIABLES TO DISK; Query OK, 32 rows affected (0.00 sec)
将我们的后端数据库服务器(MySQL、MariaDB 或者 Percona)添加到 ProxySQL 服务器池。
我们假设我们在配置 ProxySQL 负载均衡器之前已经配置了 MySQL 节点之间的复制。
ProxySQL> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'192.168.1.209',3306); Query OK, 1 row affected (0.00 sec) ProxySQL> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'192.168.1.208',3306); Query OK, 1 row affected (0.00 sec)
查询 msql_servers 表以验证记录。
ProxySQL> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------------+------+--------+ | hostgroup_id | hostname | port | status | +--------------+-----------------+------+--------+ | 1 | 192.168.1.209 | 3306 | ONLINE | | 1 | 192.168.1.208 | 3306 | ONLINE | +--------------+-----------------+------+--------+ 2 rows in set (0.00 sec)
配置 ProxySQL 节点监控
ProxySQL 需要 MySQL 集群中的数据库用户来监控 MySQL 节点。
以 root 用户身份使用 ssh 连接 percona-01.onitroad.com。
登录 MySQL 数据库实例并执行以下命令以创建具有必要权限的监控用户。
[root@percona-01 ~]# mysql -u root -p123 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 14 Server version: 5.7.27-30-57-log Percona XtraDB Cluster (GPL), Release rel30, Revision 64987d4, WSREP version 31.39, wsrep_31.39 Copyright (c) 2009-2019 Percona LLC and/or its affiliates Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. 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> CREATE USER 'monitor'@'%' IDENTIFIED BY 'Ahm3r'; Query OK, 0 rows affected (0.04 sec) mysql> GRANT SELECT ON sys.* TO 'monitor'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> EXIT Bye
使用 ssh 作为 root 用户连接到 proxysql-01.onitroad.com。
使用 mysql 命令登录到 ProxySQL 管理面板。
在全局变量中定义监控用户名/密码。
ProxySQL> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username'; Query OK, 1 row affected (0.00 sec) ProxySQL> UPDATE global_variables SET variable_value='Ahm3r' WHERE variable_name='mysql-monitor_password'; Query OK, 1 row affected (0.00 sec)
配置监视间隔如下。
ProxySQL> UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval'); Query OK, 3 rows affected (0.00 sec)
将更改加载到运行系统中使更改生效。
ProxySQL> LOAD MYSQL VARIABLES TO RUNTIME; Query OK, 0 rows affected (0.01 sec) ProxySQL> LOAD MYSQL SERVERS TO RUNTIME; Query OK, 0 rows affected (0.01 sec)
将更改保存到磁盘以保持持久性。
ProxySQL> SAVE MYSQL VARIABLES TO DISK; Query OK, 121 rows affected (0.00 sec) ProxySQL> SAVE MYSQL SERVERS TO DISK; Query OK, 0 rows affected (0.06 sec)
查询连接日志表,验证ProxySQL与MySQL集群节点的连通性。
ProxySQL> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10; +-----------------+------+------------------+-------------------------+---------------+ | hostname | port | time_start_us | connect_success_time_us | connect_error | +-----------------+------+------------------+-------------------------+---------------+ | 192.168.1.209 | 3306 | 1569689633319939 | 1248 | NULL | | 192.168.1.208 | 3306 | 1569689633280911 | 1291 | NULL | | 192.168.1.208 | 3306 | 1569689631309213 | 1193 | NULL | | 192.168.1.209 | 3306 | 1569689631278225 | 1107 | NULL | | 192.168.1.208 | 3306 | 1569689629316735 | 1252 | NULL | | 192.168.1.209 | 3306 | 1569689629277982 | 1415 | NULL | | 192.168.1.209 | 3306 | 1569689627305699 | 1168 | NULL | | 192.168.1.208 | 3306 | 1569689627274188 | 1095 | NULL | | 192.168.1.209 | 3306 | 1569689625308582 | 1276 | NULL | | 192.168.1.208 | 3306 | 1569689625273728 | 1252 | NULL | +-----------------+------+------------------+-------------------------+---------------+ 10 rows in set (0.00 sec)
安装环境
我们使用的3台服务器配置如下:
ProxySQL 负载均衡器:
- CPU - 3.4 GHz(2 核)
- 内存 - 1 GB
- 存储 - 20 GB
- 主机名 - proxysql-01.onitroad.com
- IP 地址 - 192.168.1.210 /24
- 操作系统 - CentOS 7.6
MySQL 集群节点 1:
- CPU - 3.4 GHz(2 核)
- 内存 - 1 GB
- 存储 - 60 GB
- 主机名 - percona-01.onitroad.com
- IP 地址 - 192.168.1.209 /24
- 操作系统 - CentOS 7.6
MySQL 集群节点 2:
- CPU - 3.4 GHz(2 核)
- 内存 - 1 GB
- 存储 - 60 GB
- 主机名 - percona-02.onitroad.com
- IP 地址 - 192.168.1.208 /24
- 操作系统 - CentOS 7.6