一、MaxScale 基础配置
1. 安装与部署
参考[1][3]步骤安装 MaxScale:
bash
Copy Code
# 创建用户与目录
groupadd maxscale
useradd -g maxscale maxscale
mkdir -p /usr/local/maxscale/var/lib/maxscale
wget https://dlm.mariadb.com/xxx/maxscale-xxx.tar.gz
tar -zxvf maxscale-xxx.tar.gz -C /usr/local/maxscale
chown -R maxscale:maxscale /usr/local/maxscale
2. 配置读写分离
编辑 /etc/maxscale.cnf,定义服务模块与路由规则:
ini
Copy Code
# 主从服务器定义
[server1]
type=server
address=192.168.40.132
port=3306
[server2]
type=server
address=192.168.40.133
port=3306
# 读写分离模块
[Read-Write-Service]
type=service
router=readwritesplit
router_options=slave_selection_criteria=LEAST_CURRENT_OPERATIONS
servers=server1, server2
user=maxscale
password=5CD3AF1688D20ECED2BECEF15C075BC6B02375FE27FFCAC3A12A5FFCBE4FB16C # 加密密码
# 监听器
[Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=6033
二、.NET Core 应用集成
1. 连接字符串配置
在 appsettings.json 中指向 MaxScale 监听端口:
json
Copy Code
{
"ConnectionStrings": {
"Default": "Server=192.168.40.134;Port=6033;Database=DemoDb;User=appuser;Password=123456;"
}
}
2. EF Core 读写分离控制
通过 TagWith() 添加 SQL 注释强制主库路由:
csharp
Copy Code
// 默认读操作路由到从库
var data = _context.Products.Where(p => p.Price > 100).ToList();
// 强制路由到主库(写入或强一致性读取)
var product = _context.Products
.TagWith("/* maxscale route to master */")
.FirstOrDefault(p => p.Id == 100);
3. 事务处理
在显式事务中自动路由到主库:
csharp
Copy Code
using (var transaction = _context.Database.BeginTransaction())
{
// 事务内操作默认路由至主库
_context.Orders.Add(new Order { Amount = 500 });
await _context.SaveChangesAsync();
transaction.Commit();
}
三、验证与调试
步骤 验证方法
MaxScale 运行状态 maxctrl list services 检查 Read-Write-Service 状态是否为 Running
SQL 注释路由 查看 MaxScale 日志,确认包含 maxscale route to master 的请求路由到主库
主从同步延迟 执行 SHOW SLAVE STATUS 验证 Seconds_Behind_Master 接近 0
四、注意事项
注释格式严格性
SQL 注释必须为 /* ... */,且中间无换行,否则 MaxScale 无法识别。
负载均衡策略
可调整 router_options(如 master_reconnection=true)优化主库故障恢复逻辑。
版本兼容性
MaxScale ≥2.3 且配置 comment_syntax 选项以支持 SQL 注释路由。
通过此方案,.NET Core 应用可无缝接入 MaxScale 中间件,实现自动读写分离与高可用数据库架构。