读写分离中间件-——ProxySql

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;  
发布了65 篇原创文章 · 获赞 6 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章