暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅谈MySQL之ProxySQL

原创 张sir 2020-09-15
1301

一、概述

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;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 一、概述
  • 二、安装配置
    • 2.1 环境介绍:
    • 2.2 安装过程
      • 2.2.1 解决依赖关系:
      • 2.2.2 安装ProxySQL
  • 三、监控配置
  • 四、Proxysql的多层配置系统
    • 4.1 proxysql添加主从服务器列表
    • 4.2 为proxysql配置监控账号
  • 五、配置proxysql主从分组信息
    • 5.1 会涉及到admin库中的表:
    • 5.2 配置对外访问账号,默认指定主库,并对该用户开始事务持久化保护。
  • 六、读写分离策略
    • 6.1 配置读写分离策略
    • 6.2 测试读写分离
    • 6.3 读写分离权重调整