美文网首页
12、读写分离中间件-ProxySQL

12、读写分离中间件-ProxySQL

作者: 一个反派人物 | 来源:发表于2021-03-20 16:48 被阅读0次

1、安装

添加yum源

cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.1.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key
EOF

安装

yum install proxysql 

启动

systemctl start proxysql-initial.service 
systemctl start proxysql.service 

2、ProxySQL相关文件

ProxySQL使用SQLITE数据库,Proxysql很多东西是存储在这个迷你数据库里面的。数据库目录在/var/lib/proxysql

/var/lib/proxysql

-rw-r--r-- 1 root root   1078 Mar 20 12:17 proxysql-ca.pem
-rw-r--r-- 1 root root   1062 Mar 20 12:17 proxysql-cert.pem
-rw------- 1 root root 196608 Mar 20 12:17 proxysql.db.bak
-rw-r--r-- 1 root root   1679 Mar 20 12:17 proxysql-key.pem
-rw------- 1 root root   4097 Mar 20 12:17 proxysql.log
-rw------- 1 root root 163840 Mar 20 12:31 proxysql_stats.db

配置文件/etc/proxysql.cnf

3、配置系统

配置系统分为3层

  • RUNTIME层,是proxysql运行过程中实际采用的配置
  • MEMORY层,是修改proxysql的唯一正常入口。一般的,修改一个配置,先改Memory,确认无误后再接入生产(RUNTIME),和持久化到磁盘(DISK)
  • DISK和CONFIG FILE层,是持久化层,持久化层主要将数据存储在sqlite($(DATADIR)/proxysql.db.)数据库中和文件中(/etc/proxysql.cnf)。
+-------------------------+
|         RUNTIME         |
+-------------------------+
       /|\          |
        |           |
    [1] |       [2] |
        |          \|/
+-------------------------+
|         MEMORY          |
+-------------------------+ _
       /|\          |      |\
        |           |        \
    [3] |       [4] |         \ [5]
        |          \|/         \
+-------------------------+  +-------------------------+
|          DISK           |  |       CONFIG FILE       |
+-------------------------+  +-------------------------+

3.1 配置修改命令

mysql servers的配置修改为例
(1)将memory中的配置应用到runtime

LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME

(2)将runtime配置拉一份到memory

SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME

(3)将DISK的配置拉一份到memory中来

LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK

(4)将memory中的配置保存到DISK中去

SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK

(5)将CONFIG FILE的配置加载到memory中

LOAD MYSQL SERVERS FROM CONFIG

4、ProxySQL实现读写分离

准备环境为mysql 1主2从,向主库写入,在从库读取

db01 (10.0.0.51:3307) , mysql master
db02 (10.0.0.52:3307) , mysql slave
db03 (10.0.0.53:3307) , mysql slave 
proxysql (10.0.0.53:6033) , app+proxysql

4.1 proxysql登录

proxysql对外提供两个端口6032、6033

  • 6032是管理口,登陆到proxysql的管理端
  • 6033是业务口,登录后用于对后端数据库进行sql操作,6033也是供前端业务所使用的端口

登录管理端口6032

mysql -uadmin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

4.2 proxysql录入主从信息

主库master节点放到group 0中,salve节点放到group1。

INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'10.0.0.51',3307);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1,'10.0.0.52',3307);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1,'10.0.0.53',3307);
commit;

查看信息

select hostgroup_id,hostname,port,status from mysql_servers;

4.3 mysql数据库创建监控及应用账户

  • proxysql是监控账户用于心跳监控
  • sbuser是应用账户用于对数据库进行读写操作

只需在主库上创建,从库会自动同步

CREATE USER 'proxysql'@'10.0.0.%' IDENTIFIED BY '123';
GRANT USAGE ON  *.* TO 'proxysql'@'10.0.0.%';
CREATE USER 'sbuser'@'10.0.0.%' IDENTIFIED BY '123';
GRANT ALL ON * . * TO 'sbuser'@'10.0.0.%';
FLUSH PRIVILEGES;

4.4 proxysql创建监控及应用账户

创建监控账户

UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='123' WHERE variable_name='mysql-monitor_password';
commit;

创建应用账户

INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sbuser','123',0);
commit;

4.5 proxysql应用配置变更

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

4.6 查看mysql监控情况

SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;

4.7 读写分离配置

proxysql的实现方式是做sql路由,可以自定义sql路由规则。这里我们将所有除了select* from update的select全部发送到slave,其他的的语句发送到master。

INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',0,1);
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',1,1);
commit;

#rule_id按顺序号进行规则匹配,不配置默认从1累加
#active表示是否启用这个sql路由项
#match_pattern是正则匹配项
#destination_hostgroup表示我们要将该类sql转发到的mysql组
#apply为1表示该正则匹配后,将不再接受其他匹配,直接转发。

应用配置变更

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

4.8 读写分离检验

登录业务端检验

mysql -usbuser -p123 -h 127.0.0.1 -P6033

select @@server_id被分配到slave


做一个事务,不以select语句开头,begin;select @@server_id;commit;,被分配到master

相关文章

网友评论

      本文标题:12、读写分离中间件-ProxySQL

      本文链接:https://www.haomeiwen.com/subject/yooicltx.html