MySQL: MaxScale架构解析与高可用集群部署实战之插件架构·权限配置·读写分离·监控体系

MaxScale架构与插件体系


MaxScale是由MariaDB公司开发的插件式数据库中间件,提供高可用性、负载均衡及可扩展性支持
核心功能:数据库负载均衡 | 读写分离 | 自动故障转移

其插件体系分为五类:

1 )认证插件 (Authentication Plugin)

  • 验证用户连接时从后端数据库读取mysql.user表信息并缓存
  • 缓存未命中时自动向后端数据库更新用户数据
  • 关键流程:连接请求 → 缓存验证 → 实时更新 → 二次验证

2 )协议插件 (Protocol Plugin)

  • MySQL客户端协议插件:使应用程序将MaxScale识别为标准MySQL服务器(仅需修改连接地址)
  • MySQL服务端协议插件:用于MaxScale连接后端数据库

3 )路由插件 (Router Plugin)

  • readconnroute:实现多服务器读写负载均衡
  • readwritesplit:核心读写分离模块(主写从读)

4 )监控插件 (Monitor Plugin)

  • 实时检测后端数据库状态,确保请求路由至健康节点
  • 支持主从延迟监控(示例参数:max_slave_replication_lag=60

5 )日志过滤插件 (Filter Plugin)

  • 提供基础SQL防火墙功能
  • 支持SQL语句过滤、改写及容错处理

高可用环境部署实战

环境拓扑:

节点IP 地址角色
节点1192.168.3.100从库 (Slave)
节点2192.168.3.101主库 (Master)
节点3192.168.3.102从库 + MaxScale

生产建议:MaxScale 应部署在独立服务器,避免与数据库争抢资源

注:生产环境建议MaxScale独立部署,此处受限于资源与Slave共用节点3
建议:生产环境应将MaxScale部署在独立服务器

安装与配置流程


1 ) 安装步骤

# 1. 下载安装包(需MariaDB账号)
wget https://downloads.mariadb.com/MaxScale/... # 替换为实际URL
 
# 2. 安装依赖库 
yum install libaio libaio-devel 
 
# 3. RPM安装 
rpm -ivh maxscale-*.rpm 

2 ) 数据库权限初始化

-- 创建监控账号(需REPLICATION权限) 主库执行
CREATE USER 'maxscale_monitor'@'192.168.3.%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'maxscale_monitor'@'192.168.3.%';
 
-- 创建路由账号(需MySQL库读取权限) 主库执行
CREATE USER 'maxscale_router'@'192.168.3.%' IDENTIFIED BY '123456';
GRANT SELECT ON mysql.* TO 'maxscale_router'@'192.168.3.%';
# GRANT SELECT ON mysql.user TO 'maxscale_router'@'192.168.3.%';

3 ) 密码加密(可选)

maxkeys # 生成加密密钥 
maxpasswd 123456 # 输出加密字符串 → 用于配置文件
# 输出:96F3C8DE755EF4F4 (替换配置文件明文密码)

4 ) 核心配置文件 (/etc/maxscale.cnf)

[maxscale]
threads=4  # 工作线程数 (建议≤CPU核心数)
 
# 服务器定义
[server1]
type=server
address=192.168.3.100
port=3306 
protocol=MySQLBackend
 
[server2]
type=server 
address=192.168.3.101 
port=3306
protocol=MySQLBackend
 
[server3]
type=server
address=192.168.3.102
port=3306
protocol=MySQLBackend
 
# 监控模块
[MySQL-Monitor]
type=monitor 
module=mysqlmon 
servers=server1,server2,server3 
user=maxscale_monitor 
passwd=123456  # 或使用加密字符串 
monitor_interval=1000  # 监控频率(毫秒)
 
# 读写分离模块 
[Read-Write-Service]
type=service
router=readwritesplit 
servers=server1,server2,server3 
user=maxscale_router 
passwd=123456 
max_slave_connections=100%  # 从库利用率   使用所有可用Slave
max_slave_replication_lag=60  # 最大延迟秒数 (秒) 排除延迟>60s的Slave 
 
