GoFlex Home的内存实在太小了,只有128MB。实际测试下来,虽然将 performance.cache-size 设置成 16MB,使得GoFlex Home可以挤出可怜的16M内存用来作为glusterfs的客户端卷缓存,但是,实际上为了能够同时提供NFS输出和netatalk、avahi支持(用于苹果设备的TimeMachine备份),需要消耗更多的内存。

部署跨网络镜像的TimeMachine存储虽然实现了双存储镜像的glusterfs来支持运行NetaTalk,提供高可靠的Apple TimeMachine备份存储。但是实际上由于硬件性能实在有限,备份数据的效率较低,平均只有 2MB/s 到 4MB/s 的写入速度,并且性能波动很大(由于内存不足,需要不断内存换页)。

换一个思路:

  • 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服务。

本文实践是接着使用两台Seagate GoFlex Home网络存储部署glusterfs分布式文件系统部署跨网络镜像的TimeMachine存储文档,先前的部署可以参见这两个文档。

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

GoFlex Home设备简化服务

由于将glusterfs客户端和netatalk服务分离到其他设备,则在 nas1nas2 设备上,执行以下步骤:

  • 关闭 netatalk 和 avahi
  • 关闭 glusterfs的NFS服务
  • 调整 glusterfs的g_backup卷的客户端缓存(客户端运行在笔记本vms主机)

nas1nas2上执行关闭netatalk和avahi

systemctl stop netatalk.service
systemctl disable netatalk.service
systemctl stop avahi-daemon.service
systemctl disable avahi-daemon.service

nas1 上执行关闭glusterfs上的NFS服务

gluster volume set g_backup nfs.disable on

nas1 上执行设置g_backup卷缓存设置 256M

gluster volume set g_backup performance.cache-size 256MB

安装部署GlusterFS客户端(vms服务器)

挂载glusterfs存储卷的系统是运行CentOS 7的x86笔记本,直接安装发行版本提供的glusterfs客户端

yum install glusterfs-fuse

加载 fuse 模块

modprobe fuse

添加 /etc/fstab 内容如下

192.168.1.91:/g_backup    /g_backup  glusterfs       noauto,_netdev         0 0

并挂载

mkdir /g_backup
mount /g_backup

安装netatalk

CentOS 没有直接提供 netatalk 发行包,需要从 netatalk官网 下载源代码进行编译。(Installing Netatalk from source rpm介绍了一些依赖软件包的安装,可参考,不过我实践下来需要安装以下几个软件开发库:

yum install libdb-devel avahi-devel libacl-devel dbus-glib-devel
  • 需要安装 libdb-devel (也就是 Berkerly DB开发库,否则不能编译) 以及 avahi-devel (否则不能支持avahi,也就不能支持Apple设备发现)
  • 需要安装 libacl-devel 否则会导致在Unix/Linux平台无法编译支持ACL,而不使用 --with-acls 将导致编译失败
  • 安装 dbus-glib-devel 是因为需要激活dbus注册 afpstats ,这个需要 dbus-glib

netatalk官方文档 介绍了编译安装方法:

wget http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.6.tar.gz?download

编译安装

tar xfz netatalk-3.1.6.tar.gz
cd netatalk-3.1.6
./configure --with-init-style=redhat-systemd --with-acls --with-pam-confdir=/etc/pam.d  --with-afpstats --with-dbus-sysconf-dir=/etc/dbus-1/system.d
make

在Unix/Linux平台编译netatalk必须设置 --with-acls (参考 ),否则会报 unix.c:ochmod O_IGNORE undeclared 错误

设置 --with-pam-confdir=/etc/pam.d 否则默认会安装到 /usr/local/etc/pam.d,会导致每次认证都反复弹出验证(好像密码错误一样,其实每次密码都正确)

设置 --with-afpstats 是为了通过dbus激活AFP状态,这个参数也是必须的;编译参数 --with-afpstats --with-dbus-sysconf-dir=/etc/dbus-1/system.d 才使登录走dbus认证,并且配置文件复制到 /etc/dbus-1/system.d/netatalk-dbus.conf

注意:每次重新编译安装 netatalk 都需要重新恢复一次 /usr/local/etc/afp.conf

配置netatalk

/usr/local/etc/afp.conf 配置如下

[Global]
hosts allow = 192.168.1.0/16
log file = /var/log/netatalk.log
log level = default:debug

[Time Machine]
path = /g_backup/timemachine
valid users = timemachine
time machine = yes

注意:

操作系统需要先创建 timemachine 用户帐号,这个帐号就是你的Mac客户端访问共享磁盘的帐号,密码请通过操作系统 passwd 命令设置好,客户端访问需要使用密码。(该帐号也可以改成你Mac电脑上的帐号名,方便你记忆和使用)

由于是编译安装,实际 netatalk 是安装在 /usr/local 目录,相应的配置文件是 /usr/local/etc/afp.conf - 我最初搞错,编辑了 /etc/afp.conf 结果始终无法生效,无法登录连接。

启动

systemctl start netatalk.service

注意:NetaTalk服务器端的目录(就是Path参数设置的 /g_backup/timemachine 必须存在),否则即使认证通过,也会始终报连接失败,无法访问。