LOAD xxxx TO RUNTIME;
SAVE xxxx TO DISK;## CFG 到 MEM
LOAD MYSQL SERVERS FROM CONFIG
===============================` mysql query rules配置
## MEM 加载到runtime
LOAD MYSQL QUERY RULES TO RUNTIME;
## runtime 保存至 MEM
SAVE MYSQL QUERY RULES TO MEMORY;
## disk 加载到 MEM
LOAD MYSQL QUERY RULES FROM DISK;
## MEM 到 disk
SAVE MYSQL QUERY RULES TO DISK;
## CFG 到 MEM
LOAD MYSQL QUERY RULES FROM CONFIG
=================================` MySQL variables配置
## MEM 加载到runtime
LOAD MYSQL VARIABLES TO RUNTIME;## runtime 保存至 MEM
SAVE MYSQL VARIABLES TO MEMORY;## disk 加载到 MEM
LOAD MYSQL VARIABLES FROM DISK;## MEM 到 disk
SAVE MYSQL VARIABLES TO DISK;## CFG 到 MEM
LOAD MYSQL VARIABLES FROM CONFIG
'总结:
日常配置其实大部分时间在MEM配置,然后load到RUNTIME,然后SAVE到DIsk。cfg很少使用。
例如 :
load xxx to runtime;
save xxx to disk;
'注意:
只有load到 runtime 状态时才会验证配置。在保MEM或disk时,都不会发生任何警告或错误。当load到 runtime 时,如果出现错误,将恢复为之前保存得状态,这时可以去检查错误日志。
ProxySQL应用——基于SQL的读写分离
## 因为读写分离是基于是否节点里有read_only参数来判定的,然后根据这个参数,来自动识别和加载节点到对应的读或写组
0. 从库设定read_only参数
set global read_only=1;set global super_read_only=1;
1. 在mysql_replication_hostgroup表中,配置读写组编号
## 一套proxysql是可以管理多个架构组的,而不只是一个。[root@db03 ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
insert into
mysql_replication_hostgroups
(writer_hostgroup, reader_hostgroup, comment)
values (10,20,'proxy');
load mysql servers to runtime;
save mysql servers to disk;
db03 [main]>select * from mysql_replication_hostgroups\G
*************************** 1. row ***************************
writer_hostgroup: 10
reader_hostgroup: 20
check_type: read_only
comment: proxy
1 row inset(0.00 sec)'说明:
ProxySQL 会根据server 的read_only 的取值将服务器进行分组。 read_only=0 的server,master被分到编号为10的写组,read_only=1 的server,slave则被分到编号20的读组。所以需要将从库设置:set global read_only=1;
2. 创建监控用户,并开启监控
# 主库创建监控用户
create user monitor@'%' identified with mysql_native_password by '123';
grant replication client on *.* to monitor@'%';
# proxySQL修改variables表
set mysql-monitor_username='monitor';
set mysql-monitor_password='123';
或者 :
UPDATE global_variables SET variable_value='monitor'
WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='123'
WHERE variable_name='mysql-monitor_password';
load mysql variables to runtime;
save mysql variables to disk;
3. 添加主机到ProxySQL
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'10.0.0.51',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.52',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.53',3306);
load mysql servers to runtime;
save mysql servers to disk;
# 查询监控日志
db03 [(none)]>select * from mysql_server_connect_log;
db03 [(none)]>select * from mysql_server_ping_log;
db03 [(none)]>select * from mysql_server_read_only_log;
db03 [(none)]>select * from mysql_server_replication_lag_log;
4. 配置应用用户
# 主库
create user root@'%' identified with mysql_native_password by '123';
grant all on *.* to root@'%';
# proxysql
insert into mysql_users(username,password,default_hostgroup) values('root','123',10);
load mysql users to runtime;
save mysql users to disk;
早期版本,需要开启事务持续化。
## 如果不开启这个事务持久化,那么它会把一个数据拆分成多个语句,然后进行存放,但是加入之后,会把一个事务当成一个整体。
## 早期版本,需要手动添加,现在的是默认开启的
update mysql_users set transaction_persistent=1 where username='root';
load mysql users to runtime;
save mysql users to disk;
5. 实用的读写规则
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,'^select.*for update$',10,1);
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',20,1);
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (3,1,'^drop',30,1);
load mysql query rules to runtime;
save mysql query rules to disk;
注: select … for update规则的rule_id必须要小于普通的select规则的rule_id,ProxySQL是根据rule_id的顺序进行规则匹配。
6. 测试读写分离
[root@db03 ~]# mysql -uroot -p123 -P 6033 -h 127.0.0.1 -e "begin;select @@server_id;commit"[root@db03 ~]# mysql -uroot -p123 -P 6033 -h 127.0.0.1 -e "select @@server_id;"
db03 [(none)]>select * from stats_mysql_query_digest\G
## 通过定义没有真实存在的组,来屏蔽一些不需要的操作,比如drop,进行屏蔽。
ProxySQL应用扩展——花式路由规则(了解)
1. 基于端口的路由
## 修改ProxySQL监听SQL流量的端口号,监听多端口上。set mysql-interfaces='0.0.0.0:6033;0.0.0.0:6034';
save mysql variables to disk;## 重启生效
systemctl restart proxysql
## 设定路由规则
delete from mysql_query_rules;# 为了测试,先清空已有规则
insert into mysql_query_rules(rule_id,active,proxy_port,destination_hostgroup,apply)
values(1,1,6033,10,1), (2,1,6034,20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
说明:
除了基于端口进行分离,还可以基于监听地址(修改字段proxy_addr即可),也可以基于客户端地址(修改字段client_addr字段即可)。
2. 基于用户的路由
nsert into mysql_users(username,password,default_hostgroup)
values('writer','123',10),('reader','123',20);
load mysql users to runtime;
save mysql users to disk;
delete from mysql_query_rules;# 为了测试,先清空已有规则
insert into mysql_query_rules(rule_id,active,username,destination_hostgroup,apply)
values(1,1,'writer',10,1),(2,1,'reader',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;