Nagios XI高可用方案咨询:多数据中心主从复制手动灾备配置
Nagios XI 跨数据中心DR(主从+手动切换)实操方案
我之前帮几家企业搭建过跨数据中心的Nagios XI灾难恢复环境,刚好碰到过和你一样的网络限制——没法用corosync/pacemaker这类集群组件,只能搞主从复制加手动切换。结合实操经验,给你分享下能最小化数据损失的最优方案,都是踩过坑后总结出来的干货。
核心思路:分模块同步+预备用节点
既然没法做自动集群切换,核心就是把Nagios XI的核心数据、配置按模块做定时/增量同步,同时让备用节点保持“随时能接管”的状态,尽量缩减故障切换后的恢复时间和数据丢失量。
一、必须同步的核心模块
Nagios XI的核心内容分三类,一个都不能落:
- 监控配置文件:主机/服务定义、模板、自定义命令等,主要在
/usr/local/nagios/etc/和/usr/local/nagiosxi/etc/ - 历史与状态数据:MySQL里的
nagios(监控历史)和nagiosxi(XI应用数据)库,还有RRDtool性能数据文件(/usr/local/nagios/share/perfdata/) - XI应用配置:自定义视图、向导配置、用户权限等,集中在
/usr/local/nagiosxi/html/下的缓存和配置目录
二、具体同步实现步骤
1. 配置文件:rsync+crontab增量同步
配置变更不会太频繁,用rsync做增量同步足够,搭配crontab定时执行:
- 主节点写个同步脚本
sync_nagios_configs.sh:#!/bin/bash DR_NODE="dr-nagios.yourdomain.com" SYNC_USER="nagios_sync" # 同步核心监控配置 rsync -avz --delete /usr/local/nagios/etc/ ${SYNC_USER}@${DR_NODE}:/usr/local/nagios/etc/ # 同步XI的应用配置 rsync -avz --delete /usr/local/nagiosxi/etc/ ${SYNC_USER}@${DR_NODE}:/usr/local/nagiosxi/etc/ # 同步自定义监控向导 rsync -avz --delete /usr/local/nagiosxi/html/includes/configwizards/ ${SYNC_USER}@${DR_NODE}:/usr/local/nagiosxi/html/includes/configwizards/ - DR节点配置SSH密钥登录,让rsync不用输密码
- crontab设每5分钟同步一次:
*/5 * * * * /root/sync_nagios_configs.sh > /var/log/nagios_config_sync.log 2>&1 - 注意:平时DR节点的nagios服务要停着,避免重复监控;同步后不用立刻重启DR节点服务,切换时再处理就行。
2. MySQL数据:半同步主从复制(优先)
要最小化数据损失,半同步复制比异步靠谱——主节点提交事务后,必须等DR节点的从库接收并写入中继日志才返回,能避免主节点挂了后数据没传到从库的情况:
- 主节点
/etc/my.cnf(或/etc/mysql/my.cnf)配置:[mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=nagios binlog-do-db=nagiosxi # 开启半同步主库插件 plugin-load-add=rpl_semi_sync_master.so rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000 # 10秒超时后降级为异步,避免主库挂起 - DR节点
my.cnf配置:[mysqld] server-id=2 relay-log=relay-bin read-only=1 # 从库只读,防止误写 # 开启半同步从库插件 plugin-load-add=rpl_semi_sync_slave.so rpl_semi_sync_slave_enabled=1 - 配置主从复制账号,启动从库的IO和SQL线程,之后定期用
SHOW SLAVE STATUS\G检查延迟,重点看Seconds_Behind_Master,超过10秒就得排查网络或主库压力了。
3. RRDtool性能数据:rsync定时同步
RRD是二进制文件,增量同步有点麻烦,我常用两种方式:
- 常规方案:每15分钟用rsync同步整个
perfdata目录,rsync会自动只传变化的部分,15分钟的性能数据损失在可接受范围内 - 大数据量方案:主节点用
rrdcached缓存性能数据,同步缓存目录到DR节点,能减少同步的IO压力 - 注意:DR节点的
perfdata目录权限必须和主节点一致(nagios:nagios),不然Nagios读不了数据。
三、手动故障切换流程(最小化损失版)
主节点挂了后,按这个步骤操作:
- 最后一次抢救同步(如果主节点还能通):手动执行配置和RRD同步脚本,把主节点最后几分钟的数据拉到DR节点,能减少损失
- 隔离主节点:如果主节点还能操作,立刻停掉所有Nagios相关服务,避免恢复后双写冲突
- DR节点接管:
- 停掉MySQL从库模式:
STOP SLAVE; RESET SLAVE ALL;,然后注释掉my.cnf里的read-only=1,重启MySQL - 启动Nagios和XI服务:
systemctl start nagios nagiosxi httpd - 验证:登录XI UI,检查主机/服务监控状态、历史数据是否正常
- 停掉MySQL从库模式:
- 切换访问入口:把原来指向主节点的DNS或VIP改成DR节点的地址,让用户和监控代理连到新主节点
四、额外优化建议(进一步降低损失)
- 自动备份兜底:主节点每天自动备份Nagios XI配置,同步到DR节点,万一同步出问题,还有备份可以恢复
- 定期演练切换:每季度手动切换一次,验证同步完整性和流程顺畅度,别等真出事才手忙脚乱
- 监控同步状态:在主节点上监控rsync日志和MySQL从库延迟,同步失败或延迟过高立刻报警
- 环境完全一致:DR节点的OS版本、Nagios XI版本、依赖包、防火墙规则必须和主节点一模一样,避免切换时出现兼容性问题
踩过的坑提醒
- RRD文件同步时,如果主节点的Nagios正在写文件,同步过去的RRD会损坏!后来我改成同步前停10秒Nagios:
systemctl stop nagios; sleep 10; rsync...; systemctl start nagios,虽然有10秒监控中断,但能保证文件完整 - 半同步超时问题:跨数据中心网络抖动时,主节点会降级为异步,这时候可能丢数据,建议监控
Rpl_semi_sync_master_status状态,变成OFF就报警 - DR节点平时一定要停Nagios服务!不然会重复发告警,用户会收到双倍通知,体验极差
内容的提问来源于stack exchange,提问作者RMK
相关产品推荐
相关产品推荐

