欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > ProxySQL实现mysql8主从同步读写分离

ProxySQL实现mysql8主从同步读写分离

2025/4/24 15:30:49 来源:https://blog.csdn.net/weixin_74344274/article/details/147397945  浏览:    关键词:ProxySQL实现mysql8主从同步读写分离

实验环境:

机器名称IP配置服务角色备注
proxy192.168.93.20proxysql控制器用于监控管理
master192.168.93.10数据库主服务器
slave1192.168.93.11数据库从服务器
slave2192.168.93.12数据库从服务器

软件的获取:

https://repo.proxysql.com/ProxySQL/proxysql-2.7.x/centos/8/proxysql-2.7.0-1-centos8.x86_64.rpm

软件安装:

[root@Rocky-1 ~]# dnf install proxysql-2.7.0-1-centos8.x86_64.rpm

启动ProxySQL:

[root@Rocky-1 ~]# systemctl enable --now proxysql

下载mariadb,方便本地登录

[root@Rocky-1 ~]# yum install mariadb.x86_64


#管理员用户登录

[root@Rocky-1 ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032

可见有五个库: main、disk、stats 、monitor 和 stats_history
main: 内存配置数据库,即 MEMORY,表里存放后端 db 实例、用户验证、路由规则等信息。main 库中有如下信息:


main库下的主要表:
mysql_servers: 后端可以连接 MySQL 服务器的列表
mysql_users: 配置后端数据库的账号和监控的账号。
mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。


 

注: 表名以 runtime_开头的表示 ProxySQL 当前运行的配置内容,不能通过 DML 语句修改。

只能修改对应的不以 runtime 开头的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盘以供下次重启加载。
disk :持久化的磁盘的配置
stats: 统计信息的汇总
monitor:一些监控的收集信息,比如数据库的健康状态等
stats_history: 这个库是 ProxySQL 收集的有关其内部功能的历史指标

配置步骤:

1、配置ProxySQL所需要的账户:

在 Master (192.168.93.19) 的MySQL 上创建 ProxySQL 的监控账户和对外访问账户

#proxysql的监控账户

create user 'monitor'@'192.168.93.%' identified with mysql_native_password by 'Monitor@123.com';
grant all privileges on *.* to 'monitor'@'192.168.93.%' with grant option;

#proxysql 的对外访问账户
create user 'proxysql'@'172.16.%.%' identified with mysql_native_password by '123456';
grant all privileges on *.* to 'proxysql'@'192.168.93.%' with grant option;

2、创建组,定义写为1,读为0:

MySQL [(none)]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) values (1,0,'proxy');
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> load mysql servers to runtime;
Query OK, 0 rows affected (0.006 sec)

MySQL [(none)]> save mysql servers to disk;
Query OK, 0 rows affected (0.016 sec)

3、添加主从服务器节点:

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (1,'192.168.93.10',3306);
 

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (0,'192.168.93.11',3306);
 

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (0,'192.168.93.12',3306);
 

#加载到当前运行时

MySQL [(none)]> load mysql servers to runtime;

#保存到磁盘
MySQL [(none)]> save mysql servers to disk;
 


status状态显示ONLINE在线状态,注意这里的ip地址不要写错,博主就是当时把“.”写成“,”,找了半天才发现

4、为ProxySQL监控mysql后端节点

MySQL [(none)]> use monitor

MySQL [monitor]> set mysql-monitor_username='monitor';
 

MySQL [monitor]> set mysql-monitor_password='Monitor@123.com';

上面这两句是修改变量的方式还可以在main库下面用sql语句方式修改
在main下修改:
MySQL [main]> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';

MySQL [main]> UPDATE global_variables SET variable_value='Monitor@123.com' WHERE variable_name='mysql-monitor_password';

修改后,保存到runtime和disk
MySQL [monitor]> load mysql variables to runtime;
MySQL [monitor]> save mysql variables to disk;

查看监控账号【ProxySQL】
SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-monitor_%';

也可以这样快速定位:


MySQL [(none)]> select @@mysql-monitor_username;
+--------------------------+
| @@mysql-monitor_username |
+--------------------------+
| monitor                  |
+--------------------------+
1 row in set (0.00 sec)


MySQL [(none)]> select @@mysql-monitor_password;
+--------------------------+
| @@mysql-monitor_password |
+--------------------------+
| Monitor@123.com          |
+--------------------------+
1 row in set (0.00 sec)

验证监控信息,ProxySQL 监控模块的指标都保存在monitor库的log表中 
以下是连接是否正常的监控,对connect指标的监控 ,在前面可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常

5.对心跳信息的监控:

select * from monitor.mysql_server_ping_log limit 10;
 

6.查看read_only日志监控:

select * from mysql_server_read_only_log limit 5;

7.ProxySQL配置对外访问账号:(要在MySQL节点上创建)

查看mysql_users表结构:


将对外访问账号添加到mysql_users表中,我们前面已经创建
用户:proxysql        密码:123456


insert into mysql_users (username,password,default_hostgroup,transaction_persistent) values ('proxysql','123456',1,1);
 
load mysql users to runtime;


save mysql users to disk;


注:
transaction_persistent 如果为1,则一个完整的SQL只可能路由到一个节点;这点非常重要,主要解决这种情况:一个事务有混合的读操作和写操作组成,事务未提交前,如果事务中的读操作和写操作路由到不同节点,那么读取到的结果必然是脏数据。所以一般情况下,该值应该设置为1,尤其是业务中使用到事务机制的情况(默认为0)


mysql_users 表有不少字段,最主要的三个字段username,password,default_hostgroup 

  • username: 前端链接ProxySQL ,以及ProxySQL 将SQL 语句路由给MySQL所使用的的用户名
  • password:用户名对应的密码,。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行select password(PASSWORD),然后将加密结果复制到该字段。 
  • default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为1时,则使用 proxysql 用户发送的SQL语句默认情况下将路由到hostgroup_id=1 组中的某个
     

在从库端1192.168.93.11上通过对方访问账号proxy连接,测试是否路由能默认到hostgroup_id=1,它是一个写组

#通过proxysql用户,创建一个keme库(192.168.93.11)
mysql> create database proxysql;
Query OK, 1 row affected (0.00 sec)


在192.168.93.12验证是否同步:

8、添加读写分离规则(mysql_query_rules):

proxysql支持正则,这里添加两条匹配规则
1、表示像select * from xxx for update这种语句都会分到到写组,
2、表示像select这种语句都会被分配到读组。
 

通过
[root@Rocky-1 ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032
MySQL [(none)]> use main;
插入

insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(1,1,'^select .* for update$',1,1);

insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(2,1,'^select',0,1);

load mysql query rules to runtime;
save mysql query rules to disk;

9、测试

可以看到不同的sql语句分配到了不同的主机库!

核心配置表

img

img

img

img

img

img

4.命令

img

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词