ProxySql安装
- 下载proxysql安装包
https://github.com/sysown/proxysql/releases/tag/v2.0.5
或
https://repo.proxysql.com/ProxySQL/
- 安装RPM包
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL ##安装依赖
rpm -ivh proxysql-2.0.5-1-centos7.x86_64.rpm
- 启动服务
/etc/init.d/proxysql start
启动后会监听两个端口,默认为6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL对外提供服务的端口。
- 登入proxysql
mysql -uadmin -p admin -h 127.0.0.1 -P 6032 ##proxysql默认用户密码为admin
- 在proxysql中添加mysql节点
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'139.196.52.45',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'139.196.52.45',3307);
- 修改后,加载到RUNTIME,并保存到disk。
load mysql servers to runtime;
save mysql servers to disk;
- 查看节点状态
select * from mysql_servers\G
监控后端MySQL节点
- 在master上执行
添加节点之后,还需要监控后端节点。对于后端是主从复制的环境来说,这是必须的,因为ProxySQL需要通过每个节点的read_only
值来自动调整它们是属于读组还是写组。
首先在后端master节点上创建一个用于监控的用户名(只需在master上创建即可,因为会复制到slave上),这个用户名只需具有USAGE
权限即可。如果还需要监控复制结构中slave是否严重延迟于master(先混个眼熟:这个俗语叫做"拖后腿",术语叫做"replication lag"),则还需具备replication client
权限。这里直接赋予这个权限
create user proxysql@'%' identified by 'proxysql';
grant replication client on *.* to proxysql@'%';
FLUSH PRIVILEGES;
- 回到ProxySQL上配置监控
set mysql-monitor_username='proxysql';
set mysql-monitor_password='proxysql';
- 加载到RUNTIME,并保存到disk
load mysql variables to runtime;
save mysql variables to disk;
- 验证监控结果:ProxySQL监控模块的指标都保存在monitor库的log表中
以下是连接是否正常的监控(对connect指标的监控):(在前面可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常)
select * from mysql_server_connect_log;
以下是对心跳信息的监控(对ping指标的监控):
select * from mysql_server_ping_log;
- 指定写组的id为10,读组的id为20
此处可能报错,可以删除/var/lib/proxysql/proxysql.db文件,将所有修改填入/etc/proxysql.conf(只有第一次启动程序时生效或者proxysql.db文件不存在时)中,重启proxysql。
insert into mysql_replication_hostgroups values(10,20);
- 在该配置加载到RUNTIME生效之前,先查看下各mysql server所在的组
select hostgroup_id,hostname,port,status,weight from mysql_servers;
- 将刚才
mysql_replication_hostgroups
表的修改加载到RUNTIME生效
load mysql servers to runtime;
save mysql servers to disk;
- 在master节点上执行,创建用户
grant all on *.* to proxysqluser@'%' identified by 'proxysqluser@';
- 回到ProxySQL,配置mysql_users表,将刚才的用户添加到该表中
insert into mysql_users(username,password,default_hostgroup) values('proxysqluser','proxysqluser',10);
load mysql users to runtime;
save mysql users to disk;
- 查看用户状态
select * from mysql_users\G
************************* 1. row ***************************
username: proxyuser
password: proxyuser
active: 1 *# 注意本行*
use_ssl: 0
default_hostgroup: 10
default_schema: NULL
schema_locked: 0
transaction_persistent: 1 *# 注意本行*
fast_forward: 0
backend: 1
frontend: 1
max_connections: 10000
只有
active=1
的用户才是有效的用户。至于
transaction_persistent
字段,当它的值为1时,表示事务持久化:当某连接使用该用户开启了一个事务后,那么在事务提交/回滚之前,所有的语句都路由到同一个组中,避免语句分散到不同组(更进一步的,它会自动禁用multiplexing,让同一个事务的语句从同一个连接路由出去,保证路由到同一个组的同一个节点)。在以前的版本中,默认值为0,不知道从哪个版本开始,它的默认值为1。我们期望的值为1,所以在继续下面的步骤之前,先查看下这个值,如果为0,则执行下面的语句修改为1。
配置路由规则
- 插入两个规则,目的是将select语句分离到hostgroup_id=20的读组,但由于select语句中有一个特殊语句SELECT…FOR UPDATE它会申请写锁,所以应该路由到hostgroup_id=10的写组。
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),
(2,1,'^SELECT',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
select … for update规则的rule_id必须要小于普通的select规则的rule_id,因为ProxySQL是根据rule_id的顺序进行规则匹配的。
测试路由规则
- 测试查询路由
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
从服务器的server_id设置为2,此处select查询已路由到slave处
- 测试写操作。这里以事务持久化进行测试。
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e '\
start transaction;\
select @@server_id;\
commit;\
select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 3 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
- 查看路由信息
SELECT hostgroup hg,
sum_time,
count_star,
digest_text
FROM stats_mysql_query_digest
ORDER BY sum_time DESC;
主从监控
- 将主库加入读组中
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(10,'139.196.52.45',3306,1,1000,10,'test proxysql');
- 设置从库权重(要高于主库)
update mysql_servers set weight=9 where hostgroup_id=20 and hostname='139.196.52.45' and port=3307;
- 查看状态
select * from mysql_servers;
- 加载并保存
load mysql servers to runtime;
save mysql servers to disk;
mysql_servers表示加载前的,runtime_mysql_servers可以查看加载后的。
- 设置监控账号权限
GRANT SUPER, REPLICATION CLIENT ON *.* TO 'proxysql'@'%' IDENTIFIED BY PASSWORD '*BF27B4C7AAD278126E228AA8427806E870F64F39';
- 设置监控阈值
UPDATE mysql_servers SET max_replication_lag=5;
- 加载并保存
load mysql servers to runtime;
save mysql servers to disk;