在家庭环境运行个人网站,实现个人移动设备备份的双机镜像(TimeMachine)、以及个人网站的备份服务器 – 通过合理组合开源技术 glusterfs nfs netatalk 以及 mysql master/slave 实时备份,实现个人数据的高可用解决方案。

硬件设备:两台 Segate GoFlex Home网络存储

GoFlex Home

最终(因为硬件原因),采用两台GoFlex Home存储运行glusterfs服务器,x86硬件的笔记本电脑作为glusterfs客户端输出NetaTalk服务给局域网内苹果系统作为备份设备。即本文的方法二。

方法一:两台GoFlex Home同时运行glusterfs服务器+客户端+NetaTalk服务(能运行但不稳定)

GoFlex Home的内存实在太小了,只有128MB。最初为了能够实现存储文件自动镜像到两台设备上,并且不借助第三方设备,我采用的是在nas1上面运行glusterfs客户端,通过glusterfs客户端挂载nas1nas2输出的镜像模式glusterfs卷。这样,存储到nas1所挂载的glusterfs卷上的文件,就自动镜像到两台设备上。

同时为了给苹果设备提供TimeMachine存储,又在同一个nas1节点上运行netatalkavahi服务,这样Mac系统就可以在局域网发现共享磁盘,可以用来作为备份存储。

这个方案是比较正规的解决方案,但是对硬件资源要求较高,主要有:

  • glusterfs客户端需要占用较大的缓存来加速存储访问,默认是128MB客户端缓存,这个数值甚至超过了GoFlex的全部内存(128M内存Arch Linux ARM使用glusterfs客户端),导致无法挂载存储。虽然可以通过设置performance.cache-size调整到32MB或16MB,但随之带来的是性能的下降。
  • glusterfs客户端需要占用较大的计算资源,在大量复制文件的时候,同时运行glusterfs客户端和服务器端于一身,对GoFlex Home负载较高。
  • 内存不足导致大量的磁盘交换,高峰时间cache只有20多兆数据能够缓存,占用超过60M以上swap交换空间,性能存在波动(2~4M/s波动)。

由于Mac OS X不支持glusterfs客户端,导致必须把glusterfs客户端迁移到GoFlex自身运行,实际上已经失去了glusterfs自动切换的功能(但是保留了数据镜像,所以还是可以保证数据安全性)。

存在问题

  • 在备份我的笔记本100G以上数据,还是存在异常情况,在备份到30多G的时候,出现过glusterfs卷突然丢失挂载,导致TimeMachine终止备份。(我测试了多次,都发生过异常断开问题,并且断开后很难恢复)
  • glusterfs系统的NFS服务无法正常工作,经常发生core dump,最后因为无法稳定工作,所以关闭了glusterfs的NFS输出(gluster volume set g_backup nfs.disable on

实测性能

以上在两台GoFlex Home设备上同时混合运行glusterfs客户端和服务器端,同时兼Apple的文件服务NetaTalk,数据写入速度大约是2MB/s到4MB/s。

方法二:使用x86主机作为glusterfs客户端共享netatalk服务(最终采用)

  • GlusterFS的服务器和客户端其实可以分离,分离客户端的同时,相当于把NetaTalk和Avahi服务也分离出来,不再占用GoFlex Home存储设备的资源。这样,存储设备可以专用于数据存储,只运行GlusterFS服务端,在有限的内存和cpu资源下,可以专机专用,发挥存储镜像高可用所长。

  • 运行GlusterFS客户端和NetaTalk/Avahi的节点,相当于存储设备机头,可以使用树莓派来实现。现在,淘宝上200元可以买到配有512M内存的树莓派主板,配上SD卡、壳子和电源,大致可以在250元实现一个较好性能的GlusterFS存储机头。如果要保障高可用(呃,有点过度设计了,但是对于中小企业有使用价值),可以使用两个树莓派,使用Pacemaker来实现高可用的NetaTalk输出。

我同时在家庭网络中使用一台旧笔记电脑运行CentOS 7,用CentOS 7安装docker来部署各种应用测试,这台CentOS系统,实际也是24小时运行的稳定系统。

由于x86平台的内存很高(8G),可以作为分离的GlusterFS客户端来实现高缓存、高性能的TimeMachine服务。在GoFlex服务器端,可以设置glusterfs卷g_backup如下参数,这样挂载的客户端将提高缓存写入性能:

gluster volume set g_backup performance.cachesize 1GB
gluster volume set g_backup performance.flush-behind on
  • 实测性能

使用TimeMachine通过无线网络备份时,网络速度可以稳定在6~8MB/s,性能大约是直接使用GeFlex Home运行所有服务(glusterfs+netatalk)的3倍左右。

方法三:两台GoFlex Home运行glusterfs服务器+NFS+NetaTalk(没有成功)

今天又测试了一下glusterfs自带的NFS服务,意外发现性能好得出奇。大文件备份能够跑满8MB/s到10MB/s,已经接近我测试直接通过无线存储到笔记本共享NFS的性能了。

虽然NFS输出没有自动的failover,但是对于家用环境,已经实现了数据镜像存储,同时还兼容Mac OS X的文件备份。如果要运行TimeMachine,就在其中一个节点启动NetaTalk服务,就可以实现镜像的TimeMachine:

  • nas1 使用NFS客户端方式挂载glusterfs输出卷 g_backup (这样省略了glusterfs客户端的消耗资源),同时运行 netatalkavahi 服务提供TimeMachine备份。这样写入到NFS挂载目录的文件可以通过底层的glusterfs卷镜像到两个设备。
  • nas2 只输出NFS服务,提供Mac OS X客户端日常的其他文件备份,同时,由于我在独立的vms服务器(一台笔记本电脑)上运行个人网站,需要做数据备份(文件和数据库备份),所以nas2上还运行mysql的slave服务器,提供数据库的实时备份。

但是,使用 nfs+glusterfs的部署方式遇到一个TimeMachine不能备份的报错:

nfs glusterfs can not use time machine

这个问题在采用前述方法二就不存在,并且我对比了方法二正常备份时,本地设备需要3次挂载服务器端输出的卷类似如下

//HuataiHuang@vms._afpovertcp._tcp.local/Time%20Machine  1.7Ti   24Gi  1.7Ti     2%   196321  13911470    1%   /Volumes/Time Machine
//HuataiHuang@vms._afpovertcp._tcp.local/Time%20Machine  1.7Ti   24Gi  1.7Ti     2%   196321  13911470    1%   /Volumes/Time Machine-1
/dev/disk3s2                                             1.7Ti   24Gi  1.7Ti     2%  6206580 445158848    1%   /Volumes/Time Machine Backups

这个问题没能解决,所以暂时放弃,使用前述方法二完成TimeMachine备份。