当前位置: 首页 > news >正文

如何使用maxscale实现mysql读写分离

在 MySQL 5.7 上使用 MaxScale 配置读写分离

以下是针对 MySQL 5.7 使用 MaxScale 实现读写分离的详细步骤,考虑了 MySQL 5.7 的特性和兼容性,确保配置稳定高效。


环境说明

  • 数据库版本:MySQL 5.7.x
  • 主从架构:至少一个主节点和一个或多个从节点,已配置好主从复制
  • MaxScale 版本:推荐使用 MaxScale 2.5.x(稳定,兼容 MySQL 5.7)
  • 操作系统:以 Ubuntu/Debian 或 CentOS 为例

1. 安装 MaxScale

选择兼容版本

MySQL 5.7 发布于 2015 年,推荐使用 MaxScale 2.5.x(如 2.5.20),避免较新版本(如 23.x)可能出现的兼容性问题。

安装步骤(以 Ubuntu 18.04 为例)

  1. 添加 MariaDB 仓库

    sudo apt-get install -y curl
    curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-maxscale-version=2.5.20
    
  2. 安装 MaxScale

    sudo apt-get update
    sudo apt-get install maxscale
    
  3. 验证安装

    maxscale --version
    

    输出类似 maxscale 2.5.20,表示安装成功。

  4. 启动 MaxScale

    sudo systemctl start maxscale
    sudo systemctl enable maxscale
    

CentOS 7 示例

sudo yum install https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
sudo yum install maxscale-2.5.20
sudo systemctl start maxscale

注意

  • 如果无法获取 MaxScale 2.5,可从 MariaDB 官网 下载 RPM/DEB 包手动安装。
  • 确保防火墙允许 MaxScale 监听端口(默认 3306 或自定义)。

2. 配置 MySQL 5.7 主从复制

MaxScale 的读写分离依赖于 MySQL 的主从复制。确保主从架构已正确配置。

