• 配置proxysql进行mysql的读写分离


    proxysql简介

    proxysql是一款高性能的mysql中间件,可以实现读写分离,查询重写,防火墙,数据库监控等功能。是目前percona主推的一款数据库中间件产品。

    proxysql安装配置

    实验环境:
    两台服务器配置mysql GTID主从复制,一台为master,一台为slave。master负责写入数据,slave只负责读取数据。主从复制配置方法可以参考我之前的博客https://www.cnblogs.com/stacks/p/7171648.html
    配置方法

    1. 安装proxysql
      目前proxysql托管在github,也可以通过其官网登录到github进行下载http://www.proxysql.com/,下载下来为rpm包,直接安装即可。
    2. 配置proxysql
      proxysql安装完成之后由一下几个配置文件组成:
    • /etc/init.d/proxysql
    • /etc/proxysql.cnf #proxysql主配置文件,可以直接在库中修改proxysql配置,也可以在此文件指定配置信息
    • /usr/bin/proxysql
    • /usr/share/proxysql/tools/proxysql_galera_checker.sh
    • /usr/share/proxysql/tools/proxysql_galera_writer.pl
      proxysql数据目录下有如下文件:
    • proxysql.db #proxysql是以sqllite方式存储数据的,此文件是sqllite的数据文件
    • proxysql.log #日志文件
    • proxysql.pid
    • proxysql_stats.db
    1. proxysql支持不停机变更配置。其存在三个配置区:
    • runtime:当前线上正在使用的配置;
    • memory:当前编辑区,编辑完成可以加载到runtime,也可以保存到disk;
    • disk:持久化存储在磁盘
      流程图如下:
    1. proxysql启动登录
      proxysql监听在6032和6033端口,6032为管理端口,6033为数据库连接端口
      /etc/init.d/proxysql start即可启动proxysql,通过mysql客户端连接管理端口即可登录到proxysql进行管理工作:mysql -uadmin -padmin -h127.0.0.1 -P6032
      登录之后操作方法和mysql是一样的。

    2. 配置proxysql的监控用户和数据操作用户:
      首先需要在master数据库添加monitor用户和数据库操作用户,slave端会自动同步到自己的库中。

    grant usage on *.* to 'monitor'@'%' identified by 'monitor';    #创建monitor用户
    grant all on *.* to 'sbuser'@'%' identified by 'sbuser'        #添加数据操作用户
    flush privileges    #刷权限
    

    proxysql执行如下语句进行服务端和用户的添加:

    INSERT INTO MySQL_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.11.184',3306);     #hostgroupid适用于区分读写分离服务器组的,可以把所有写库加入到一个组id,所有读库加入到另一个组id
    INSERT INTO MySQL_servers(hostgroup_id, hostname, port) VALUES (1,'192.168.11.185',3306);
    INSERT INTO MySQL_users(username,password,default_hostgroup) VALUES ('sbuser','sbuser',0);   
    UPDATE global_variables SET variable_value='monitor' WHERE variable_name='MySQL-monitor_username';
    UPDATE global_variables SET variable_value='monitor' WHERE variable_name='MySQL-monitor_password';
    load mysql servers to runtime;    #加载memory刚才的配置到runtime生效
    save mysql servers to disk;    #持久化配置到sqlite存储中
    

    mysql_servers表用于存储proxysql后端服务器,mysql_users表用于存储后端服务器数据库账号和密码
    global_variables表存储各种全局配置信息;

    执行mysql -usbuser -psbuser -h127.0.0.1 -P6033可以登录到后端服务器

    配置读写分离

    1. master库执行show slave hosts;查看是否已经有slave库的存在;
    2. 配置读写分离rules,在proxysql执行如下语句:
    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);
    LOAD MYSQL QUERY RULES TO RUNTIME;
    SAVE MYSQL QUERY RULES TO DISK;
    

    mysql_query_rules表适用于配置读写路由规则的表,所有的配置都是通过正则表达式的模式去进行匹配的
    actime:表示此规则是否是激活状态,1表示激活
    match_pattern:表示匹配的sql语句规则,以正则表达式方式进行匹配,select .* for update表示匹配所有数据修改操作语句
    destination_hostgroup:分配到那个组;
    apply:正则匹配上此规则之后是否还可以应用其他的rules,如果需要应用其他规则,则需要修改此配置参数;

    1. proxysql执行SELECT 1 FROM stats_mysql_query_digest_reset LIMIT 1;语句用于清空query统计信息;
    2. 通过proxysql登录,然后执行select,update,insert,delete等语句,然后proxysql查询query统计信息:
    mysql> select hostgroup hg,sum_time,count_star,digest_text from stats_mysql_query_digest order by digest_text;    #从stats_mysql_query_digest表查询query统计信息
    +----+----------+------------+------------------------------------------+
    | hg | sum_time | count_star | digest_text                              |
    +----+----------+------------+------------------------------------------+
    | 0  | 2338     | 1          | desc sbtest.sbtest1                      |
    | 0  | 4469     | 1          | insert into sbtest1 values (?,?,?,?)     |
    | 1  | 10019135 | 4          | select count(*) from sbtest.sbtest1      |
    | 0  | 3617     | 1          | update sbtest.sbtest1 set c=? where id=? |
    +----+----------+------------+------------------------------------------+
    4 rows in set (0.00 sec)
    

    可以看到已经实现了读写分离了

    proxysql监控状态查看

    mysql> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;    #查询后端库连接信息;
    +----------------+------+------------------+-------------------------+---------------+
    | hostname       | port | time_start_us    | connect_success_time_us | connect_error |
    +----------------+------+------------------+-------------------------+---------------+
    | 192.168.11.185 | 3306 | 1530675542539279 | 3844                    | NULL          |
    | 192.168.11.184 | 3306 | 1530675542523231 | 867                     | NULL          |
    | 192.168.11.185 | 3306 | 1530675482538252 | 3026                    | NULL          |
    | 192.168.11.184 | 3306 | 1530675482522256 | 646                     | NULL          |
    | 192.168.11.185 | 3306 | 1530675422538393 | 3043                    | NULL          |
    | 192.168.11.184 | 3306 | 1530675422522091 | 2244                    | NULL          |
    | 192.168.11.185 | 3306 | 1530675362535883 | 1984                    | NULL          |
    | 192.168.11.184 | 3306 | 1530675362520011 | 828                     | NULL          |
    | 192.168.11.185 | 3306 | 1530675302563722 | 4890                    | NULL          |
    | 192.168.11.184 | 3306 | 1530675302519919 | 945                     | NULL          |
    +----------------+------+------------------+-------------------------+---------------+
    10 rows in set (0.00 sec)
    
    mysql> SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;    #查询后端库存活信息
    +----------------+------+------------------+----------------------+------------+
    | hostname       | port | time_start_us    | ping_success_time_us | ping_error |
    +----------------+------+------------------+----------------------+------------+
    | 192.168.11.185 | 3306 | 1530675592871849 | 695                  | NULL       |
    | 192.168.11.184 | 3306 | 1530675592869012 | 176                  | NULL       |
    | 192.168.11.185 | 3306 | 1530675582871431 | 683                  | NULL       |
    | 192.168.11.184 | 3306 | 1530675582868776 | 178                  | NULL       |
    | 192.168.11.185 | 3306 | 1530675572871008 | 854                  | NULL       |
    | 192.168.11.184 | 3306 | 1530675572868341 | 175                  | NULL       |
    | 192.168.11.185 | 3306 | 1530675562870802 | 732                  | NULL       |
    | 192.168.11.184 | 3306 | 1530675562868067 | 183                  | NULL       |
    | 192.168.11.185 | 3306 | 1530675552870456 | 784                  | NULL       |
    | 192.168.11.184 | 3306 | 1530675552867687 | 187                  | NULL       |
    +----------------+------+------------------+----------------------+------------+
    10 rows in set (0.00 sec)
    

    proxysql常用库和表

    • mysql_servers:存储后端数据库服务器信息
    • mysql_users:存储后端数据库权限
    • mysql_query_rules:读写分离规则表
    • stats_mysql_query_digest:query统计表
      ...
  • 相关阅读:
    selennium模块
    urllib模块
    有关爬虫模块
    爬虫_requests_html
    爬虫x_path
    项目上线
    navicat使用 pymysql操作数据库 sql注入及增删改查
    基本查询语句和方法,连表,子查询
    表与表之间的关系
    存储引擎 数据类型
  • 原文地址:https://www.cnblogs.com/stacks/p/9262359.html
Copyright © 2020-2023  润新知