mysql基于proxysql实现读写分离

环境节点如下:

192.168.2.238 proxysql
192.168.2.240 mysql master
192.168.2.239 mysql slave
192.168.2.241 mysql slave

实现读写分离前,先实现主从复制(主从步骤这里不再详述,可参考使用MHA实现Mysql高可用中的操作方法https://www.jianshu.com/p/4ee738a6a787
1.安装并启动proxysql服务

wget https://github.com/sysown/proxysql/releases/download/v2.0.10/proxysql-2.0.10-1-centos7.x86_64.rpm
yum -y install proxysql-2.0.10-1-centos7.x86_64.rpm
启动proxysql服务
systemctl start proxysql
启动后会监听两个默认端口
6032:ProxySQL的管理端口
6033:ProxySQL对外提供服务的端口

image.png

使用mysql客户端连接到ProxySQL的管理接口6032,默认管理员用户和密码都
是admin:
mysql -uadmin -padmin -P6032 -h127.0.0.1

proxysql相关库的介绍

main 是默认的”数据库”名,表里存放后端db实例、用户验证、路由规则等信息。
表名以 runtime_开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,
只能修改对应的不以 runtime_ 开头的(在内存)里的表,然后 LOAD 使其生效,
SAVE 使其存到硬盘以供下次重启加载
disk 是持久化到硬盘的配置,sqlite数据文件
stats 是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、
processlist、查询种类汇总/执行时间,等等
monitor 库存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查

在main和monitor数据库中的表, runtime_开头的是运行时的配置,不能修改,
只能修改非runtime_表
show databases;


image.png
2.向proxysql中添加MySQL节点

insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.2.239',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.2.240',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.2.241',3306);

添加监控后端节点的用户。ProxySQL通过每个节点的read_only值来自动调整
它们是属于读组还是写组
在mysql master上执行
grant replication client on . to monitor@'192.168.2.%'
identified by 'monitor';

3.ProxySQL上配置监控

set mysql-monitor_username='monitor';
set mysql-monitor_password='monitor';

加载到RUNTIME,并将配置保存到disk
load mysql variables to runtime;
save mysql variables to disk;

监控模块的指标保存在monitor库的log表中
查看监控连接是否正常的 (对connect指标的监控):(如果connect_error的结果
为NULL则表示正常)
MySQL> select * from mysql_server_connect_log;


image.png

查看监控心跳信息 (对ping指标的监控):
MySQL> select * from mysql_server_ping_log;


image.png

查看read_only和replication_lag的监控日志
MySQL> select * from mysql_server_read_only_log;
MySQL> select * from mysql_server_replication_lag_log;

4.设置proxysql分组信息

需要修改的是main库中的mysql_replication_hostgroups表,该表有3个字段:
writer_hostgroup,reader_hostgroup,comment, 指定写组的id为10,读组的id为20
insert into mysql_replication_hostgroups values(10,20,"read_only|innodb_read_only","test");

将mysql_replication_hostgroups表的修改加载到RUNTIME生效
MySQL [(none)]> load mysql servers to runtime;
MySQL [(none)]> save mysql servers to disk;

Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组
select hostgroup_id,hostname,port,status,weight from mysql_servers;


image.png
5.配置发送SQL语句的用户

在mysql master节点上创建访问用户
grant all on . to proxysqluser@'192.168.2.%' identified by 'proxysqluser';

在ProxySQL配置,将用户proxysqluser添加到mysql_users表中, default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库
insert into mysql_users(username,password,default_hostgroup)
values('proxysqluser','proxysqluser',10);
load mysql users to runtime;
save mysql users to disk;

6.使用sqluser用户测试是否能路由到默认的10写组实现读、写数据

mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e 'select @@server_id'


image.png

mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e 'create database proxydb'
mysql -uproxysqluser -pproxysqluser proxydb -P6033 -h127.0.0.1 -e 'create table t1(id int)'
查看创建库和表的执行结果
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e 'show databases'


image.png
7.在proxysql上配置路由规则,实现读写分离

与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,后
者是前者的扩展表,1.4.7之后支持
插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句
SELECT...FOR UPDATE它会申请写锁,应路由到10的写组
insert into mysql_query_rules
(rule_id,active,match_digest,destination_hostgroup,apply)VALUES
(1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
因ProxySQL根据rule_id顺序进行规则匹配,select ... for update规则的
rule_id必须要小于普通的select规则的rule_id

测试读操作是否路由给20的读组
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e 'select @@server_id'


image.png

测试写操作,以事务方式进行测试
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1
-e 'start transaction;select @@server_id;commit;select @@server_id'
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e 'insert proxydb.t1 values (1)'
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e 'select id from proxydb.t1'

image.png

路由的信息:查询stats库中的stats_mysql_query_digest表
SELECT hostgroup hg,sum_time, count_star, digest_text
FROM stats_mysql_query_digest ORDER BY sum_time DESC;


image.png

到此基于proxysql的读写分离搭建完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358