简介
ProxySQL是具有GPL许可证的高性能MySQL代理。作为监视进程监视的守护进程运行。该进程监视守护进程并在发生崩溃时重新启动它以最大限度地减少停机时间。
守护进程接受来自MySQL客户端的传入流量,并将其转发到后端MySQL服务器。
代理设计为连续运行而无需重新启动。大多数配置可以在运行时使用类似于SQL语句的查询来完成。其中包括运行时参数,服务器分组和与流量相关的设置。
官方文档:https://github.com/sysown/proxysql/wiki
Percona的官方文档:https://www.percona.com/doc/percona-xtradb-cluster/LATEST/howtos/proxysql.html
ProxySQL配置系统
通过一个多级配置系统,在MEMORY中配置好参数,加载到RUNTIME(运行环境)中生效,并在有需求时持久化到磁盘上,从而实现能够简单地动态更新配置文件,兼容MySQL的管理接口可以实现这个目标,能够动态修改尽可能多的配置项,无需重启ProxySQL。能够轻松地回滚无效的配置项
+-------------------------+
| RUNTIME |
+-------------------------+
/|\ |
| |
[1] | [2] |
| \|/
+-------------------------+
| MEMORY |
+-------------------------+ _
/|\ | |\
| | \
[3] | [4] | \ [5]
| \|/ \
+-------------------------+ +-------------------------+
| DISK | | CONFIG FILE |
+-------------------------+ +-------------------------+
这里可以看到有4个部分
-
RUNTIME
表示的是ProxySQL线程处理请求时使用的数据结构 -
MEMORY
MEMORY (有时也称为 main) 表示的是通过MySQL兼容接口公开的内存数据库。用户可以用MySQL的客户端连接到该接口,并查询ProxySQL的各种配置表或库。
通过该接口可获得的配置表包括:(配置ProxySQL主要也是配置下面这几个表)- mysql_servers – ProxySQL需要连接的后端服务器节点列表。
- mysql_users – 连接到ProxySQL的用户及对应密码的列表。注意, ProxySQL也会按照该列表中的用户配置去连接后端服务器节点。
- mysql_query_rules – ProxySQL根据这些规则将请求路由到后端服务器。这些规则有时会重写查询语句或者将已执行的结果进行缓存。
- global_variables – ProxySQL使用的全局变量列表,以及允许谁可以在runtime环境下进行调整。
-
DISK
DISK 表示的是一个在磁盘上的SQLite3数据库,默认位置为$(DATADIR)/proxysql.db。重启时,那些没有持久化到磁盘的内存配置会丢失,因此有必要将内存中的配置持久化到 DISK -
CONFIG FILE
CONFIG 文件是传统的配置文件
理解了上面的多层次配置系统,我们就可以很好的使用ProxySQL了。
主要配置四个部分
- 添加后端主机
- 添加监控
- 添加连接到ProxySQL的用户及密码
- 设置语句路由规则
管理接口中的数据库
所有数据库
MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name | file |
+-----+---------------+-------------------------------------+
| 0 | main | |#存放MEMORY和RUNTIME这两个层次的表
| 2 | disk | /var/lib/proxysql/proxysql.db |#存放DISK这个层次的表
| 3 | stats | |#包含了ProxySQL收集的关于其内部功能的指标
| 4 | monitor | |#检查后端的各项指标
| 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |#存放stats库的历史数据
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)
下面这个是disk库中的表
MySQL [(none)]> show tables from disk;
+--------------------------------------------+
| tables |
+--------------------------------------------+
| global_variables |#global_variables表用于定义全局变量。
| mysql_collations |
| mysql_group_replication_hostgroups |#定义后端使用组复制或者InnoDB Cluster的主机组。
| mysql_query_rules |#定义路由规则和属性
| mysql_query_rules_fast_routing |#mysql_query_rules_fast_routing表是mysql_query_rules表的一个扩展,在mysql_query_rules评估之后再评估fast routing策略和属性
| mysql_replication_hostgroups |#定义传统的异步、半同步主从复制主机组。
| mysql_servers |#定义后端MySQL Servers
| mysql_users |#定义MySQL用户,用于连接到后端。
| proxysql_servers |
| scheduler |#定义了每隔一段时间运行一次的调度任务。
+--------------------------------------------+
10 rows in set (0.00 sec)
下面这个是main中的表
从这里可以看出DISK,MEMORY,RUNTIME这三个层次的表都是相同的,不同的是它们的作用DISK这个层次的表已经更新到磁盘上了,MEMORY里的表配置存在内存中,但是未生效。RUNTIME里表的也是存在于内存中并且已经生效了!
安装
第一步:添加仓库
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
第二步:安装
yum install proxysql -y
配置方式
- 通过管理接口进行配置(推荐)
- 通过配置文件配置
通过管理接口配置读写分离
拓扑图
前提:
192.168.253.128与192.168.253.158的数据库已经完成,并且Slave库设置了read_only=1
第一步:启动ProxySQL
systemctl start proxysql #启动
第二步:添加后端主机
在192.168.253.133主机上,进入管理接口
mysql -uadmin -padmin -h127.0.0.1 -P 6032
添加后端主机
这里设置192.168.253.128在1主机组,192.168.253.158在0主机组,后面会根据主机组进行分配读写请求
MySQL [(none)]> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'192.168.253.128','3306');
MySQL [(none)]> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (0,'192.168.253.158','3306');
查看一下
MySQL [(none)]> SELECT * FROM mysql_servers;
第三步:配置监控用户
需要后端节点已经创建好监控用户,用户名/密码为monitor/monitor
然后在管理界面添加
MySQL [(none)]> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='monitor'; #配置监控用户
MySQL [(none)]> LOAD MYSQL VARIABLES TO RUNTIME; #加载到RUNTIME中
MySQL [(none)]> SAVE MYSQL VARIABLES TO DISK; #保存到DISK中
用下面两个命令可以查看后端节点的健康状态
MySQL [(none)]> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
MySQL [(none)]> SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
这里可以看到ping err和connect err 为NULL说明没错误
第四步:启用后端节点
现在我们已经知道了所有的节点都被合理监控且它们都正常,把后段主机的配置装载到运行环境并保存到磁盘
MySQL [(none)]> LOAD MYSQL SERVERS TO RUNTIME;
MySQL [(none)]> SAVE MYSQL SERVERS TO DISK;
第五步:添加连接到ProxySQL的用户及密码
这里的用户密码需要先在后端MySQL节点配置好的,提供给客户端访问的
用户名/密码 root/mysql
MySQL [(none)]> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('root','mysql',1);
加载到RUNTIME并保存到DISK中
MySQL [(none)]> LOAD MYSQL USERS TO RUNTIME;
MySQL [(none)]> SAVE MYSQL USERS TO DISK;
说明添加用户成功,可以正常连接
第六步:设置读写分离规则
读请求发送到192.168.253.158主机
写请求发送到192.168.253.128主机
MySQL [(none)]> UPDATE mysql_users SET default_hostgroup=1; # 所有的查询将默认路由到1主机组
MySQL [(none)]> LOAD MYSQL USERS TO RUNTIME; # 加载到RUNTIME中
MySQL [(none)]> SAVE MYSQL USERS TO DISK; #保存到DISK中
MySQL [(none)]> INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)
VALUES
(1,1,'^SELECT.*FOR UPDATE$',1,1),
(2,1,'^SELECT',0,1); #设置匹配到SELECT开头的请求发送到0主机组,也就是192.168.253.158中
LOAD MYSQL QUERY RULES TO RUNTIME; # 加载到RUNTIME中
SAVE MYSQL QUERY RULES TO DISK; #保存到DISK中
第七步:测试
为了测试方便所以后端两个数据库没做主从
并且创建了t1这个表里面的值也不同
下面来测试读请求发送到哪里
可以看出它一直发送到192.168.253.158这台主机,说明读请求分配给了192.168.253.158中,
接下来测试一下写请求
说明写请求全都分配给了192.168.253.128中
到这里可以看出读写分离已经成功了。