# 监听端口 
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MySQLClient 
address=0.0.0.0
port=4006  # 避免与MySQL端口3306冲突 

服务启动与验证


1 ) 启动与管理

maxscale -f /etc/maxscale.cnf  # 启动服务

# 检查端口:
netstat -tuln | grep -E '4006|6603'  # 4006为读写服务端口,6603为管理端口 


maxctrl -u admin -p mariadb  # 默认账号密码
# maxadmin -u admin -p mariadb    # 登录管理台(默认密码mariadb)旧版

2 )集群状态检查

使用场景对比

命令适用场景功能范围
maxctrl list serversMaxScale 集群管理查看代理层管理的数据库节点状态
SHOW SERVERS数据库内部(如 TiDB/Oracle)显示数据库实例的服务器元数据
maxctrl list servers

输出示例:

┌─────────┬───────────────┬───────┬─────────────┬─────────────────┬──────────┐
│ Server  │ Address       │ Port  │ Connections │ State           │ GTID     │ 
├─────────┼───────────────┼───────┼─────────────┼─────────────────┼──────────┤
│ server1 │ 192.168.3.100 │ 3306  │ 0           │ Slave, Running  │ 0-3000-5 │
│ server2 │ 192.168.3.101 │ 3306  │ 0           │ Master, Running │ 0-3000-8 │
│ server3 │ 192.168.3.102 │ 3306  │ 0           │ Slave, Running  │ 0-3000-5 │
└─────────┴───────────────┴───────┴─────────────┴─────────────────┴──────────┘ 

> show servers 
Server  | Address         | Status  | Role    
--------+-----------------+---------+---------
server1 | 192.168.3.100  | Running | Slave  
server2 | 192.168.3.101  | Running | Master 
server3 | 192.168.3.102  | Running | Slave  
 
> show dbusers Read-Write-Service  # 查看缓存用户

3 ) 读写分离测试

使用MySQL客户端连接MaxScale端口4006:

mysql -h 192.168.3.102 -P 4006 -u app_user -p

执行写操作路由至Master(192.168.3.101),读操作负载均衡至Slave节点

读写分离测试:

-- 客户端连接MaxScale(端口4006)
INSERT INTO orders (...) VALUES (...);  -- 写操作路由至主库 
SELECT * FROM orders;  -- 读操作负载均衡到从库 

高可用架构全景


1 )拓扑图1

MHA故障切换机制
MHA故障切换机制
MySQL Client
MaxScale 192.168.3.102
Master 192.168.3.101
Slave 192.168.3.100
Slave 192.168.3.102
  • MaxScale:承担读写分离与负载均衡
  • MHA:实现主库故障自动切换
  • 协同机制:MaxScale实时感知MHA切换后的主从关系变化

2 )拓扑图2

主从复制
主从复制
应用
MaxScale
主库 192.168.3.101
从库 192.168.3.100
从库 192.168.3.102
MHA Manager

故障转移:MHA监控主库状态,主库宕机时自动切换新主,MaxScale自动适配新拓扑

3 )拓扑图3

双层级容错设计:

  1. 流量层 (MaxScale)

    • 自动读写分离
    • 从库负载均衡
    • SQL 防火墙
  2. 数据层 (MHA)

    • 主库故障秒级切换
    • 从库自动晋升
    • 虚拟 IP 漂移
监控
控制
控制
应用客户端
MaxScale:4006
主库 192.168.3.101
从库 192.168.3.100
从库 192.168.3.102
MHA Manager

4 )拓扑图4

监控
故障切换
Client
MaxScale (读写分离)
主库 (192.168.3.101)
从库 (192.168.3.100)
从库 (192.168.3.102)
MHA Manager
  • 读写分离:客户端通过 MaxScale(端口 4006)访问数据库,写操作路由至主库,读操作负载均衡至从库。
  • 故障转移:由 MHA (Master High Availability) 监控主库状态,触发主从切换后,MaxScale 自动感知新主库

