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 地址 | 角色 |
|---|---|---|
| 节点1 | 192.168.3.100 | 从库 (Slave) |
| 节点2 | 192.168.3.101 | 主库 (Master) |
| 节点3 | 192.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 servers | MaxScale 集群管理 | 查看代理层管理的数据库节点状态 |
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
- MaxScale:承担读写分离与负载均衡
- MHA:实现主库故障自动切换
- 协同机制:MaxScale实时感知MHA切换后的主从关系变化
2 )拓扑图2
故障转移:MHA监控主库状态,主库宕机时自动切换新主,MaxScale自动适配新拓扑
3 )拓扑图3
双层级容错设计:
-
流量层 (MaxScale)
- 自动读写分离
- 从库负载均衡
- SQL 防火墙
-
数据层 (MHA)
- 主库故障秒级切换
- 从库自动晋升
- 虚拟 IP 漂移
4 )拓扑图4
- 读写分离:客户端通过 MaxScale(端口 4006)访问数据库,写操作路由至主库,读操作负载均衡至从库。
- 故障转移:由 MHA (Master High Availability) 监控主库状态,触发主从切换后,MaxScale 自动感知新主库
技术细节强化
- 主从延迟控制:通过
max_slave_replication_lag自动剔除高延迟Slave - 连接池管理:
max_slave_connections=100%确保所有从库资源充分利用 - 加密安全:生产环境必须使用
maxpasswd加密密码 - 端口策略:默认3306端口冲突时,改用4006等高位端口
路由策略优化: 若需强制读主库,SQL添加注释:
sql SELECT /* maxscale route to master */ * FROM users;
5 )拓扑图 5
- 功能协同:
- 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;"
关键优化项
- 连接保持:配置
wait_timeout避免连接过早断开 - 故障转移:应用层重试逻辑 + 连接池健康检查
- 监控集成:通过 MaxScale REST API 获取实时指标
curl http://admin:mariadb@192.168.3.102:8989/v1/servers - 安全加固:
- 限制 MaxScale 管理端口(6603)访问
- 定期轮换加密密钥
架构优势:通过 MaxScale 与 MHA 协同,实现读写流量自动调度与故障秒级切换,数据库不可用时间降至 10 秒内
关键总结
- MaxScale通过插件化架构实现灵活扩展,核心价值在于读写分离与负载均衡
- 配置需关注监控频率、路由策略及延迟容忍阈值
- 生产环境务必独立部署MaxScale节点并使用加密密码
- 读写分离由
readwritesplit插件实现,读负载均衡由路由策略控制 - 监控模块通过
mysqlmon实时检测节点状态与主从延迟 - 生产环境需独立部署 MaxScale 并启用密码加密
- 结合MHA可实现故障自动转移,形成完整高可用方案
