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

基于 MaxScale 实现 MySQL 读写分离

在高并发 MySQL 场景中,读写分离是提升数据库性能的核心手段之一。MaxScale 作为 MariaDB 官方推出的开源中间件,凭借灵活的插件机制和对数据一致性的精准控制,成为实现 MySQL 读写分离的优质选择。本文将详细介绍 MaxScale 的工作原理、部署步骤及最佳实践,帮助运维人员快速搭建可靠的读写分离架构。

一、MaxScale 读写分离核心原理

MaxScale 实现 MySQL 读写分离的核心在于智能路由与数据一致性保障,其关键机制包括:

  1. 读写请求分流
    通过readwritesplit路由器插件,自动将写操作(如INSERTUPDATEDELETE)路由至主库,读操作(如SELECT)分发至从库,减轻主库压力。

  2. 数据一致性控制
    依托 MySQL 半同步复制,MaxScale 通过以下方式确保从库读取的数据有效性:

    • 延迟阈值控制:通过max_slave_replication_lag参数设定允许的最大主从延迟(如 1 秒),超过该阈值的从库将被排除在读请求路由之外;
    • 因果读取:配置causal_reads=local后,若从库延迟较高,MaxScale 会等待causal_reads_timeout(默认 10 秒),超时后自动将请求路由至主库,避免读取过期数据。
  3. 故障容错
    当所有从库延迟均超过阈值时,读请求将自动路由至主库,保证业务连续性(需注意主库负载压力)。

二、部署环境与拓扑规划

1. 环境说明

  • 数据库架构:1 主 2 从半同步复制(MySQL 5.7+)
  • MaxScale 版本:6.1.4(支持 MySQL 读写分离的稳定版本)
  • 操作系统:CentOS 7

2. 节点拓扑

主机名IP 地址角色说明
node410.186.63.88MaxScale 中间件处理读写请求路由
node110.186.61.191MySQL 主库(Master)处理写操作,同步数据至从库
node210.186.61.192MySQL 从库(Slave)处理读操作
node310.186.63.64MySQL 从库(Slave)处理读操作

三、部署步骤详解

1. 后端 MySQL 环境准备

(1)配置主从半同步复制

确保主库已开启半同步复制,从库正常同步:

-- 主库验证半同步客户端数量(应为2,对应两个从库)
mysql> show global status like 'Rpl_semi_sync_master_clients';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| Rpl_semi_sync_master_clients | 2     |
+------------------------------+-------+-- 查看从库状态
mysql> show slave hosts;
+-----------+---------------+------+-----------+--------------------------------------+
| Server_id | Host          | Port | Master_id | Slave_UUID                           |
+-----------+---------------+------+-----------+--------------------------------------+
| 737716692 | 10.186.61.192 | 3306 | 622227692 | d121bf0f-1922-11ed-86d9-02000aba3dc0 |
| 534997148 | 10.186.63.64  | 3306 | 622227692 | bb3d53a9-1940-11ed-a059-02000aba3f40 |
+-----------+---------------+------+-----------+--------------------------------------+

(2)创建 MaxScale 所需用户
  • 路由用户:用于 MaxScale 连接数据库并路由请求

    CREATE USER 'maxscale'@'%' IDENTIFIED BY '123';
    GRANT SELECT ON mysql.* TO 'maxscale'@'%';  -- 需查询mysql库获取主从信息
    GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';
    

  • 监控用户:用于 MaxScale 监控主从状态

    CREATE USER 'monitor'@'%' IDENTIFIED BY '123';
    GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%';  -- 允许查看复制状态
    

2. 安装与配置 MaxScale

(1)安装依赖与 MaxScale
# 安装依赖包
yum -y install libcurl libaio openssl gnutls libatomic# 下载并解压安装包
wget https://dlm.mariadb.com/1864578/MaxScale/6.1.4/bintar/rhel/7/x86_64/maxscale-6.1.4.rhel.7.tar.gz
mkdir -p /data/maxscale
tar xf maxscale-6.1.4.rhel.7.tar.gz -C /data/maxscale --strip-components=1# 创建运行用户
groupadd maxscale
useradd -g maxscale maxscale
chown -R maxscale.maxscale /data/maxscale

(2)密码加密(安全加固)

MaxScale 需加密存储数据库用户密码,避免明文泄露:

# 生成加密密钥
/data/maxscale/bin/maxkeys /data/maxscale/var/lib/maxscale# 加密用户密码(以密码123为例)
/data/maxscale/bin/maxpasswd /data/maxscale/var/lib/maxscale/ 123
# 输出加密后的密码(示例):F270B97B3D4D37BC619EB02304A02C1456F41B05CF2D7E5F37BA48CC7646C2E4

