实验环境:
机器名称 | IP配置 | 服务角色 | 备注 |
---|---|---|---|
proxy | 192.168.93.20 | proxysql控制器 | 用于监控管理 |
master | 192.168.93.10 | 数据库主服务器 | |
slave1 | 192.168.93.11 | 数据库从服务器 | |
slave2 | 192.168.93.12 | 数据库从服务器 |
软件的获取:
https://repo.proxysql.com/ProxySQL/proxysql-2.7.x/centos/8/proxysql-2.7.0-1-centos8.x86_64.rpm
软件安装:
[root@Rocky-1 ~]# dnf install proxysql-2.7.0-1-centos8.x86_64.rpm
启动ProxySQL:
[root@Rocky-1 ~]# systemctl enable --now proxysql
下载mariadb,方便本地登录[root@Rocky-1 ~]# yum install mariadb.x86_64
#管理员用户登录[root@Rocky-1 ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032
可见有五个库: main、disk、stats 、monitor 和 stats_history
main: 内存配置数据库,即 MEMORY,表里存放后端 db 实例、用户验证、路由规则等信息。main 库中有如下信息:
main库下的主要表:
mysql_servers: 后端可以连接 MySQL 服务器的列表
mysql_users: 配置后端数据库的账号和监控的账号。
mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。
注: 表名以 runtime_开头的表示 ProxySQL 当前运行的配置内容,不能通过 DML 语句修改。
只能修改对应的不以 runtime 开头的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盘以供下次重启加载。
disk :持久化的磁盘的配置
stats: 统计信息的汇总
monitor:一些监控的收集信息,比如数据库的健康状态等
stats_history: 这个库是 ProxySQL 收集的有关其内部功能的历史指标
配置步骤:
1、配置ProxySQL所需要的账户:
在 Master (192.168.93.19) 的MySQL 上创建 ProxySQL 的监控账户和对外访问账户
#proxysql的监控账户
create user 'monitor'@'192.168.93.%' identified with mysql_native_password by 'Monitor@123.com';
grant all privileges on *.* to 'monitor'@'192.168.93.%' with grant option;#proxysql 的对外访问账户
create user 'proxysql'@'172.16.%.%' identified with mysql_native_password by '123456';
grant all privileges on *.* to 'proxysql'@'192.168.93.%' with grant option;
2、创建组,定义写为1,读为0:
MySQL [(none)]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) values (1,0,'proxy');
Query OK, 1 row affected (0.001 sec)MySQL [(none)]> load mysql servers to runtime;
Query OK, 0 rows affected (0.006 sec)MySQL [(none)]> save mysql servers to disk;
Query OK, 0 rows affected (0.016 sec)
3、添加主从服务器节点:
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (1,'192.168.93.10',3306);
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (0,'192.168.93.11',3306);
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (0,'192.168.93.12',3306);
#加载到当前运行时
MySQL [(none)]> load mysql servers to runtime;
#保存到磁盘
MySQL [(none)]> save mysql servers to disk;
status状态显示ONLINE在线状态,注意这里的ip地址不要写错,博主就是当时把“.”写成“,”,找了半天才发现
4、为ProxySQL监控mysql后端节点
MySQL [(none)]> use monitor
MySQL [monitor]> set mysql-monitor_username='monitor';
MySQL [monitor]> set mysql-monitor_password='Monitor@123.com';
上面这两句是修改变量的方式还可以在main库下面用sql语句方式修改
在main下修改:
MySQL [main]> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
MySQL [main]> UPDATE global_variables SET variable_value='Monitor@123.com' WHERE variable_name='mysql-monitor_password';
修改后,保存到runtime和disk
MySQL [monitor]> load mysql variables to runtime;
MySQL [monitor]> save mysql variables to disk;
查看监控账号【ProxySQL】
SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-monitor_%';
也可以这样快速定位:
MySQL [(none)]> select @@mysql-monitor_username;
+--------------------------+
| @@mysql-monitor_username |
+--------------------------+
| monitor |
+--------------------------+
1 row in set (0.00 sec)
MySQL [(none)]> select @@mysql-monitor_password;
+--------------------------+
| @@mysql-monitor_password |
+--------------------------+
| Monitor@123.com |
+--------------------------+
1 row in set (0.00 sec)
验证监控信息,ProxySQL 监控模块的指标都保存在monitor库的log表中
以下是连接是否正常的监控,对connect指标的监控 ,在前面可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常
5.对心跳信息的监控:
select * from monitor.mysql_server_ping_log limit 10;
6.查看read_only日志监控:
select * from mysql_server_read_only_log limit 5;
7.ProxySQL配置对外访问账号:(要在MySQL节点上创建)
查看mysql_users表结构:
将对外访问账号添加到mysql_users表中,我们前面已经创建
用户:proxysql 密码:123456
insert into mysql_users (username,password,default_hostgroup,transaction_persistent) values ('proxysql','123456',1,1);
load mysql users to runtime;
save mysql users to disk;
注:
transaction_persistent 如果为1,则一个完整的SQL只可能路由到一个节点;这点非常重要,主要解决这种情况:一个事务有混合的读操作和写操作组成,事务未提交前,如果事务中的读操作和写操作路由到不同节点,那么读取到的结果必然是脏数据。所以一般情况下,该值应该设置为1,尤其是业务中使用到事务机制的情况(默认为0)
mysql_users 表有不少字段,最主要的三个字段username,password,default_hostgroup
- username: 前端链接ProxySQL ,以及ProxySQL 将SQL 语句路由给MySQL所使用的的用户名
- password:用户名对应的密码,。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行select password(PASSWORD),然后将加密结果复制到该字段。
- default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为1时,则使用 proxysql 用户发送的SQL语句默认情况下将路由到hostgroup_id=1 组中的某个
在从库端1192.168.93.11上通过对方访问账号proxy连接,测试是否路由能默认到hostgroup_id=1,它是一个写组
#通过proxysql用户,创建一个keme库(192.168.93.11)
mysql> create database proxysql;
Query OK, 1 row affected (0.00 sec)
在192.168.93.12验证是否同步:
8、添加读写分离规则(mysql_query_rules):
proxysql支持正则,这里添加两条匹配规则
1、表示像select * from xxx for update这种语句都会分到到写组,
2、表示像select这种语句都会被分配到读组。
通过
[root@Rocky-1 ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032
MySQL [(none)]> use main;
插入insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(1,1,'^select .* for update$',1,1);
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(2,1,'^select',0,1);
load mysql query rules to runtime;
save mysql query rules to disk;
9、测试
可以看到不同的sql语句分配到了不同的主机库!
核心配置表
4.命令