在 Linux 上实现 MariaDB 负载均衡,常见方案取决于你的业务场景(读多写少、高可用、分布式写等)。下面按 由浅入深、常用方案 给你一个完整说明。
MariaDB 是 关系型数据库,不像 Web 服务那么容易横向扩展:
✅ 所以常见架构是:
Master(写)
|
Slave1、Slave2、Slave3(读)
负载均衡 ≠ 所有节点都能写
| 方案 | 适合场景 | 是否推荐 |
|---|---|---|
| 应用层读写分离 | 简单项目 | ✅ |
| 数据库中间件(MaxScale / ProxySQL) | 企业级 | ✅✅✅ |
| Keepalived + VIP | 高可用 | ✅ |
| MySQL Router | MariaDB 兼容 | ✅ |
| 多主复制(Galera) | 分布式写 | ⚠️ |
| LVS / HAProxy | 纯 TCP 负载 | ⚠️(不智能) |
App
├─ 写 → Master
└─ 读 → Slave1 / Slave2
✅ 优点
❌ 缺点
App
|
ProxySQL
|
├─ Master(写)
└─ Slave(读)
yum install proxysql -y
systemctl start proxysql
systemctl enable proxysql
默认管理端口:
mysql -u admin -padmin -h 127.0.0.1 -P 6032
INSERT INTO mysql_servers (hostgroup_id, hostname, port)
VALUES
(1, '192.168.1.10', 3306), -- master
(2, '192.168.1.11', 3306); -- slave
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply)
VALUES
(1,1,'^SELECT.*FOR UPDATE$',1,1),
(2,1,'^SELECT',2,1);
INSERT INTO mysql_users (username,password,default_hostgroup)
VALUES ('appuser','apppass',1);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
✅ 应用只需连接 ProxySQL:
mysql -h proxysql_ip -P 6033 -u appuser -p
防止 ProxySQL / DB 单点故障:
Keepalived
|
VIP(浮动IP)
|
ProxySQL1 / ProxySQL2
✅ 适合:
❌ 直接用 HAProxy / LVS 负载 MariaDB
→ 无法区分读写
→ 事务容易出问题
App
|
ProxySQL(多节点)
|
├─ MariaDB Master
├─ MariaDB Slave1
├─ MariaDB Slave2
|
Keepalived + VIP
我可以直接给你一套 完整的部署方案 + 配置文件模板 ✅