一、ProxySQL基本介绍
1.1 前言
ProxySQL是 MySQL 的高性能、高可用性、协议感知代理。以下为结合主从复制对ProxySQL读写分离、黑白名单、路由规则等做些基本测试。
1.2 基本介绍
先简单介绍下ProxySQL及其功能和配置,主要包括:
最基本的读/写分离,且方式有多种;
可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由,规则很灵活;
动态加载配置,即绝大部分的配置可以在线修改,但有少部分参数还是需要重启来生效;
可缓存查询结果。虽然缓存策略比较简陋,但实现了基本的缓存功能;
过滤危险的SQL,增加防火墙等功能;
提供连接池、日志记录、审计日志等功能;
1.2.1 请求流程
流量从客户端发出 → ProxySQL进行处理转发 → 后端处理 → ProxySQL的前端连接 → 返回客户端的基本流程
1.2.2 核心功能
读写分离:可查询走从库,写入走主库
简单Sharding:ProxySQL的sharding是通过正则匹配来实现的,对于需要拆分SQL以及合并SQL执行结果的不能支持,所以写了简单sharding
连接池管理:常规功能,为了提高SQL执行效率。
多路复用:主要优化点在后端mysql连接的复用,对比smart client,中间层不仅对前端建连也会对后端建连,可自行控制后端连接的复用逻辑。
流量管控:kill连接和kill query;whitelist配置。
高可用:底层mysql,如果从库挂了,自动摘除流量;主库挂了暂不处理。proxysql自身高可用,提供cluster的功能,cluster内部会自行同步元数据以及配置变更信息。
查询缓存:对username+schema+query的key进行缓存,设置ttl过期,不适合写完就查的场景,因为在数据在未过期之前可能是脏数据。
动态配置:大部分的配置可动态变更,先load到runtime,在save到disk,通过cluster的功能同步到其他的节点。
流量镜像:同一份流量可以多出写入,但是并不保证mirror的流量一定成功。
SQL改写:在query rules中配置replace规则,可以对指定的SQL进行改写。
1.2.3 多层的配置系统
ProxySQL的配置有三层,且绝大部分参数均可以通过动态配置并热加载到运行层,并通过save命令保存到持久层。
RUNTIME层
runtime层是即时生效的;表示当前生效的配置,该层的配置无法直接修改,必须要从下一层即MEMORY层load进来;
MEMORY层
memory层是保存在内存中,但不立即生效的;该层通常通过admin端口进来后,直接修改。
DISK层|CONFIG FILE层
disk层表示持久化层,config file表示从配置文件中加载的;
不同层的加载和保存
# 以修改mysql servers为例,以下为不同层之间的同步关系
## 将修改层的配置加载到运行层
load mysql servers to runtime;
## 将运行层的配置同步到修改层
save mysql servers to memroy;
## 将持久层的配置加载到memory层
load mysql servers to memory;
## 将修改层的配置保存到持久层
save mysql servers to disk;
## 从配置文件中将配置信息加载到修改层
load mysql servers from config;
1.2.4 第一次启动
配置文件
第一次启动时,会从proxysql.cnf配置文件中加载相关配置项来初始化memory和runtime层,并最终持久化到sqlite数据库中;如果想重新初始化proxysql,可以在启动时使用--initial选项来强制初始化proxysql,这会将sqlite数据库重置为最原始的状态,并在必须要时重命名sqlite的数据文件
持久层disk的配置
再次启动时,如果配置文件指定的datadir目录下sqlite数据文件存在,则会将sqlite中的配置项读取到内存,最终会加载到runtime层。此时不再读取proxysql.cnf配置文件的相关配置。
1.2.5 ProxySQL相关表配置
ProxySQL后端采用sqlite对配置进行存储,有以下几个库:
下列库中:main表示runtime运行层,disk表示持久化库,stats表示统计数据库,monitor存储监控相关表,stats_history表示统计历史库。
3306-Admin > show databases;
+-----+---------------+--------------------------------------------------+
| seq | name | file |
+-----+---------------+--------------------------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/data/3306/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
| 5 | stats_history | /var/lib/data/3306/proxysql_stats.db |
+-----+---------------+--------------------------------------------------+
5 rows in set (0.00 sec)
global_variables表
全局配置表,用于存储admin接口、mysql接口、监控等相关参数的配置,其相关配置可以通过以下两种方式进行修改:
## 直接通过SQL修改表
3306-Admin > update global_variables set variable_value='xxx' where variable_name='xxx';
## 通过set方式
3306-Admin > set variable_name='xxx';
mysql_servers表
定义后端backends,如MySQL Server或者使用MySQL协议的其他实例,同一个hostgroup组中的backends具有相同的逻辑功能;
主要字段
hostgroup_id:指定后端MySQL所在的hostgroup_id组,同一个后端MySQL可以分属不同的组;
hostname,port: 指定后端MySQL的主机和端口;
status: 后端MySQL的状态,online表示在线提供服务,即正常状态;offline_soft表示非强制下线,即不再接受新的请求,但可以处理当前已建立的会话请求;offline_hard表示强制下线,即强制关闭当前的所有会话且不再接受新请求;shunned表示后端MySQL临时不可用,如因为连接数过多或者主从延迟超过设置的阈值等;
weight:backend的权重,权重越大,则同hostgroup中被选择的概率越大;
max_connections:设置ProxySQL能连接后端MySQL的最大连接;
max_replication_lag:设置后端MySQL允许的最大延迟时间;
mysql_users表
用于存储访问ProxySQL的相关用户,并最终连接到后端的MySQL上;
主要字段
username, password:连接ProxySQL来访问后端MySQL的用户名和密码。
需注意:
用户需要在后端MySQL实例中创建且能确保ProxySQL所在的机器IP已加白;
在mysql_users表中配置的用户不能再被用到mysql-monitor_username监控配置用户上;