当前位置:首页>Linux>Linux 数据库服务管理运维实战:MySQL 主从复制、MHA 与 Orchestrator 高可用

Linux 数据库服务管理运维实战:MySQL 主从复制、MHA 与 Orchestrator 高可用

  • 2026-10-11 07:29:37
Linux 数据库服务管理运维实战:MySQL 主从复制、MHA 与 Orchestrator 高可用

Linux 数据库服务管理运维实战:MySQL 主从复制、MHA 与 Orchestrator 高可用

一、MySQL 服务部署与 Systemd 管理

1. 生产推荐部署方式

  • 使用官方 MySQL 8.0+ 或 Percona Server / MariaDB(根据业务选择)
  • 独立数据盘(SSD/NVMe),挂载 /data/mysql
  • 使用专用 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;

生产建议:

  • 从库设置为 super_read_only=ON
  • 使用多级复制(级联)减轻主库压力
  • binlog 保留策略结合 expire_logs_days

三、MHA(Master High Availability)高可用方案

MHA 是经典的 MySQL 主从自动切换工具,能在主库故障时自动提升从库并修复复制拓扑。

1. 部署架构

  • Manager 节点(可与监控节点共用)
  • 1 主 + N 从

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. 部署方式

  • 单节点或 Raft 集群模式(推荐 3 节点)
  • 通过 systemd 管理

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. 主要功能

  • 可视化拓扑图
  • 自动故障检测与恢复
  • 拖拽式主从切换
  • 伪 GTID 支持无 GTID 环境
  • 与 Consul / etcd 集成服务发现

生产优势:比 MHA 更灵活,支持复杂拓扑,社区活跃。

五、数据库备份、恢复与监控

1. 备份策略

  • 全量备份:Percona XtraBackup(热备)
  • 增量备份:结合 binlog
  • 脚本示例(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 > 30
  • mysql_global_status_uptime < 3600(频繁重启)
  • mysql_global_status_threads_connected > 1800

六、生产环境数据库运维最佳实践

  1. 资源隔离:

    • 专用 database.slice,高 IOWeight
    • innodb_buffer_pool_size 占物理内存 60-70%
  2. 安全加固:

    • 最小权限账户
    • skip-name-resolve
    • SELinux/AppArmor + mysqld_db_t
    • 定期 mysqlcheck + pt-table-checksum
  3. 高可用组合方案:

    • Keepalived + VIP + MHA/Orchestrator
    • ProxySQL / MySQL Router 实现读写分离
  4. 版本升级与变更:

    • 使用 pt-online-schema-change 无锁改表
    • 灰度升级 + 双写验证
  5. 容量规划:

    • 监控 innodb_buffer_pool_hit_rate
    • 磁盘空间预留 30% 以上

七、常见数据库故障排查案例

案例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、应用连接池配置、慢查询导致。

最新文章

随机文章