美文网首页
mysql基于proxysql实现读写分离

mysql基于proxysql实现读写分离

作者: 牵挂包含一种欣赏 | 来源:发表于2020-05-07 13:14 被阅读0次
    环境节点如下:

    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的读写分离搭建完成。

    相关文章

      网友评论

          本文标题:mysql基于proxysql实现读写分离

          本文链接:https://www.haomeiwen.com/subject/zakumhtx.html