Linux 数据库服务管理运维实战:MySQL 主从复制、MHA 与 Orchestrator 高可用
一、MySQL 服务部署与 Systemd 管理
1. 生产推荐部署方式
- 使用官方 MySQL 8.0+ 或 Percona Server / MariaDB(根据业务选择)
- 独立数据盘(SSD/NVMe),挂载
/data/mysql
2. Systemd 单元文件模板(推荐) 文件:/etc/systemd/system/mysql.service.d/override.conf(Drop-in 方式)
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/var/run/mysqld/mysqld.pid
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
ExecStartPre=/usr/bin/mysqld_pre_systemd
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=5
LimitNOFILE=65535
LimitCORE=infinity
CPUQuota=400%
MemoryHigh=24G
MemoryMax=32G
OOMPolicy=continue
Slice=database.slice
# 安全强化
ProtectSystem=strict
NoNewPrivileges=true
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_IPC_LOCK
3. 核心配置文件 my.cnf(生产模板)
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
datadir=/data/mysql
socket=/var/run/mysqld/mysqld.sock
log-error=/var/log/mysql/error.log
innodb_buffer_pool_size=24G
innodb_log_file_size=4G
innodb_flush_log_at_trx_commit=2
sync_binlog=1000
max_connections=2000
innodb_flush_method=O_DIRECT
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 复制相关
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
4. 初始化与启动
mysqld --initialize-insecure --user=mysql
systemctl daemon-reload
systemctl enable --now mysql
mysql_secure_installation
二、MySQL 主从复制原理与实战配置
复制原理:
- 异步复制(默认):主库提交事务即返回,备库异步拉取 binlog
- 组复制(MGR):多主高可用(MySQL 8.0+)
1. 主库配置(server-id=1)
log-bin=mysql-bin
server-id=1
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
2. 从库配置(server-id=2)
server-id=2
read_only=ON
relay-log=relay-bin
gtid_mode=ON
enforce_gtid_consistency=ON
3. 搭建复制(GTID 方式) 主库操作:
CREATEUSER'repl'@'%'IDENTIFIEDBY'StrongPass123!';
GRANTREPLICATIONSLAVEON *.* TO'repl'@'%';
SHOWMASTERSTATUS;
从库操作:
CHANGEMASTERTO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='StrongPass123!',
MASTER_AUTO_POSITION=1;
STARTSLAVE;
SHOWSLAVESTATUS\G
4. 延迟监控与优化
-- 主从延迟监控
SELECTTIMEDIFF(NOW(), SUBTIME(NOW(), SEC_TO_TIME(SLAVE_DELAY))) AS delay FROM performance_schema.replication_applier_status;
生产建议:
- binlog 保留策略结合
expire_logs_days
三、MHA(Master High Availability)高可用方案
MHA 是经典的 MySQL 主从自动切换工具,能在主库故障时自动提升从库并修复复制拓扑。
1. 部署架构
2. 安装 MHA
yum install mha4mysql-node mha4mysql-manager -y
3. 配置文件 /etc/mha/app1.cnf
[server default]
user=root
password=StrongPass
ssh_user=root
repl_user=repl
repl_password=StrongPass123!
ping_interval=2
[server1]
hostname=192.168.1.101
candidate_master=1
check_repl_delay=0
[server2]
hostname=192.168.1.102
[server3]
hostname=192.168.1.103
4. 启动 MHA
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --ignore_last_failover > /var/log/mha/app1.log 2>&1 &
5. 切换机制
- 自动切换:主库 Down → 提升最新从库 → 修复其他从库指向新主
- 手动切换:
masterha_master_switch
优缺点:
- 缺点:需要 SSH 免密、对 MySQL 5.7+ 支持较好,8.0+ 需注意
四、Orchestrator 高可用方案(现代推荐)
Orchestrator 是更现代、更强大的 MySQL 拓扑管理工具,支持可视化、自动恢复、伪 GTID 等。
1. 部署方式
2. orchestrator.conf.json 关键配置
{
"MySQLTopologyUser": "orchestrator",
"MySQLTopologyPassword": "StrongPass",
"MySQLOrchestratorUser": "orchestrator",
"MySQLOrchestratorPassword": "StrongPass",
"RaftEnabled": true,
"RaftBind": "192.168.1.110",
"RaftNodes": ["192.168.1.110:3000","192.168.1.111:3000","192.168.1.112:3000"],
"RecoverMasterCluster": true,
"RecoverMasterClusterFilters": ["^app1$"]
}
3. 主要功能
生产优势:比 MHA 更灵活,支持复杂拓扑,社区活跃。
五、数据库备份、恢复与监控
1. 备份策略
- 全量备份:Percona XtraBackup(热备)
xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx
xtrabackup --prepare --target-dir=/backup/full
2. Prometheus 监控 MySQL 使用 mysqld_exporter:
-job_name:mysql
static_configs:
-targets:['192.168.1.101:9104']
关键告警规则:
mysql_slave_status_seconds_behind_master > 30mysql_global_status_uptime < 3600(频繁重启)mysql_global_status_threads_connected > 1800
六、生产环境数据库运维最佳实践
- 专用
database.slice,高 IOWeight innodb_buffer_pool_size 占物理内存 60-70%
- SELinux/AppArmor +
mysqld_db_t - 定期
mysqlcheck + pt-table-checksum
- Keepalived + VIP + MHA/Orchestrator
- ProxySQL / MySQL Router 实现读写分离
- 使用 pt-online-schema-change 无锁改表
- 监控
innodb_buffer_pool_hit_rate
七、常见数据库故障排查案例
案例1:主从复制延迟严重 原因:从库 IO/CPU 不足、慢查询、大事务。 解决:
STOPSLAVE; SETGLOBAL slave_parallel_workers=8; STARTSLAVE;
案例2:MHA 切换失败 排查日志 /var/log/mha/,检查 SSH、复制权限、GTID 一致性。
案例3:Orchestrator 无法检测拓扑 解决:检查 Orchestrator 用户权限、防火墙、Raft 集群状态。
案例4:XtraBackup 恢复失败 解决:严格执行 --prepare 步骤,检查 innodb 日志文件一致性。
案例5:突然大量连接错误 排查:max_connections、back_log、应用连接池配置、慢查询导致。