• Mysql ProxySQL的学习


    192.168.88.129 安装proxysql

    192.168.88.130 mysql主库

    192.168.88.131 mysql从库

    192.168.88.132 mysql从库

    一、环境搭建

    1、 下载安装

    下载 wget https://github.com/sysown/proxysql/releases/download/v2.0.8/proxysql-2.0.8-1-centos7.x86_64.rpm

    1.  yum localinstall proxysql-2.0.8-1-centos7.x86_64.rpm 
    2. ##查看安装的路径
    3. rpm -ql proxysql
    4. 启动proxysql
    5. systemctl start proxysql

     2、proxysql操作

    proxysql有两个端口号
    6032是ProxySQL的管理端口号, ProxySQL的用户名和密码都是默认的 admin
    6033是对外服务的端口号

    1. ###连接proxysql的管理后端
    2. mysql -uadmin -padmin -h 127.0.0.1 -P 6032
    1. ###proxysql的命令行跟mysql差不多
    2. (admin@127.0.0.1) [(none)]> show databases;
    3. +-----+---------------+-------------------------------------+
    4. | seq | name | file |
    5. +-----+---------------+-------------------------------------+
    6. | 0 | main | |
    7. | 2 | disk | /var/lib/proxysql/proxysql.db |
    8. | 3 | stats | |
    9. | 4 | monitor | |
    10. | 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
    11. +-----+---------------+-------------------------------------+

        main: 内存配置数据库,即 MEMORY,表里存放后端 db 实例、用户验证、路由规则等信息
        disk :持久化的磁盘的配置 
        stats: 统计信息的汇总  
        monitor:一些监控的收集信息,比如数据库的健康状态等 
        stats_history: 这个库是 ProxySQL 收集的有关其内部功能的历史指标

        注: 表名以 runtime_开头的表示 ProxySQL 当前运行的配置内容,不能通过 DML 语句修改。
        只能修改对应的不以 runtime 开头的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盘以供下次重启加载。

        main库下的主要表: 
        mysql_servers: 后端可以连接 MySQL 服务器的列表 
        mysql_users:   配置后端数据库的账号和监控的账号。 
        mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。

        ##最常用的同步到缓存和磁盘的命令
        LOAD MYSQL USERS TO RUNTIME;  将内存数据库中的配置加载到 runtime 数据结构
        SAVE MYSQL USERS TO DISK;   将内存数据库中的 MySQL 用户持久化到磁盘数据库中。
        LOAD MYSQL SERVERS TO RUNTIME;  将 MySQL server 从内存数据库中加载到 runtime。
        SAVE MYSQL SERVERS TO DISK;   从内存数据库中将 MySQL server 持久化到磁盘数据库中。
        LOAD MYSQL QUERY RULES TO RUNTIME;  将 MySQL query rules 从内存数据库加载到 runtime 数据结构。
        SAVE MYSQL QUERY RULES TO DISK;  将 MySQL query rules 从内存数据库中持久化到磁盘数据库中。
        LOAD MYSQL VARIABLES TO RUNTIME;  将 MySQL variables 从内存数据库加载到 runtime 数据结构。
        SAVE MYSQL VARIABLES TO DISK;   将 MySQL variables 从内存数据库中持久化到磁盘数据库中。
        LOAD ADMIN VARIABLES TO RUNTIME;   将 admin variables 从内存数据库加载到 runtime 数据结构。
        SAVE ADMIN VARIABLES TO DISK;  将 admin variables 从内存数据库中持久化到磁盘数据库。

    二、在mysql中配置 ProxySQL 所需账户

    1. 在 Master (192.168.88.130) 的MySQL 上创建 ProxySQL 的监控账户和对外访问账户
    2. ##配置 ProxySQL 所需账户
    3. create user 'monitor'@'%' identified with mysql_native_password by '123456';
    4. grant all privileges on *.* to 'monitor'@'%' with grant option;
    5. #proxysql 的对外访问账户
    6. create user 'proxysql'@'%' identified with mysql_native_password by '123456';
    7. grant all privileges on *.* to 'proxysql'@'%' with grant option;

     三、proxysql配置

    1、配置集群组 

    1. INSERT INTO main.mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) VALUES (10,20,'test_proxysql');
    2. load mysql servers to runtime;
    3. save mysql servers to disk;
    4. 写组定义与10,读组定义为20
    5. ProxySQL 会根据mysql的read_only 的取值将服务器进行分组。 read_only=0 的mysql,master被分到编号为10的写组,read_only=1 的server,slave则被分到编号20的读组

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

    2、添加主从服务器节点

    1. insert into main.mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.88.130',3306);
    2. insert into main.mysql_servers(hostgroup_id,hostname,port) values (20,'192.168.88.131',3306);
    3. insert into main.mysql_servers(hostgroup_id,hostname,port) values (20,'192.168.88.132',3306);
    4. load mysql servers to runtime;
    5. save mysql servers to disk;

    3、配置proxySql监控mysql的账号

    1. set mysql-monitor_username='monitor';
    2. set mysql-monitor_password='123456';
    3. ##或者在main库中操作
    4. UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
    5. UPDATE global_variables SET variable_value='123456' WHERE variable_name='mysql-monitor_password';
    6. load mysql variables to runtime;
    7. save mysql variables to disk;

    4、 判断是否连接成功mysql

    1. select * from monitor.mysql_server_connect_log; 
    2. connect_error的信息为null则表示成功

    5、 为 ProxySQL 配置对外访问账号

    1. 也就是我们的app应用程序访问ProxySQL的账户密码,
    2. SQL 请求所使用的用户配置,都需要在 MySQL 节点创建上
    3. insert into main.mysql_users (username,password,default_hostgroup) values ('proxysql','123456',10);
    4. load mysql users to runtime;
    5. save mysql users to disk;
    6. mysql_users 表有不少字段,最主要的三个字段username,password,default_hostgroup
    7. username: 前端链接ProxySQL ,以及ProxySQL 将SQL 语句路由给MySQL所使用的的用户名
    8. password:用户名对应的密码,。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行select password(PASSWORD),然后将加密结果复制到该字段。
    9. default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为10时,则使用 proxysql 用户发送的SQL语句默认情况下将路由到hostgroup_id=10 组中的某个节点。
    10. 我这里 hostgroup_id = 10的组中只有一个节点就是 master : 192.168.88.130
    11. 测试登录的话要用6033端口
    12. mysql -uproxysql -p123456 -P 6033 -h127.0.0.1

    6、 配置路由规则(最简单的读写分离)

    1. 路由相关的表 mysql_query_rules 和 mysql_query_rules_fast_routing
    2. 介绍一下改表mysql_query_rules的几个字段:
    3. active:是否启用这个规则,1表示启用,0表示禁用
    4. match_pattern 字段就是代表设置规则
    5. destination_hostgroup 字段代表默认指定的分组,
    6. apply 代表真正执行应用规则。
    7. 创建路由规则
    8. 1、把所有以select 开头的语句全部分配到读组中,读组编号是20
    9. 2、把 select .. for update 语句,这是一个特殊的select语句,会产生一个写锁(排他锁),把他分到编号为10 的写组中,其他所有操作都会默认路由到写组中
    10. insert into main.mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,'^select.*for update$',10,1);
    11. insert into main.mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',20,1);
    12. selectfor update规则的rule_id必须要小于普通的select规则的rule_id,因为ProxySQL是根据rule_id的顺序进行规则匹配的。
    13. load mysql query rules to runtime;
    14. save mysql query rules to disk;
    15. 测试 ^select是否生效
    16. mysql -uproxysql -p123456 -P 6033 -h 127.0.0.1 -e "select @@server_id;"
    17. 查看server_id是否都是从库的server_id
    18. 测试 ^select.*for update$ 是否生效,可以在proxysql中执行,
    19. select * from raft_log for update; (任意一个数据库,任意一张表)
    20. 然后到stats_mysql_query_digest表查看语句对应的是哪个hostgroup
    21. select hostgroup,schemaname,username,digest_text,count_star from main.stats_mysql_query_digest;

    7、读写分离另外一种操作

    1. 根据stats_mysql_query_digest表中的digest 加入到 mysql_query_rules中,只要是digest对应的sql就会走从库
    2. 查找按总执行时间排序的前 5 个查询,并且最短执行时间至少为 1 毫秒
    3. SELECT digest,SUBSTR(digest_text,0,20),count_star,sum_time,sum_time/count_star avg_time, min_time, max_time FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' AND min_time > 1000 ORDER BY sum_time DESC LIMIT 5;
    4. 然后把digest = 0xDA65260DF35B8D13 插入到mysql_query_rules中
    5. INSERT INTO mysql_query_rules (rule_id,active,digest,destination_hostgroup,apply) VALUES
    6. (5, 1,'0xDA65260DF35B8D13', 20, 1);
    7. 清空mysql_query_rules表执行
    8. SELECT 1 FROM stats_mysql_query_digest_reset LIMIT 1

    参考博文

    https://www.cnblogs.com/keme/p/12290977.html 学习

  • 相关阅读:
    WordPress编辑器增强插件TinyMCE Advanced
    部署服务网格的艺术
    [附源码]计算机毕业设计springboot基于JAVA技术的旅游信息交互系统
    许啸宇:从内部研发到开源开发之路|OneFlow U
    性能集成监控系统exporter+Prometheus+Grafana
    VirtualBox 安装CentOs6.8 无法上网问题和无法yum 安装文件的问题
    R语言dplyr包summarise函数计算dataframe数据中指定数据列的均值和中位数(Summarize selected variables)
    专业数据标注公司:景联文科技领航数据标注行业,满足大模型时代新需求
    17届智能车-多车编队寻光测距
    一次ES检索的性能优化经验记录
  • 原文地址:https://blog.csdn.net/u010648194/article/details/126072975