美文网首页
12、读写分离中间件-ProxySQL

12、读写分离中间件-ProxySQL

作者: 一个反派人物 | 来源:发表于2021-03-20 16:48 被阅读0次

    1、安装

    添加yum源

    cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
    [proxysql_repo]
    name= ProxySQL YUM repository
    baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.1.x/centos/\$releasever
    gpgcheck=1
    gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key
    EOF
    

    安装

    yum install proxysql 
    

    启动

    systemctl start proxysql-initial.service 
    systemctl start proxysql.service 
    

    2、ProxySQL相关文件

    ProxySQL使用SQLITE数据库,Proxysql很多东西是存储在这个迷你数据库里面的。数据库目录在/var/lib/proxysql

    /var/lib/proxysql
    
    -rw-r--r-- 1 root root   1078 Mar 20 12:17 proxysql-ca.pem
    -rw-r--r-- 1 root root   1062 Mar 20 12:17 proxysql-cert.pem
    -rw------- 1 root root 196608 Mar 20 12:17 proxysql.db.bak
    -rw-r--r-- 1 root root   1679 Mar 20 12:17 proxysql-key.pem
    -rw------- 1 root root   4097 Mar 20 12:17 proxysql.log
    -rw------- 1 root root 163840 Mar 20 12:31 proxysql_stats.db
    

    配置文件/etc/proxysql.cnf

    3、配置系统

    配置系统分为3层

    • RUNTIME层,是proxysql运行过程中实际采用的配置
    • MEMORY层,是修改proxysql的唯一正常入口。一般的,修改一个配置,先改Memory,确认无误后再接入生产(RUNTIME),和持久化到磁盘(DISK)
    • DISK和CONFIG FILE层,是持久化层,持久化层主要将数据存储在sqlite($(DATADIR)/proxysql.db.)数据库中和文件中(/etc/proxysql.cnf)。
    +-------------------------+
    |         RUNTIME         |
    +-------------------------+
           /|\          |
            |           |
        [1] |       [2] |
            |          \|/
    +-------------------------+
    |         MEMORY          |
    +-------------------------+ _
           /|\          |      |\
            |           |        \
        [3] |       [4] |         \ [5]
            |          \|/         \
    +-------------------------+  +-------------------------+
    |          DISK           |  |       CONFIG FILE       |
    +-------------------------+  +-------------------------+
    

    3.1 配置修改命令

    mysql servers的配置修改为例
    (1)将memory中的配置应用到runtime

    LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME
    

    (2)将runtime配置拉一份到memory

    SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME
    

    (3)将DISK的配置拉一份到memory中来

    LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK
    

    (4)将memory中的配置保存到DISK中去

    SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK
    

    (5)将CONFIG FILE的配置加载到memory中

    LOAD MYSQL SERVERS FROM CONFIG
    

    4、ProxySQL实现读写分离

    准备环境为mysql 1主2从,向主库写入,在从库读取

    db01 (10.0.0.51:3307) , mysql master
    db02 (10.0.0.52:3307) , mysql slave
    db03 (10.0.0.53:3307) , mysql slave 
    proxysql (10.0.0.53:6033) , app+proxysql
    

    4.1 proxysql登录

    proxysql对外提供两个端口6032、6033

    • 6032是管理口,登陆到proxysql的管理端
    • 6033是业务口,登录后用于对后端数据库进行sql操作,6033也是供前端业务所使用的端口

    登录管理端口6032

    mysql -uadmin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
    

    4.2 proxysql录入主从信息

    主库master节点放到group 0中,salve节点放到group1。

    INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'10.0.0.51',3307);
    INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1,'10.0.0.52',3307);
    INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1,'10.0.0.53',3307);
    commit;
    

    查看信息

    select hostgroup_id,hostname,port,status from mysql_servers;
    

    4.3 mysql数据库创建监控及应用账户

    • proxysql是监控账户用于心跳监控
    • sbuser是应用账户用于对数据库进行读写操作

    只需在主库上创建,从库会自动同步

    CREATE USER 'proxysql'@'10.0.0.%' IDENTIFIED BY '123';
    GRANT USAGE ON  *.* TO 'proxysql'@'10.0.0.%';
    CREATE USER 'sbuser'@'10.0.0.%' IDENTIFIED BY '123';
    GRANT ALL ON * . * TO 'sbuser'@'10.0.0.%';
    FLUSH PRIVILEGES;
    

    4.4 proxysql创建监控及应用账户

    创建监控账户

    UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username';
    UPDATE global_variables SET variable_value='123' WHERE variable_name='mysql-monitor_password';
    commit;
    

    创建应用账户

    INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sbuser','123',0);
    commit;
    

    4.5 proxysql应用配置变更

    LOAD MYSQL VARIABLES TO RUNTIME;
    SAVE MYSQL VARIABLES TO DISK;
    
    LOAD MYSQL SERVERS TO RUNTIME;
    SAVE MYSQL SERVERS TO DISK;
    
    LOAD MYSQL USERS TO RUNTIME;
    SAVE MYSQL USERS TO DISK;
    

    4.6 查看mysql监控情况

    SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
    SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
    

    4.7 读写分离配置

    proxysql的实现方式是做sql路由,可以自定义sql路由规则。这里我们将所有除了select* from update的select全部发送到slave,其他的的语句发送到master。

    INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',0,1);
    INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',1,1);
    commit;
    
    #rule_id按顺序号进行规则匹配,不配置默认从1累加
    #active表示是否启用这个sql路由项
    #match_pattern是正则匹配项
    #destination_hostgroup表示我们要将该类sql转发到的mysql组
    #apply为1表示该正则匹配后,将不再接受其他匹配,直接转发。
    

    应用配置变更

    LOAD MYSQL QUERY RULES TO RUNTIME;
    SAVE MYSQL QUERY RULES TO DISK;
    

    4.8 读写分离检验

    登录业务端检验

    mysql -usbuser -p123 -h 127.0.0.1 -P6033
    

    select @@server_id被分配到slave


    做一个事务,不以select语句开头,begin;select @@server_id;commit;,被分配到master

    相关文章

      网友评论

          本文标题:12、读写分离中间件-ProxySQL

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