• MHA+ProxySQL 读写分离高可用


    文档结构如下:

    1、ProxySQL说明

    ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加载配置,故障切换和一些sql的过滤功能。

    其他产品:Dbproxy,MyCAT,OneProxy等。

    2、MHA+Proxysql 读写分离实验

    2.1. 安装步骤

    IP

    角色

    操作系统

    版本

    172.16.10.21

    Proxysql

    Redhat6.7

    1.4.9

    172.16.10.32

    Master

    Redhat6.7

    5.7.20

    172.16.10.34

    Slave1

    Redhat6.7

    5.7.20

    172.16.10.36

    Salve2

    Redhat6.7

    5.7.20

    172.16.10.30

    VIP

    从库开启read_only=1,主库read_only=0

    ProxySQL安装源码包:

    yum -y install perl-DBD-MYSQL perl-DBI perl-Time-Hires perl-IO-Socket-ssl

    或者简单粗暴的 :yum -y install perl*

    proxySQL软件包下载地址:

    https://www.percona.com/downloads/proxysql/

    安装proxysql

    rpm -ivh proxysql-1.4.9-1.1.el6.x86_64.rpm

    配置文件路径为:/etc/proxysql.cnf

    启动proxysql

    service proxysql start

     

    netstat -anlp |grep proxysql

     

    6032是管理端口,6033是对外服务的端口号

    用户名和密码默认都是admin

    使用帮助如下:

     

    查看proxysql 安装库情况:

    mysql -uadmin -padmin -h127.0.0.1 -P6032

     

    2.2. Proxysql库说明

    Proxysql 版本1.4.9-percona-1.1实例:

    Main:内存配置数据库,即memory,表里存放后端db实例,用户验证,路由规则等信息。Main库中有如下信息:

     

    mysql_servers          --后端可以连接mysql服务器的列表                   

    mysql_users            --配置后端数据库的账号和监控的账号

    mysql_query_rules    --指定query路由到后端不同服务器的规则列表

    disk库:持续化磁盘的配置。

    Stats库:统计信息的汇总。

    Monitor库:一些监控的收集信息,包括数据库的健康状态。

    2.3. 配置proxysql监控

    https://github.com/sysown/proxysql/wiki/Configuring-ProxySQL

    顶层为runtime,中间层为memory,底层也就是持久层disk和config file。

    Runtime:代表Proxysql当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层load进来。

    Memory:memory层上面连接runtime层,下面连接持久化层。在这层可以正常操作Proxysql配置,随便修改,不会影响生产环境。修改一个配置一般都是现在memory层完成,确认正常后在加载到runtime和持久化到磁盘。

    Disk和config file:持久化配置信息,重启后内存的配置信息会丢失,所以需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。

    1为写组,2为读组。

    insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.32',3307);

    insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.34',3307);

    insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.36',3307);

    select * from mysql_servers;

     

    配置监控账户:

    create user 'mon'@'172.16.10.%' IDENTIFIED BY 'mon';

    GRANT all privileges ON *.* TO 'mon'@'172.16.10.%' with grant option;

    对外访问账户:

    create user 'wr'@'172.16.10.%' IDENTIFIED BY 'wr';

    GRANT all privileges ON *.* TO ON *.* TO 'wr'@'172.16.10.%' with grant option;  

    配置Proxysql监控:

    set mysql-monitor_username='mon';

    set mysql-monitor_password='mon';

    load mysql servers to runtime;

    save mysql servers to disk;

     

    之后验证监控信息:

    select * from monitor.mysql_server_connect_log limit 6;

     

    select * from monitor.mysql_server_ping_log order by time_start_us limit 6;

     

    监控信息提示正常。

    2.4. 配置Proxysql主从分区信息

    配置主从分区需要用到mysql_replication_hostgroups

    show create table mysql_replication_hostgroupsG;

     

    writer_hostgroup 写入组的编号

    reader_hostgroup 读取组的编号

    实验使用10作为写入组,20作为读取组。

    insert into mysql_replication_hostgroups values(10,20,'proxy');

    load mysql servers to runtime;

    save mysql servers to disk;

    select * from mysql_replication_hostgroups;

     

    Proxysql 会根据server的read_only的取值将服务进行分组,read_only=0的server,master被分到编号为10的组,read_only=1的server,slave则被分到编号为20的读组。

    select * from mysql_servers;

     

    Mysql_users表中的 transaction_persistent字段默认为0,建议在创建完用户之后设置为1,避免发生脏读幻读等现象:

    insert into mysql_users(username,password,default_hostgroup) values('wr','wr',10);

    update mysql_users set transaction_persistent=1 where username='wr';

    load mysql users to runtime;

    save mysql users to disk;

    测试登陆(端口6033):

    mysql -uwr -pwr -h 172.16.10.34 -P3307 -e "show slave statusG"

     

    2.5. 配置读写分离策略

    配置读写分离使用的表mysql_query_rules:

    match_pattern:字段就是代表设置的规则。

    destination_hostgroup:字段代表默认指定的分组。

    apply代表真正执行应用规则。

    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;

    2.6. 测试读写分离

    通过wr所创建的账户连接Proxysql登陆数据库。

    mysql -uwr -pwr -h172.16.10.21 -P6033

     

    通过管理端口登陆查看:

    mysql -uadmin -padmin -h127.0.0.1 -P6032

    select * from stats_mysql_query_digest;

     

    可以得知,select count(*) from t; 这条语句自动编号到20的读组上,即slave上。

    测试update。

     

    测试update语句在10的写组上。

    2.7. 读写分离权重调整

    读写分离设置成功后,可以调节权重,如slave2(172.16.10.36)多进行读操作。

    update mysql_servers set weight=10 where hostname='172.16.10.36';

    load mysql servers to runtime;

    load mysql variables to runtime;

    load mysql users to runtime;

    save mysql servers to disk;

    save mysql variables to disk;

    save mysql users to disk;

     

    select * from mysql_servers;

     

    2.8. MHA failover测试

    测试前:

    Master 172.16.10.32为master,组数为10,写组。

    Failover后:

     

    新的master为172.16.10.34(原slave1)

    select * from runtime_mysql_servers;

     

    新的master为写组(10),原为20读组。

    进行读写分离测试:

     

    发现读写分离仍然成功(回切后也成功)。

     

  • 相关阅读:
    让思考成为一种习惯:今年,我大四了
    asp.net core源码飘香:Logging组件
    asp.net core源码飘香:Options组件
    asp.net core源码飘香:Configuration组件
    asp.net core源码飘香:从Hosting开始
    webpack code split实现原理
    css specificity
    todo:read
    React Render Props 模式
    recompose mapProps 函数指南
  • 原文地址:https://www.cnblogs.com/hmwh/p/9397452.html
Copyright © 2020-2023  润新知