前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 ProxySQL 实现 MySQL 的读写分离

用 ProxySQL 实现 MySQL 的读写分离

原创
作者头像
贺春旸的技术博客
发布2024-07-30 16:27:33
1300
发布2024-07-30 16:27:33
举报
文章被收录于专栏:DBA 平台和工具

是的,这个世界80%的业务都不需要分布式数据库,单机MySQL加一个读写分离足矣。

今天我带你用 ProxySQL 实现 MySQL 的读写分离。

功能:

  1. 将 "select ... for update" 语句和增删改(insert/update/delete)语句发送到主库。
  2. 将 select 只读查询语句发送到从库。
  3. 如果从库的复制延迟超过10秒,ProxySQL会将查询路由到其他可用的从库,如果从库均不可用,会强制把查询请求路由到主库上。
ProxySQL 读写分离架构图
ProxySQL 读写分离架构图

这是我的架构图:

ProxySQL: 端口6603

MySQL主库:端口6666

MySQL从库:端口6667

部署

代码语言:bash
复制
-- 连接到MySQL主库创建ProxySQL的monitor监控账号
mysql> CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
mysql> GRANT SUPER, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'monitor'@'%';

-- 连接到ProxySQL管理界面
# mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

-- 设置一个应用程序使用的用户
mysql> INSERT INTO mysql_users(username, password, default_hostgroup, transaction_persistent) 
VALUES ('rw', '123456', 1, 1);

-- 配置服务器组
mysql> INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0, '192.168.198.239', 6666);
mysql> INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, '192.168.198.239', 6667);

-- 配置读写分离规则
mysql> INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) 
VALUES (1, 1, '^SELECT.*FOR UPDATE$', 0, 1);

mysql> INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) 
VALUES (2, 1, '^SELECT', 1, 1);

-- 匹配所有非SELECT语句
mysql> INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) 
VALUES (3, 1, '^((?!SELECT).)*$', 0, 1);

-- 配置复制组
mysql> INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup, comment)
VALUES (0, 1, 'Read Write Split Host Groups');

-- 启用监控
mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-monitor_enabled';

mysql> UPDATE global_variables SET variable_value='2000' WHERE variable_name IN 
('mysql-monitor_connect_interval',
'mysql-monitor_ping_interval',
'mysql-monitor_read_only_interval',
'mysql-monitor_replication_lag_interval');

-- 配置复制延迟检查
mysql> UPDATE mysql_servers SET max_replication_lag = 10 WHERE hostgroup_id = 1;

-- 启用查询统计
mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-query_digests';
mysql> UPDATE global_variables SET variable_value='3600' WHERE variable_name='mysql-query_digests_max_digest_length';
mysql> UPDATE global_variables SET variable_value='5000' WHERE variable_name='mysql-query_digests_max_query_length';

-- 配置连接池
mysql> UPDATE global_variables SET variable_value='1500' WHERE variable_name='mysql-max_connections';
mysql> UPDATE global_variables SET variable_value='100' WHERE variable_name='mysql-default_max_latency_ms';

-- 应用更改
mysql> LOAD MYSQL USERS TO RUNTIME;
mysql> SAVE MYSQL USERS TO DISK;

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

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

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

这个配置将包括设置读写分离、启用查询统计、配置监控和故障转移等功能。

  1. 配置MySQL用户:设置了一个应用程序使用的用户。
  2. 配置服务器组:设置了一个主服务器(hostgroup 0)和两个从服务器(hostgroup 1)。
  3. 配置读写分离规则:
  4. 将 "SELECT ... FOR UPDATE" 查询发送到主服务器。
  5. 将其他 SELECT 查询发送到从服务器。
  6. 配置复制组:定义了写入组(0)和读取组(1)。
  7. 启用监控:设置了各种监控间隔。
  8. 配置复制延迟检查:设置最大复制延迟为10秒。
  9. 启用查询统计:开启了查询摘要功能,用于性能分析。
  10. 配置连接池:设置最大连接数和默认最大延迟。
  11. 根据你的需求调整参数:调整 max_replication_lag、监控间隔、最大连接数等参数。

监控和维护:

定期检查 stats_mysql_query_digest 表以分析查询性能。

故障转移:

这个配置包含了基本的故障转移设置。如果从服务器的复制延迟超过10秒,ProxySQL会将查询路由到其他可用的从服务器或主服务器。

测试:

1)现在我直接普通查询,你会发现,查询请求路由到了从库上。

2)我在一个事务里查询,你会发现,查询请求路由到了主库上。

3)我当前读select for update,你会发现,查询请求路由到了主库上。

4) 我insert插入,你会发现,查询请求路由到了主库上。

5)我把同步复制进程终止,你会发现,查询请求路由到了主库上。

6)我把同步复制进程恢复,你会发现,查询请求路由到了从库上。

Java代码搞不定的事情,ProxySQL 帮你搞定。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 是的,这个世界80%的业务都不需要分布式数据库,单机MySQL加一个读写分离足矣。
  • 今天我带你用 ProxySQL 实现 MySQL 的读写分离。
  • 功能:
  • 这是我的架构图:
  • 部署
    • 这个配置将包括设置读写分离、启用查询统计、配置监控和故障转移等功能。
    • 监控和维护:
    • 故障转移:
    • 测试:
    • Java代码搞不定的事情,ProxySQL 帮你搞定。
    相关产品与服务
    云数据库 MySQL
    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档