技术细节强化

  1. 主从延迟控制:通过max_slave_replication_lag自动剔除高延迟Slave
  2. 连接池管理:max_slave_connections=100%确保所有从库资源充分利用
  3. 加密安全:生产环境必须使用maxpasswd加密密码
  4. 端口策略:默认3306端口冲突时,改用4006等高位端口

路由策略优化: 若需强制读主库,SQL添加注释:
sql SELECT /* maxscale route to master */ * FROM users;

5 )拓扑图 5

客户端
MaxScale
Master: 192.168.3.101
Slave: 192.168.3.100
Slave: 192.168.3.102
MHA Manager
  • 功能协同:
    • MaxScale:处理读写分离与负载均衡
    • MHA(Master High Availability):监控主节点故障,触发主从切换
    • 联动效果:客户端无感知故障转移,MaxScale自动路由至新Master

NestJS工程示例


1 ) 连接MaxScale示例

// database.providers.ts
import { createPool } from 'mysql2/promise';
 
export const databaseProviders = [
  {
    provide: 'DATABASE_POOL',
    useFactory: async () => {
      return createPool({
        host: '192.168.3.102', // MaxScale 节点 
        port: 4006,            // MaxScale监听端口 
        user: 'app_user',
        password: 'securepass',
        database: 'main_db',
        connectionLimit: 10,
        waitForConnections: true
      });
    }
  }
];
 
// user.repository.ts
@Injectable()
export class UserRepository {
  constructor(@Inject('DATABASE_POOL') private pool: Pool) {}
 
  async getUsers(): Promise<User[]> {
    const [rows] = await this.pool.query(
      `SELECT id, name FROM users WHERE active = ?`,
      [1]
    );
    return rows as User[];
  }
 
  async createUser(user: UserDTO): Promise<ResultSetHeader> {
    const [result] = await this.pool.query(
      `INSERT INTO users (name, email) VALUES (?, ?)`,
      [user.name, user.email]
    );
    return result;
  }
}

2 )其他方式

// app.module.ts 
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
 imports: [
   TypeOrmModule.forRoot({
     type: 'mysql',
     host: '192.168.3.102', // MaxScale节点IP 
     port: 4006,           // MaxScale监听端口 
     username: 'app_user',
     password: 'secure_password',
     database: 'my_db',
     autoLoadEntities: true,
   }),
 ],
})
export class AppModule {}

SQL 操作补充

主从延迟监控(MaxScale 管理端)

SELECT host, port, replication_lag FROM mysql_servers;  
-- 输出示例:
-- host           | port | replication_lag 
-- 192.168.3.100 | 3306 | 0 
-- 192.168.3.102 | 3306 | 120  # 延迟 120 秒(将被自动隔离)

连接负载测试

mysqlslap --host=192.168.3.102 --port=4006 --user=test --password=pass \  
          --concurrency=100 --iterations=10 --query="SELECT * FROM orders;"

关键优化项

  1. 连接保持:配置 wait_timeout 避免连接过早断开
  2. 故障转移:应用层重试逻辑 + 连接池健康检查
  3. 监控集成:通过 MaxScale REST API 获取实时指标
    curl http://admin:mariadb@192.168.3.102:8989/v1/servers
    
  4. 安全加固:
    • 限制 MaxScale 管理端口(6603)访问
    • 定期轮换加密密钥

架构优势:通过 MaxScale 与 MHA 协同,实现读写流量自动调度与故障秒级切换,数据库不可用时间降至 10 秒内

关键总结

  1. MaxScale通过插件化架构实现灵活扩展,核心价值在于读写分离与负载均衡
  2. 配置需关注监控频率、路由策略及延迟容忍阈值
  3. 生产环境务必独立部署MaxScale节点并使用加密密码
  4. 读写分离由 readwritesplit 插件实现,读负载均衡由路由策略控制
  5. 监控模块通过 mysqlmon 实时检测节点状态与主从延迟
  6. 生产环境需独立部署 MaxScale 并启用密码加密
  7. 结合MHA可实现故障自动转移,形成完整高可用方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值