MySQL
常用语句
用户相关\管理相关\数据相关
视图\事件\存储过程\函数\游标\触发器
事务\分区
常用工具
管理优化
锁问题
MySQL日志
异步复制
半同步复制
复制管理
5.7开启并行复制
双主备份
故障问题
索引
时区
表的导出导入
MySQLdump逻辑备份
XtraBackup全备
XtraBackup增备
XtraBackup原表数据恢复
安装MySQL
ProxySQL中间件
Atlas中间件
keepalived安装
MHA安装
MHA恢复
mha复制检查报错及解决过程
集群Cluster安装
维护Cluster
开启审计功能
本文档使用MrDoc发布
返回首页
-
+
ProxySQL中间件
2021年8月27日 08:59
admin
#下载地址 https://www.proxysql.com/documentation/installing-proxysql/ #安装 yum -y install perl-DBD-mysql gnutls wget https://github.com/sysown/proxysql/releases/download/v2.2.0/proxysql-2.2.0-1-centos67.x86_64.rpm rpm -iUvh proxysql-2.2.0-1-centos7.x86_64.rpm ####注意:安装完成后,会自动在/usr/bin/增加服务管理脚本,系统可直接执行proxysql命令 --- >####ProxySQL目录:/var/lib/proxysql --- #配置 ####配置文件/etc/proxysql.cnf ####配置数据库文件/var/lib/proxysql/proxysql.db --- ##注意:如果存在 “proxysql.db”文件,则启动过程不解析proxysql.cnf文件;配置文件只在第一次启动的时候读取 ![](/media//202108/2021-08-27105210442227.png) --- #启动与停止 /usr/bin/proxysql #启动 kill <proxysql的进程id> #停止 --- ![](/media//202108/2021-08-27100214756987.png) ####6032 是 ProxySQL 的管理端口号,6033是对外服务的端口号 --- #操作 ####连接管理端 mysql -uadmin -padmin -h 127.0.0.1 -P 6032 ![](/media//202108/2021-08-27100416022450.png) >####可见有五个库: main、disk、stats 、monitor 和 stats_history ##main: ####内存配置数据库,即 MEMORY,表里存放后端 db 实例、用户验证、路由规则等信息 show tables from main; ![](/media//202108/2021-08-27100834469258.png) ####库下的主要表: global_variables:此表用来设置变量,如监听的端口、管理账号等 mysql_replication_hostgroups:此表用来监视指定组中所有服务器的read_only值 mysql_servers: 后端可以连接 MySQL 服务器的列表 mysql_users: 配置后端数据库的账号和监控的账号。 mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。 scheduler:调度表,类似于cron的功能实现。 ####注: 表名以 runtime_开头的表示 ProxySQL 当前运行的配置内容,不能通过 DML 语句修改。 ####只能修改对应的不以 runtime 开头的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盘以供下次重启加载。 --- ##stats: ####统计信息的汇总 show tables from stats; ![](/media//202108/2021-08-27101826296178.png) ####库下的主要表: stats_mysql_commands_counters:用来统计各种SQL类型的执行次数和时间,通过参数mysql-commands_stats来控制开关,默认是true stats_mysql_connection_pool:用来连接后端MYSQL的连接信息 stats_mysql_processlist:类似于MYSQL的show processlist的命令,用来查看各线程的状态。 stats_mysql_query_digest:此表表示SQL的执行次数,时间消耗等,通过参数mysql-query_digests来控制开关,默认是true stats_mysql_query_rules:统计路由命中次数 --- ##monitor: ####一些监控的收集信息,比如数据库的健康状态等 show tables from monitor; ![](/media//202108/2021-08-27102438539188.png) ####库下的主要表: mysql_server_connect_log:通过连接到所有MYSQL服务器已检查它们是否可用,此表用来存放检查连接的日志 mysql_server_ping_log:通过mysql_ping来ping后端MYSQL服务器,从而检查它们是否可用,此表用来存放ping的日志 mysql_server_replication_lag_log:此表用来存放对后端MYSQL服务器进行主从延迟检测的日志 --- ##disk:持久化的磁盘的配置 --- ##stats_history: 这个库是 ProxySQL 收集的有关其内部功能的历史指标 --- #多层配置系统 ![](/media//202108/2021-08-27103504426892.png) #####整套配置系统分为三层:顶层为 RUNTIME ,中间层为 MEMORY , 底层也就是持久层 DISK 和 CONFIG FILE 。 #####RUNTIME : 代表 ProxySQL 当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层 “load” 进来。 #####MEMORY: MEMORY 层上面连接 RUNTIME 层,下面连接持久层。这层可以正常操作 ProxySQL 配置,随便修改,不会影响生产环境。修改一个配置一般都是现在 MEMORY 层完成的,确认正常之后在加载达到 RUNTIME 和 持久化的磁盘上。 #####DISK 和 CONFIG FILE:持久化配置信息,重启后内存中的配置信息会丢失,所需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。 --- ##配置 MySQL 用户(main:mysql_users) LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME #将内存数据库中的配置加载到 runtime 数据结构,反之亦然。 SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME #将 MySQL 用户从 runtime 持久化到内存数据库。 LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK #从磁盘数据库中加载 MySQL 用户到内存数据库中。 SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK #将内存数据库中的 MySQL 用户持久化到磁盘数据库中。 LOAD MYSQL USERS FROM CONFIG #从配置文件中加载 MySQL 用户到内存数据库中。 --- ##配置 MySQL server(main:mysql_servers) LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME #将 MySQL server 从内存数据库中加载到 runtime。 SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME #将 MySQL server 从 runtime 持久化到内存数据库中。 LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK #从磁盘数据库中加载 MySQL server 到内存数据库。 SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK #从内存数据库中将 MySQL server 持久化到磁盘数据库中。 LOAD MYSQL SERVERS FROM CONFIG #从配置文件中加载 MySQL server 到内存数据库中 --- ##配置 MySQL 的查询规则(main:mysql_query_rules) LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME #将 MySQL query rules 从内存数据库加载到 runtime 数据结构。 SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME #将 MySQL query rules 从 runtime 数据结构中持久化到内存数据库。 LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK #从磁盘数据库中加载 MySQL query rules 到内存数据库中。 SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK #将 MySQL query rules 从内存数据库中持久化到磁盘数据库中。 LOAD MYSQL QUERY RULES FROM CONFIG #从配置文件中加载 MySQL query rules 到内存数据库中。 --- ##配置 MySQL 变量(main:global_variables) LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME #将 MySQL variables 从内存数据库加载到 runtime 数据结构。 SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME #将 MySQL variables 从 runtime 数据结构中持久化到内存数据中。 LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK #从磁盘数据库中加载 MySQL variables 到内存数据库中。 SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK #将 MySQL variables 从内存数据库中持久化到磁盘数据库中。 LOAD MYSQL VARIABLES FROM CONFIG #从配置文件中加载 MySQL variables 到内存数据库中。 --- ##配置 MySQL 管理变量(main:global_variables) LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME #将 admin variables 从内存数据库加载到 runtime 数据结构。 SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME #将 admin variables 从 runtime 持久化到内存数据库中。 LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK #从磁盘数据库中加载 admin variables 到内存数据库中。 SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK #将 admin variables 从内存数据库中持久化到磁盘数据库。 LOAD ADMIN VARIABLES FROM CONFIG #从配置文件中加载 admin variables 到内存数据库中。 --- #配置 ProxySQL 主从分组信息 ####添加组 insert into mysql_replication_hostgroups ( writer_hostgroup, reader_hostgroup, comment) values (10,20,'proxy'); load mysql servers to runtime; #生效配置 save mysql servers to disk; #保存配置 ####添加主从服务器节点 insert into mysql_servers(hostgroup_id,hostname,port) values (10,'10.0.0.160',3306); insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.161',3306); load mysql servers to runtime; #生效配置 save mysql servers to disk; #保存配置 --- #配置监控账号 ####ProxySQL端: #修改监控账号与密码 set mysql-monitor_username='monitor'; set mysql-monitor_password='123456'; #上面这两句是修改变量的方式还可以在main库下面用sql语句方式修改 UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username'; UPDATE global_variables SET variable_value='monitor' WHERE variable_name='123456'; #生效配置 load mysql variables to runtime; #保存配置 save mysql variables to disk; #查看连接日志 select * from monitor.mysql_server_connect_log; #查看ping日志 select * from monitor.mysql_server_ping_log; ![](/media//202108/2021-08-27140010780776.png) ####监控服务器: #需要创建监控账号 grant replication client on *.* to monitor@'172.16.60.%' identified by '123456'; --- #配置对外访问账号 ##注意:SQL 请求所使用的用户配置,都需要在 MySQL 节点创建上 --- ####ProxySQL端: insert into mysql_users (username,password,default_hostgroup) values ('proxysql','123456',10); #10为默认写组 load mysql users to runtime; save mysql users to disk; ####监控服务器: GRANT ALL ON *.* TO 'proxysql'@'%' IDENTIFIED BY '123456'; --- #配置读写分离 #select..limit..的语句,会被路由到10号组 insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*LIMIT.*',10,1); #select..的语句,会被路由到20号组 insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES (2,1,'^SELECT',20,1); #配置生效 load mysql query rules to runtime; #保存配置 save mysql query rules to disk; ##测试 mysql -uproxysql -p123456 -P6033 -h127.0.0.1 -e "select * from mysql.user limit 10;" #看是否路由到10组内的机器中 mysql -uproxysql -p123456 -P6033 -h127.0.0.1 -e "select * from mysql.user;" #看是否路由到20组内的机器中 --- #参考资料: https://www.cnblogs.com/keme/p/12290977.html https://www.cnblogs.com/kevingrace/p/10329714.html
分享到: