MySQL 8.x配置MGR高可用+ProxySQL读写分离(二):ProxySQL配置MySQL代理及读写分离
#作者:stackofumbrella
文章目录
- ProxySQL简介
- ProxySQL架构
- ProxySQL的安装与配置
- 在不同层次间移动配置
ProxySQL简介
ProxySQL是基于MySQL的一款开源的中间件的产品,是一个灵活的MySQL代理层,可以实现读写分离,支持Query路由功能,支持动态指定某个SQL进行缓存,支持动态加载(无需重启 ProxySQL 服务),故障切换和一些 SQL 的过滤功能。
具有以下优点和特性:
- 支持动态加载配置,可以在线修改配置。
- 支持query cache。
- 支持对query的路由,可以针对某个语句进行分配执行实例。
- 监控后端节点,包括:ProxySQL和后端的心跳信息,后端节点的read-only/read-write,slave和master的数据同步延迟性 (replication lag)。
能处理千亿级的数据。 - 最基本的读/写分离,且方式有多种。
- 可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由。
- 理解MySQL协议,具有高级连接处理能力。
- 具有数据库防火墙功能,保护数据和流量免受恶意活动的侵害。
官方地址:https://www.proxysql.com/
Github仓库:https://github.com/sysown/proxysql/wiki
软件下载:https://github.com/sysown/proxysql/releases
ProxySQL架构
ProxySQL 2.0.x版本以后开始支持MGR高可用,这样结合MGR,使得MySQL主从集群具有更加完备的对外访问能力。
ProxySQL的安装与配置
环境准备
首先需要安装MySQL主从集群,即一主两从集群,过程比较简单,这里不再详述。
ProxySQL安装
$ sudo apt-get install -y --no-install-recommends lsb-release wget apt-transport-https ca-certificates
$ wget https://github.com/sysown/proxysql/releases/download/v2.7.3/proxysql_2.7.3-ubuntu22_amd64.deb
$ sudo dpkg -i proxysql_2.7.3-ubuntu22_amd64.deb
启动ProxySQL
$ sudo systemctl start proxysql
$ ss -tnl
6032是ProxySQL的管理端口号,6033是对外服务的端口号
连接ProxySQL
$ sudo apt install mysql-client-core-8.0
登录proxysql,proxysql的用户名和密码都是默认的admin
$ mysql -uadmin -padmin -h 127.0.0.1 -P 6032
mysql> show databases;
可见有五个库:main、disk、stats、monitor和stats_history
main:内存配置数据库,即MEMORY,表里存放后端db 实例、用户验证、路由规则等信息。main库中有如下信息:
mysql> use main;
mysql> show tables;
main库下的主要表
mysql_servers:后端可以连接MySQL服务器的列表
mysql_users:配置后端数据库的账号和监控的账号
mysql_query_rules:指定Query路由到后端不同服务器的规则列表
注: 表名以runtime_开头的表示ProxySQL当前运行的配置内容,不能通过DML语句修改。只能修改对应的不以 runtime开头的表,然后“LOAD”使其生效,“SAVE”使其存到硬盘以供下次重启加载。
disk库下的主要表
主要是一些持久化磁盘的配置
stats库下的主要表
主要是统计信息的汇总
stats_mysql_connection_pool表
hostgroup:后端服务器所属的主机组,单个后端服务器可以属于多个主机组
srv_host,srv_port:mysql后端服务器正在侦听连接的TCP端点的IP和Port
status:后端服务器的状态。可以有ONLINE,SHUNNED,OFFLINE_SOFT,OFFLINE_HARD
ConnUsed:ProxySQL当前使用多少个连接来向后端服务器发送查询
ConnFree:目前有多少个连接是空闲
ConnOK:成功建立了多少个连接
ConnERR:失败的连接数
Queries:路由到此特定后端服务器的查询数
Bytes_data_sent:发送到后端的数据量
Bytes_data_recv:从后端接收的数据量
Latency_ms:从Monitor报告的当前ping以毫秒为单位的延迟时间
monitor库下的主要表
主要是一些监控的收集信息,比如数据库的健康状态等
stats_history库下的主要表
这个库是ProxySQL收集有关其内部功能的历史指标
配置ProxySQL所需账户
请在MySQL的主库执行
注意:MySQL 8.0.x用户认证的方式需要修改为mysql_native_password,需要在MySQL的配置文件中加上这个用户认证方式,再来创建用户
$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
default_authentication_plugin=mysql_native_password
mysql> select User,Host,plugin from mysql.user;
然后执行创建用户
#proxysql的监控账户
create user 'monitor'@'192.168.1.%' identified by '123456';
grant all privileges on *.* to 'monitor'@'192.168.1.%';
#proxysql的对外访问账户
create user 'proxysql'@'192.168.1.%' identified by '123456';
grant all privileges on *.* to 'proxysql'@'192.168.1.%';
flush privileges;
mysql> select User,Host,plugin from mysql.user;
ProxySQL的多层架构
整套配置系统分为三层:顶层为RUNTIME,中间层为MEMORY,底层也就是持久层DISK和CONFIG FILE。RUNTIME :代表ProxySQL当前正在使用的配置,无法直接修改这里的配置,必须要从下一层LOAD进来。
MEMORY:MEMORY层上面连接RUNTIME层,下面连接持久层。这层可以正常操作ProxySQL配置,随便修改,不会影响生产环境。修改一个配置一般都是在MEMORY层完成的,确认正常之后在加载达到RUNTIME和持久化的磁盘上。
DISK和CONFIG FILE:持久化配置信息,重启后内存中的配置信息会丢失,所需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。
在不同层次间移动配置
重新配置MySQL用户
为了将配置持久化到磁盘或者应用到runtime,在管理接口下有一系列管理命令来实现它们。 要重新配置MySQL用户,可执行下面的其中一个命令:
- 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
- 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的查询规则
- 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变量
- 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到内存数据库中。
处理管理变量
- 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到内存数据库中。
说明
修改配置的步骤一般是在MEMORY层进行修改,然后保存到RUNTIME和DISK
管理配置
disk是sqlite3数据库,默认位置是$DATADIR/proxysql.db( /var/lib/proxysql/proxysql.db),config file是一个传统配置文件一般不需要更改,在内存中动态更改配置,如果重启,没进行持久化(save) 则会丢失。
三者之间的关系
proxysql启动时,首先去找/etc/proxysql.cnf找到它的datadir,如果datadir下有proxysql.db就加载proxysql.db的配置,如果启动proxysql时带有–init标志,会用/etc/proxsql.cnf的配置,把Runtime,disk全部初始化一下,在调用是调用–reload 会把/etc/proxysql.cnf 和disk 中配置进行合并。如果冲突需要用户干预。disk会覆盖config file。
传统配置文件默认路径为/etc/proxysql.cnf,也可以在二进制程序proxysql上使用-c或–config来手动指定配置文件。默认情况下,几乎不需要手动去配置proxysql.cnf。记住,只要不是加载到runtime,修改的配置就不会生效。
只有加载到runtime状态时才会去做最后的有效性验证。在保存到内存数据库或持久化到磁盘上时,都不会发生任何警告或错误。当加载到runtime时,如果出现错误,将恢复为之前保存得状态,这时可以去检查错误日志。