主节点配置(/etc/my.cnf/etc/mysql/my.cnf

[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=ROW
bind-address=0.0.0.0

从节点配置(每个从节点不同 server-id

[mysqld]
server-id=2
relay_log=relay-log
read_only=1
bind-address=0.0.0.0

设置主从复制

  1. 主节点创建复制用户

    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_password';
    FLUSH PRIVILEGES;
    
  2. 查看主节点状态

    SHOW MASTER STATUS;
    

    记录 FilePosition

  3. 从节点配置主节点信息

    CHANGE MASTER TO
        MASTER_HOST='192.168.1.10',
        MASTER_USER='repl',
        MASTER_PASSWORD='repl_password',
        MASTER_LOG_FILE='mysql-bin.000001',
        MASTER_LOG_POS=123;
    START SLAVE;
    
  4. 验证从节点状态

    SHOW SLAVE STATUS\G
    

    确保 Slave_IO_RunningSlave_SQL_RunningYes


3. 配置 MaxScale

MaxScale 使用配置文件(默认 /etc/maxscale.cnf)定义后端服务器、监控和服务。

创建配置文件

如果 /etc/maxscale.cnf 不存在,复制模板:

sudo cp /usr/share/maxscale/maxscale.cnf.template /etc/maxscale.cnf

配置步骤

(1) 定义后端服务器

编辑 /etc/maxscale.cnf,添加 MySQL 5.7 主从节点信息:

[maxscale]
threads=auto
log_info=true

# 主节点
[server1]
type=server
address=192.168.1.10
port=3306
protocol=MariaDBBackend

# 从节点 1
[server2]
type=server
address=192.168.1.11
port=3306
protocol=MariaDBBackend

# 从节点 2(可选)
[server3]
type=server
address=192.168.1.12
port=3306
protocol=MariaDBBackend

说明

  • address:MySQL 节点的 IP(主节点 192.168.1.10,从节点 192.168.1.11 等)。
  • protocol=MariaDBBackend:MySQL 5.7 兼容此协议。
  • log_info=true:启用详细日志,便于调试。
(2) 配置监控模块

MaxScale 需要监控主从状态以分配角色。使用 mariadbmon 模块:

[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3
user=monitor
password=monitor_password
monitor_interval=2000
auto_failover=false
auto_rejoin=true

说明

  • module=mariadbmon:适合 MySQL 5.7 的主从监控。
  • servers:列出所有后end服务器。
  • userpassword:MySQL 监控用户。
  • monitor_interval:监控频率(毫秒)。
  • auto_failover=false:MySQL 5.7 不建议启用自动主从切换(需 GTID)。
  • auto_rejoin=true:允许从节点重新加入集群。

创建监控用户(在 MySQL 主从节点上):

CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor_password';
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'monitor'@'%';
GRANT SELECT ON mysql.* TO 'monitor'@'%';
FLUSH PRIVILEGES;

注意

  • MySQL 5.7 需授予 mysql.* 表的 SELECT 权限,以便 mariadbmon 读取用户表。
  • 确保 monitor 用户能从 MaxScale 的 IP 访问。
(3) 配置读写分离服务

添加服务以实现读写分离:

[ReadWriteService]
type=service
router=readwritesplit
servers=server1,server2,server3
user=app_user
password=app_password
max_slave_connections=100%
enable_root_user=false

说明

  • router=readwritesplit:写操作路由到主节点,读操作路由到从节点。
  • userpassword:应用连接 MySQL 的账户。
  • max_slave_connections:从节点连接分配比例(100% 表示均衡使用)。
  • enable_root_user=false:禁用 root 用户连接。

创建应用用户(在 MySQL 主从节点上):

CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_password';
GRANT ALL ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

注意

  • MySQL 5.7 默认使用 mysql_native_password,MaxScale 2.5 完全支持。
(4) 配置监听器

定义客户端连接的监听器:

[ReadWriteListener]
type=listener
service=ReadWriteService
protocol=MariaDBClient
port=3306

说明

  • port:MaxScale 监听端口(可自定义,如 4006)。
  • protocol=MariaDBClient:兼容 MySQL 5.7。
(5) 保存并重启

保存 /etc/maxscale.cnf 后,重启 MaxScale:

sudo systemctl restart maxscale

4. 验证配置

  1. 检查 MaxScale 状态

    maxctrl show servers
    

    输出示例:

    Server: server1
      Status: Master, Running
    Server: server2
      Status: Slave, Running
    Server: server3
      Status: Slave, Running
    
  2. 检查监控状态

    maxctrl show monitor MariaDB-Monitor
    

    确保状态为 Running

  3. 检查服务

    maxctrl show service ReadWriteService
    

5. 连接 MaxScale

应用通过 MaxScale 的监听端口连接:

连接示例

mysql -u app_user -papp_password -h 127.0.0.1 -P3306

应用连接配置

  • 主机:MaxScale 的 IP(如 127.0.0.1
  • 端口:3306(或自定义端口)
  • 用户和密码:app_user / app_password

6. 测试读写分离

  1. 测试写操作

    USE app_db;
    INSERT INTO test_table (column_name) VALUES ('test');
    

    检查主节点(192.168.1.10),数据应写入。

  2. 测试读操作

    SELECT * FROM test_table;
    

    检查从节点(192.168.1.11192.168.1.12),请求应路由到从节点。

  3. 验证路由
    查看 MaxScale 日志(/var/log/maxscale/maxscale.log)或服务统计:

    maxctrl show service ReadWriteService
    

7. 高级配置(可选)

  • 控制复制延迟
    设置最大延迟:

    [ReadWriteService]
    max_replication_lag=1
    
  • 负载均衡
    为从节点设置权重:

    [server2]
    weight=100
    [server3]
    weight=50
    
  • 事务一致性
    启用事务重放:

    [ReadWriteService]
    transaction_replay=true
    
  • 高可用性
    部署多个 MaxScale 实例,使用 Keepalived 或负载均衡器。


8. MySQL 5.7 特有注意事项

  1. 认证插件

    • MySQL 5.7 默认使用 mysql_native_password,MaxScale 2.5 无需额外配置。
  2. GTID 支持

    • MySQL 5.7 支持 GTID,但配置复杂。建议禁用:
      [MariaDB-Monitor]
      detect_replication_lag=true
      gtid_compare=false
      
  3. 权限问题

    • 确保 monitorapp_user% 主机权限:
      GRANT ALL ON app_db.* TO 'app_user'@'%';
      
  4. 日志兼容性

    • 禁用慢查询日志和一般查询日志:
      [mysqld]
      slow_query_log=0
      general_log=0
      
  5. 复制格式

    • 确保 binlog_format=ROW

9. 常见问题与排查

  • 连接失败

    • 检查日志:/var/log/maxscale/maxscale.log
    • 确保 MySQL 用户有 % 主机权限:
      SELECT User, Host FROM mysql.user;
      
    • 验证端口:
      netstat -tuln | grep 3306
      
  • 主从角色错误

    • 检查 mariadbmon
      maxctrl show monitor MariaDB-Monitor
      
    • 验证 MySQL 复制:
      SHOW SLAVE STATUS\G
      
  • 读写分离不生效

    • 确认 readwritesplit
      maxctrl show service ReadWriteService
      
  • 复制延迟

    • 检查延迟:
      maxctrl show servers
      
    • 调整 max_replication_lag

10. 总结

  • MaxScale 2.5 是 MySQL 5.7 的理想代理工具,通过 readwritesplit 实现读写分离。
  • 配置流程:安装 → 配置 MySQL 主从 → 定义 MaxScale 服务器、监控、服务和监听器 → 测试。
  • 注意 MySQL 5.7 的认证、GTID 和权限配置。

相关文章:

  • Java 反序列化之 XStream 反序列化
  • [c语言日记]轮转数组算法(力扣189)
  • JavaScript中的运算符与语句:深入理解编程的基础构建块
  • CentOS下,Xftp中文文件名乱码的处理方式
  • 【第42节】windows双机调试环境搭建和SEH原理剖析
  • RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法
  • 【科普】轨道交通信号系统相关名词解释
  • 基础贪心算法集合2(10题)
  • flutter-Text等组件出现双层黄色下划线的问题
  • android-根据java文件一键生成dex文件脚本
  • js | 网页上的 json 数据怎么保存到本地表格中?
  • NAS-相关软件推荐——非相册和备份的
  • 影刀RPA证书题库包含初级、中级、高级和AP初级
  • Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化
  • try...catch、async/await和Promise区别与联系
  • Openlayers:实现聚合
  • [LeetCode 55] 跳跃游戏
  • 【今日三题】经此一役小红所向无敌(模拟) / 连续子数组最大和(动态规划) / 非对称之美(贪心)
  • 在Ubuntu下进行单片机开发是否需要关闭Secure Boot
  • 扩展欧几里得算法:求解乘法逆元
  • 秭归“橘颂”:屈原故里打造脐橙全产业链,创造12个亿元村,运输用上无人机
  • 五一节,和人民照相馆一起找回“拍照”的仪式感
  • 导演汪俊:与孙俪默契合作,还原“蛮好的人生”
  • 新证据表明:地球水或为“自产”而非“外来”
  • 白宫新闻秘书:美政府将在法庭上回应哈佛大学诉讼
  • 王毅同英国外交大臣拉米通电话