对于将NAS作为核心存储依赖的小型工作室和企业用户来说,单点故障是无法承受的风险——硬盘损坏可以通过RAID保护,但如果主板故障、电源烧毁或操作系统崩溃,整个NAS将完全停止服务,恢复时间可能长达数小时甚至数天。双活高可用(High Availability)方案通过两台NAS设备互为热备,实现故障自动切换和零停机服务。本文将详细介绍使用Keepalived和DRBD构建NAS双活高可用集群的完整方案。

一、NAS高可用架构设计与原理分析
高可用架构的核心思想是消除单点故障。在双节点NAS集群中,两台设备同时在线运行,一台作为主节点(Active)处理所有读写请求,另一台作为备节点(Standby)实时同步数据。当主节点发生故障时,备节点自动接管服务(Failover),整个过程对用户透明,业务几乎不中断。
实现NAS高可用需要解决三个核心问题:数据一致性、服务切换和故障检测。数据一致性通过DRBD(Distributed Replicated Block Device)实现——它在两台设备的块设备级别进行实时数据镜像,主节点写入的数据通过网络同步到备节点,确保两端数据完全一致。服务切换通过Keepalived实现——它使用VRRP协议管理一个虚拟IP地址(VIP),主节点持有VIP处理请求,故障时备节点自动接管VIP。故障检测由Keepalived内置的健康检查机制完成,支持网络层、传输层和应用层多层检测。
方案选型对比:DRBD适合需要块级别同步的场景(如数据库、虚拟机磁盘),配置灵活但需要Linux内核模块支持;SyncThing适合文件级别的同步,配置简单但延迟较高且不支持实时镜像;GlusterFS和Ceph是分布式文件系统,支持多节点同时读写但部署复杂度高。对于双节点NAS高可用,DRBD + Keepalived是成熟稳定且文档丰富的经典方案。
网络架构要求:两台NAS之间需要两条独立的网络链路——一条用于业务数据传输(数据网络),一条用于DRBD数据同步(复制网络)。复制网络建议使用万兆直连或专用交换机端口,减少同步延迟。同时,Keepalived的健康检查通过数据网络进行,避免单网络故障导致误切换。
硬件需求:两台配置相同的NAS设备(CPU、内存、硬盘数量和容量最好一致),每台至少双网卡,至少4块硬盘(2块用于系统+应用,2块用于数据镜像)。不建议在不同硬件配置的设备间做高可用——性能差异会导致切换后服务质量下降。
二、DRBD数据同步的配置与优化
DRBD的安装和配置是整个方案中最关键的环节。以Debian/Ubuntu为基础的NAS系统为例:安装drbd-utils和drbd-dkms内核模块包。注意内核模块版本必须与系统内核版本匹配,建议在安装前执行apt update并确认内核为最新版本。
DRBD资源配置文件/etc/drbd.d/nasdata.res的基本结构:resource nasdata段定义资源名称;在两个host段中分别配置每个节点的设备路径(/dev/drbd0)、磁盘路径(/dev/sdb1)和连接地址。关键参数说明:protocol C表示同步复制模式(写入确认后才返回成功,确保数据零丢失),这是最安全但延迟最高的模式;protocol B是半同步模式,protocol A是异步模式。对于数据安全要求高的场景,必须使用protocol C。
元数据磁盘(meta-disk)是DRBD的内部数据结构,记录同步状态和日志。推荐使用internal模式(元数据存储在数据盘的末尾区域),配置简单且不占用额外磁盘。如果数据盘空间紧张或需要更大的元数据区域,可以使用external模式将元数据存储在单独的小分区上。
初始化流程:在两台节点上分别创建DRBD元数据(drbdadm create-md nasdata),然后启动DRBD服务(systemctl start drbd)。首次启动时需要指定主节点:drbdadm primary --force nasdata,DRBD会开始全量同步——将主节点的磁盘数据完整复制到备节点。全量同步时间取决于磁盘容量和网络带宽,1TB数据在万兆直连下约需30分钟到1小时。
同步完成后的状态检查:drbdadm status命令可以查看连接状态和同步进度。正常状态应显示"cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate"。如果看到"cs:StandAlone"表示连接断开,需要检查网络和防火墙配置。
DRBD性能优化建议:启用自适应同步速率(c-plan-ahead、c-max-rate、c-fill-target参数),让DRBD在不影响前台业务的前提下动态调整同步速度;设置网络缓冲区大小(sndbuf-size和max-buffers)匹配网络延迟特性;启用在线验证(drbdadm verify)定期校验两端数据一致性,每月执行一次即可。对于小文件密集型场景,调大resync-rate和socket-check-timeout可提升同步效率。
三、Keepalived虚拟IP与服务自动切换
Keepalived负责管理虚拟IP和服务监控。安装后编辑/etc/keepalived/keepalived.conf配置文件。主节点的配置:state MASTER(主节点角色)、interface eth0(绑定到数据网络接口)、virtual_ipaddress段设置VIP地址、track_script段配置健康检查脚本。
健康检查脚本是Keepalived的核心——它定期检查NAS服务是否正常运行。建议检查以下项目:NFS/SMB服务进程是否存在(systemctl is-active nfs-server或smbd)、DRBD连接状态是否正常(drbdadm status检查cs和ds字段)、数据盘挂载状态(mount | grep /dev/drbd0)、以及Web管理界面是否可访问(curl HTTP状态码检查)。如果任何一个检查失败,Keepalived会自动降低本节点优先级,触发VIP切换到备节点。
备节点的Keepalived配置与主节点基本相同,但state改为BACKUP,priority设置低于主节点(如主节点100,备节点90)。当主节点故障恢复后,可以通过nopreempt参数控制是否自动回切——设置nopreempt表示故障恢复后不自动抢占VIP,避免频繁切换导致的服务抖动。
NFS和SMB服务的切换需要注意客户端行为。NFS客户端在服务端切换后可能出现"stale file handle"错误,需要客户端重新挂载。解决方案包括:使用NFSv4的fsid=0和根导出配置,减少切换影响;在客户端设置soft挂载选项和retrans参数,超时后自动重试;以及使用autofs自动挂载机制,实现透明的重新连接。
SMB服务切换相对透明——Windows客户端在连接中断后会自动重试,Keepalived切换VIP后客户端通过VIP重新连接即可。建议在SMB配置中启用oplocks(机会锁)和strict locking以提高客户端体验。
故障切换演练是高可用方案上线前的必要步骤。建议每月执行一次手动故障切换测试:在主节点执行systemctl stop keepalived模拟故障,观察备节点是否在预期时间内(通常30秒内)成功接管VIP和服务。切换完成后验证数据一致性(对比两端的文件列表和校验和),确认无误后在原主节点恢复Keepalived并观察服务是否自动回切。通过定期演练,确保在真实故障发生时高可用机制能正常工作。


评论(0)