(3)配置 MaxScale 核心文件(maxscale.cnf)

配置文件需定义服务器节点、监控模块、路由服务及监听器,路径为/data/maxscale/etc/maxscale.cnf

[maxscale]
threads=auto  # 自动分配线程数# 后端MySQL服务器定义
[dbserv1]
type=server
address=10.186.61.191  # 主库IP
port=3306
protocol=MariaDBBackend[dbserv2]
type=server
address=10.186.61.192  # 从库1 IP
port=3306
protocol=MariaDBBackend[dbserv3]
type=server
address=10.186.63.64   # 从库2 IP
port=3306
protocol=MariaDBBackend# 主从监控模块
[Replication-Monitor]
type=monitor
module=mariadbmon  # 监控主从复制状态的插件
servers=dbserv1, dbserv2, dbserv3
user=monitor  # 监控用户
password=F270B97B3D4D37BC619EB02304A02C1456F41B05CF2D7E5F37BA48CC7646C2E4  # 加密后的密码
monitor_interval=2000ms  # 监控间隔# 读写分离服务
[Read-Write-Service]
type=service
router=readwritesplit  # 读写分离路由插件
servers=dbserv1, dbserv2, dbserv3
user=maxscale  # 路由用户
password=F270B97B3D4D37BC619EB02304A02C1456F41B05CF2D7E5F37BA48CC7646C2E4  # 加密后的密码
max_slave_connections=2  # 每个从库最大连接数
master_accept_reads=false  # 主库不处理读请求(除非从库不可用)
max_slave_replication_lag=1s  # 允许的最大从库延迟
# causal_reads=local  # 开启因果读取(按需启用)
# causal_reads_timeout=10  # 因果读取超时时间# 监听器(客户端连接入口)
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=33060  # MaxScale监听端口(区别于MySQL的3306)

3. 启动 MaxScale 服务

(1)创建系统服务文件
cat > /usr/lib/systemd/system/maxscale.service << 'EOF'
[Unit]
Description=MariaDB MaxScale Database Proxy
After=network.target[Service]
Type=forking
Restart=on-abort
User=maxscale
Group=maxscale
ExecStart=/data/maxscale/bin/maxscale --user=maxscale --basedir=/data/maxscale/ --config=/data/maxscale/etc/maxscale.cnf
TimeoutStartSec=120
LimitNOFILE=65535
RestartForceExitStatus=75[Install]
WantedBy=multi-user.target
EOF

(2)启动并验证服务
systemctl daemon-reload
systemctl start maxscale
systemctl enable maxscale  # 开机自启# 检查服务状态
systemctl status maxscale

四、读写分离效果验证

1. 查看后端服务器状态

使用maxctrl工具检查 MaxScale 识别的主从状态:

maxctrl list servers

预期输出(主库标记为Master,从库为Slave):

┌─────────┬───────────────┬──────┬─────────────┬─────────────────┐
│ Server  │ Address       │ Port │ Connections │ State           │
├─────────┼───────────────┼──────┼─────────────┼─────────────────┤
│ dbserv1 │ 10.186.61.191 │ 3306 │ 1           │ Master, Running │
│ dbserv2 │ 10.186.61.192 │ 3306 │ 1           │ Slave, Running  │
│ dbserv3 │ 10.186.63.64  │ 3306 │ 1           │ Slave, Running  │
└─────────┴───────────────┴──────┴─────────────┴─────────────────┘

2. 验证读请求分发

通过 MaxScale 端口(33060)连接数据库,多次执行读操作,观察返回的主机名(需数据库开启hostname系统变量):

# 连接MaxScale
mysql -umaxscale -p123 -h 10.186.63.88 -P 33060# 执行读操作(多次执行)
mysql> select @@hostname;

预期结果:读请求交替路由至 node2 和 node3(从库),证明读请求分发生效。

3. 验证写请求路由

执行写操作(如插入数据),检查主从数据同步情况:

-- 在MaxScale连接中执行写操作
mysql> insert into test.t values(1, 'test');-- 分别登录主库和从库,验证数据是否同步
-- 主库(node1)
mysql> select * from test.t;  -- 应有新增记录-- 从库(node2)
mysql> select * from test.t;  -- 应有新增记录(半同步复制确保同步)

