
我们在香港的两个机房部署了一套视频转码系统,主处理节点在Telehouse,冗余和回传节点部署在MEGA-i。然而,仅靠rsync定时任务与FTP手动归档的组合方式,不仅在文件同步上延迟大、冲突频发,更在一次突发断网时,导致数据写入错乱,直接引发任务失败。这次事件彻底暴露了跨机房文件共享的架构短板,也促使我从头构建一个高可用、高性能的NFS集群解决方案,真正实现“读写统一、稳定同步、可横向扩展”。
一、部署目标与整体架构设计
1. 目标
- 实现香港多个机房之间共享统一挂载点,支持大文件读写、并发访问。
- 提供跨节点冗余能力,避免单点故障。
- 提高读写性能,支持多线程并行访问。
- 易于横向扩展,未来可平滑加入新机房节点。
2. 网络与硬件环境
| 组件 | 配置说明 |
|---|---|
| 主NFS节点 | Dell R740 + RAID10 SSD阵列,部署在Telehouse机房 |
| 副NFS节点 | SuperMicro 2U + SATA SSD + 10GbE,部署在MEGA-i机房 |
| 客户端服务器 | 多台应用节点,分布在Telehouse/MEGA-i/中环等地 |
| 网络连接 | 各机房之间通过专线+GRE隧道构建二层互通,MTU配置一致,启用静态路由优化路径 |
二、核心组件选型与技术选型理由
| 功能组件 | 方案 | 说明 |
|---|---|---|
| 文件共享协议 | NFSv4.2 | 支持POSIX锁、并发缓存、ACL等高级功能 |
| 数据一致性同步 | DRBD + Pacemaker + Corosync | 实现跨机房块级镜像复制与主备切换 |
| 元数据高可用 | NFS Ganesha + GlusterFS(实验拓展) | 支持用户态NFS网关,解决传统NFS单点问题 |
| 挂载优化 | Autofs + NFS并行挂载参数 | 提升客户端挂载效率,动态恢复 |
三、实操部署步骤详解
步骤一:初始化主副存储节点,配置DRBD同步
# 两台节点(nfs-master / nfs-slave)都配置:
yum install drbd-utils kmod-drbd -y
# 配置/etc/drbd.d/nfs.res
resource nfs {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
on nfs-master {
address 10.10.10.1:7789;
node-id 0;
}
on nfs-slave {
address 10.10.10.2:7789;
node-id 1;
}
}
# 初始化同步资源
drbdadm create-md nfs
drbdadm up nfs
drbdadm -- --overwrite-data-of-peer primary nfs
主节点初次设置为Primary,副节点保持Secondary以做备份。
步骤二:主节点配置NFS服务
yum install nfs-utils -y
# 编辑 /etc/exports
/mnt/nfs_share 10.10.10.0/24(rw,sync,no_root_squash,no_subtree_check)
# 启动服务
systemctl enable --now nfs-server
exportfs -rv
所有NFS共享目录绑定至DRBD挂载点 /mnt/nfs_share。
步骤三:副节点部署自动接管机制(Pacemaker)
yum install pacemaker corosync pcs -y
systemctl enable pcsd
echo "nfs-ha:StrongPassword123" | passwd --stdin hacluster
# 创建集群
pcs cluster auth nfs-master nfs-slave
pcs cluster setup --name nfscluster nfs-master nfs-slave
pcs cluster start --all
pcs property set stonith-enabled=false
设置VIP与NFS服务在主节点失联后自动切换到副节点,挂载目录由Pacemaker自动挂载。
四、客户端挂载优化与容错机制
客户端挂载参数推荐(支持NFSv4并行处理):
mount -t nfs -o vers=4.2,nolock,tcp,hard,intr,noatime,rsize=1048576,wsize=1048576,timeo=600,retrans=2 10.10.10.100:/mnt/nfs_share /mnt/client_mount
- nolock + hard:避免软挂载不一致
- rsize/wsize:提高吞吐性能
- retrans:控制重试次数防止死挂
- Autofs自动挂载方案(避免重启失败)
yum install autofs -y
# 编辑/etc/auto.master
/mnt/nfs_share /etc/auto.nfs_share
# 编辑/etc/auto.nfs_share
* -rw,vers=4.2 10.10.10.100:/mnt/nfs_share/&
systemctl restart autofs
五、性能调优策略与故障处理建议
NFS服务端内核参数优化(sysctl)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.nfs.nfs_callback_tcpport = 32765
DRBD同步优化
# 优化传输协议与磁盘写策略
drbdadm disk-options nfs --c-plan-ahead 20 --c-fill-target 5M --c-max-rate 100M
| 故障场景 | 排查方向 |
|---|---|
| 客户端挂载失败 | 检查防火墙/NFS端口/SELinux配置 |
| DRBD不同步 | 检查网络、主从状态、硬盘是否一致 |
| 自动切换不生效 | 排查Corosync心跳包延迟、VIP漂移失败 |
六、进一步可扩展方案建议
- NFS多副本分布式方案: 借助GlusterFS搭配NFS-Ganesha实现多副本、多点读写能力。
- 对象存储接入: 为冷热分层做准备,可将冷数据转入Ceph RGW或MinIO。
- 跨境访问优化: 若存在跨香港与新加坡节点同步,可考虑搭配rsync+inotify做异步备份,而非DRBD全同步。
我通过这次实战部署,深刻意识到传统NFS一旦脱离单机环境,背后的同步策略、网络路径、数据一致性都需要系统性设计。在香港多机房环境下,结合DRBD块级同步与NFS服务高可用,不仅解决了跨地域共享的性能瓶颈,也为未来的多活集群构建打下了基础。
下一步,我将尝试基于CephFS或Ganesha将NFS网关容器化,以实现更灵活的弹性挂载和负载均衡部署。











