一、概述
ProxySQL是MySQL的一款中间件产品,可以实现读写分离,支持Query路由功能,支持动态指定某个sql进行缓存,支持动态加载配置、故障切换和一些sql过滤功能。
详细信息:https://github.com/sysown/proxysql/wiki
二、安装配置
2.1 环境介绍:
数据库集群为一主两从架构:master–192.168.56.11 slave01–192.168.56.12 slave02–192.168.56.13,从库开启只读模式。 proxysql的IP:192.168.56.14
2.2 安装过程
2.2.1 解决依赖关系:
yum install -y perl-DBD-MySQL yum install -y perl-DBI yum install -y perl-Time-HiRes yum install -y perl-IO-Socket-SSL
复制
ProxySQL软件包下载地址
GitHub官网:https://github.com/sysown/proxysql/release
Percona官网:https://www.percona.com/downloads/proxysql
2.2.2 安装ProxySQL
rpm -ivh proxysql-1.3.9-1-centos67.x86_64.rpm
复制
配置文件路径为:/etc/proxysql.cnf
启动ProxySQL,用户名和密码都是admin。
service proxysql start
复制
查看端口,其中6032是proxysql的管理端口号,6033是对外服务的端口号
netstat -anlp|grep proxysql
复制
管理员登陆:
/usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032
复制
其中有四个库:main、disk、stats和monitor
main库:内存配置数据库,即MEMORY,表里存放后端db实例、用户验证、路由规则等信息。
(1)mysql_servers–后端可以连接MySQL服务器的列表。
(2)mysql_users–配置后端数据库的账号和监控的账号
(3)mysql_query_rules–指定query路由到后端不通服务器的规则列表
表名以runtime_开头的表示proxysql当前运行的配置内容,不能通过DML语句修改。只能修改对应的不以runtime开头的表,然后“LOAD"使其生效,"SAVE"使其存到硬盘以供下次重启加载。
disk库:持久化磁盘的配置。
stats库:统计信息的汇总。
monitor库:一些监控的收集信息,包括数据库的健康状态等。
三、监控配置
在主库192.168.56.11上创建监控账号和对外访问账号并授权
create user 'mointor'@'192.168.56.%' identified by 'monitor'; grant all privileges on *.* to 'mointor'@'192.168.56.%' with grant option; create user 'zs'@'192.168.56.%' identified by 'zs'; grant all privileges on *.* to 'zs'@'192.168.56.%' with grant option; flush privileges;
复制
四、Proxysql的多层配置系统
ProxySQL的整套配置系统分为三层,顶层为RUNTIME,中间层为MEMORY,底层为持久层DISK和CONFIG FILE。
(1)RUNTIME:代表proxysql当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层“load”进来。
(2)MEMORY:MEMORY层上面连接RUNTIME层,下面连接持久化层。可以正常操作proxysql配置,随便修改,不会影响生成环境。修改一个配置一般都是先在MEMORY层完成的,确认正常后再加载到RUMTIME和持久化到磁盘上
(3)DISK和CONFIG FILE:持久化配置信息,重启后内存中的配置信息会丢失,所以需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。
4.1 proxysql添加主从服务器列表
加载完成后三台机器都是ONLINE状态
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.56.11',3306); insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.56.12',3306); insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.56.13',3306); load mysql servers to runtime; save mysql servers to disk;
复制
4.2 为proxysql配置监控账号
set mysql-monitor_username='monitor'; set mysql-monitor_password='monitor'; load mysql variables to runtime; save mysql variables to disk;
复制
验证监控信息:
select * from monitor.mysql_server_connect_log order by time_start_us desc limit 6; select * from monitor.mysql_server_ping_log order by time_start_us desc limit 6;
复制
五、配置proxysql主从分组信息
5.1 会涉及到admin库中的表:
mysql_replication_hostgroups,该表中writer_hostgroup是写入组的编号,reader_hostgroup是读取组的编号。该处设置10为写入组,20为读取组
insert into mysql_replication_hostgroup value (10,20,'proxy'); load mysql servers to runtime; save mysql servers to disk;
复制
数据库节点read_only的值为0时会被分到10的写组,read_only为1分到编号为20的读组。
select * from mysql_servers;
复制
5.2 配置对外访问账号,默认指定主库,并对该用户开始事务持久化保护。
mysql_users表中的transaction_persistent字段默认为0,建议在创建完用户后设置为1,避免发生脏读、幻读等现象
insert into mysql_users(username,password,default_hostgroup) values ('zs','zs',10); update mysql_users set transaction_persistent=1 where username='zs'; load mysql users to runtime; save mysql users to disk;
复制
对外端口号需要指定为6033。
六、读写分离策略
6.1 配置读写分离策略
需要使用mysql_query_rules表,表中match_pattern字段代表设置的规则,destination_hostgroup字段代表默认指定的分组,apply代表真正执行应用规则。
把所有以select开头的语句全部分配到编号为20的读组中,select for update会产生一个写锁,对数据查询的时效性要求高,把它分配到编号为10的写组,其它所有操作都会默认路由到写组。
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',20,1); load mysql query rules to runtime; save mysql query rules to disk;
复制
6.2 测试读写分离
通过创建对外账号zs连接proxysql登陆数据
mysql -uzs -pzs -h 192.168.56.14 -P 6033 select * from tt;
复制
登陆管理端口,通过查询stats_mysql_query_digest监控查询状态
select * from stats_mysql_query_digest;
复制
继续测试
mysql -uzs -pzs -h 192.168.56.14 -P 6033 select * from zs.tt for update; update tt set name='ff' where score=100;
复制
登陆管理端口,通过查询stats_mysql_query_digest监控查询状态
select * from stats_mysql_query_digest;
复制
6.3 读写分离权重调整
调整192.168.56.13节点的查询权重,使读更多在该节点上
update mysql_servers set weight=10 where hostname='192.168.56.13'; load mysql query rules to runtime; save mysql query rules to disk;
复制