五、最佳实践与注意事项

  1. 主库负载保护
    当所有从库延迟超限时,读请求会全部路由至主库,可能导致主库过载。建议:

    • 合理设置max_slave_replication_lag(如业务允许可放宽至 3-5 秒);
    • 监控主库负载,必要时临时扩容从库。
  2. 用户权限最小化
    MaxScale 的maxscale用户仅需SELECT(mysql 库)和SHOW DATABASES权限,monitor用户仅需REPLICATION CLIENT,避免过度授权。

  3. 连接池优化
    根据业务并发量调整max_slave_connectionsmax_connections参数,避免连接数不足或资源浪费。

  4. 监控与告警
    通过 MaxScale 的监控插件(如prometheus)收集路由指标,设置主从延迟、连接数等关键指标的告警阈值。

总结

MaxScale 通过插件化设计实现了 MySQL 读写分离的灵活配置,尤其在数据一致性控制上表现出色。通过本文的部署步骤,可快速搭建 “1 主 2 从 + MaxScale” 架构,将读压力分流至从库,同时保障数据读取的有效性。实际应用中,需结合业务特性调整延迟阈值和连接参数,平衡性能与一致性,构建高可用的数据库服务。


文章转载自:
http://nfwi .wsgyq.cn
http://euphotic .wsgyq.cn
http://scenic .wsgyq.cn
http://kafiri .wsgyq.cn
http://chin .wsgyq.cn
http://damfool .wsgyq.cn
http://launch .wsgyq.cn
http://menorca .wsgyq.cn
http://decemvirate .wsgyq.cn
http://fluidics .wsgyq.cn
http://cysticercus .wsgyq.cn
http://bosun .wsgyq.cn
http://headlock .wsgyq.cn
http://debutant .wsgyq.cn
http://autosomal .wsgyq.cn
http://purine .wsgyq.cn
http://subdivision .wsgyq.cn
http://osteology .wsgyq.cn
http://reforge .wsgyq.cn
http://palate .wsgyq.cn
http://boar .wsgyq.cn
http://houston .wsgyq.cn
http://spirivalve .wsgyq.cn
http://doyen .wsgyq.cn
http://droning .wsgyq.cn
http://polyarchy .wsgyq.cn
http://hyperalimentation .wsgyq.cn
http://pulpiteer .wsgyq.cn
http://kylix .wsgyq.cn
http://breathtaking .wsgyq.cn
http://www.dtcms.com/a/293766.html

相关文章:

  • 使用Imgui和SDL2做的一个弹球小游戏-Bounze
  • 3.6 常见问题与调试
  • 编程语言Java——核心技术篇(二)类的高级特性
  • Semantic Kernel实现调用Kernel Memory
  • 华为云数据库 GaussDB的 nvarchar2隐式类型转换的坑
  • Python-初学openCV——图像预处理(一)
  • C++刷题 - 7.23
  • 开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端
  • 在 Ubuntu 20.04.5 LTS 系统上安装 Docker CE 26.1.4 完整指南
  • Spring Cloud Alibaba Sentinel 基本工作原理源码阅读
  • MACOS安装配置Gradle
  • 国产数据库转向 “融合” 赛道:电科金仓的下一代形态定义之路
  • 基于Matlab传统图像处理技术的车辆车型识别与分类方法研究
  • 资本押注会成长的玩具,AI潮玩赛道开始升温
  • 华为云ELB(弹性负载均衡)持续报异常
  • 永磁同步电机控制算法--弱磁控制(负载能力最大化的定交轴)
  • 【C++】C++ 的入门语法知识1
  • 在easyui中如何设置自带的弹窗,有输入框
  • 解决Spring事务中RPC调用无法回滚的问题
  • 零基础学编程,编程从入门到精通系列教程,附:编程工具箱之时间计算构件的用法#零基础自学编程 学习计划#新手学编程 高效学习方法
  • HF83311_VB1/HF83311Q_VB1:高性能USB HiFi音频解码器固件技术解析
  • Leetcode-15. 三数之和
  • 《计算机“十万个为什么”》之 [特殊字符] 深浅拷贝 引用拷贝:内存世界的复制魔法 ✨
  • 1.1 Deep learning?pytorch ?深度学习训练出来的模型通常有效但无法解释合理性? 如何 解释?
  • 英语词汇积累Day1-10(summary)
  • Django实战:Python代码规范指南
  • 【Java】Reflection反射(代理模式)
  • 算法竞赛备赛——【图论】最小生成树
  • 《元素周期表》超高清PDF
  • IDEA如何管理多个Java版本。