个人文件备份,如果要实现云存储的功能,单纯使用一台家用NAS设备GoFlex Home显然是不够的。你的备份只有一个副本,仍然有可能在你以为已经备份好文件,却发现磁盘已经损坏了。

GlusterFS是企业级的分布式文件系统,最大的优势是实现了POSIX文件系统规范,可以使用glusterfs协议或者NFS/SMB协议挂载为磁盘文件系统,非常方便维护和使用。在生产环境已经有非常成熟的部署,对于个人的网络存储也可以使用(Linux无所不在,即使是小小的ARM系统)。

GoFlex Home

如果只有一台GoFlex设备,则可以Arch Linux NFS输出提供Linux/Mac OS X访问。

安装设备

两台 Setage GoFlex Home 网络存储设备

nas1 的IP地址是 192.168.1.91
nas2 的IP地址是 192.168.1.92

安装

以下步骤在nas1nas2

安装glusterfs软件包

pacman -S glusterfs

注意,对于Mac OS X客户端,不能直接使用glusterfs方式挂载输出的存储卷,所以还需要给glusterfs服务器增加NFS输出功能。这就需要安装 nfs-utils 软件包

pacman -S nfs-utils

磁盘分区格式化成 XFS

mkfs.xfs /dev/sda3 -f

创建用于glusterfs的brick目录

mkdir /data

挂载用于brick存储

echo "/dev/sda3 /data xfs defaults 1 2" >> /etc/fstab
mount /data

安装glusterfs

Arch Linux ARM提供了glusterfs软件包可以直接部署

pacman -S glusterfs

目前安装的是 glusterfs-3.5.1-2 版本

Arch Linux 使用 systemctl 来管理服务,参考 Running GlusterFS inside docker container 执行启动 glusterfsd :

systemctl enable glusterd
systemctl start glusterd

检查启动的glusterd进程

ps -ef | grep gluster

可以看到 /usr/sbin/glusterd -p /run/glusterd.pid

创建peer对端(在 192.168.1.91 上执行)

gluster peer probe 192.168.1.92

提示显示 peer probe: success.

一共使用2台设备,分别是 nas1192.168.1.91 ) 和 nas2192.168.1.92

此时可以检查 gluster 状态

gluster peer status

可以看到输出状态显示

Number of Peers: 1

Hostname: 192.168.1.92
Uuid: eb7b8f29-45fc-4126-931a-f392f64cba57
State: Peer in Cluster (Connected)

创建 brick 目录(此步骤需要在两个节点上进行)

mkdir /data/backup

这里 /data 目录是本地挂载的磁盘设备 /dev/sda3 。注意:glusterfs现在不再建议直接使用磁盘设备挂载后的根目录(例如 /data ),而是在根目录下建议子目录(这里是 /data/backup

创建卷 g_backup

gluster volume create g_backup replica 2 transport tcp \
192.168.1.91:/data/backup 192.168.1.92:/data/backup

提示卷创建成功 volume create: g_backup: success: please start the volume to access data

启动卷 g_backup

gluster volume start g_backup

挂载和使用glusterfs

如果客户端是Linux操作系统,就可以使用 glusterfs 方式挂载创建好的 g_backup 卷。使用 glusterfs native 方式挂载卷可以充分发挥glusterfs的优势,不仅客户端可以并发访问glusterfs的分布式节点,并且也具备了数据冗余功能。

客户端需要安装 glusterfs-fuse 软件包(如果是 Red Hat系列),然后在 /etc/fstab 中添加

192.168.1.91:/g_backup    /mnt/g_backup  glusterfs       defaults,_netdev         0 0

这里使用 192.168.1.91 只是为了下载卷配置信息,实际客户端访问是同时读写 192.168.1.91192.168.1.92 两个节点的。这里也可以使用域名解析来替代 192.168.1.91 甚至可以使用DNS轮转方式,同时配置 nas 解析到 192.168.1.91192.168.1.92 以便能够随机从某个节点下载glusterfs的卷配置信息。

这里是在家用的网络环境中,默认的DHCP指定的DNS服务器就是路由器的IP地址,是使用路由器上运行的 dnsmasq 服务提供的DNS解析。

在家用路由器 OpenWRT 上的 /etc/hosts 添加以下配置信息

192.168.1.91 nas
192.168.1.92 nas

然后重启路由器 dnsmasq 服务

/etc/init.d/dnsmasq restart

重启后再检查 host nas 可以看到输出内容

nas.lan has address 192.168.1.92
nas.lan has address 192.168.1.91

所以上述glusterfs客户端的配置可以将 192.168.1.91 修改成 nas ,配置如下

nas:/g_backup    /mnt/g_backup  glusterfs       defaults,_netdev         0 0

挂载和使用glusterfs输出的NFS服务

按照 Mac OS X 挂载Linux卷(NFS) 设置方法,在我的Mac OS X 配置文件 /etc/auto_master 中添加

/nfsdata        autofs_nfsdata

并创建 /etc/autofs_nfsdata 文件,添加

nas-g_backup        -fstype=nfs,rw,bg,hard,intr,tcp,nolocks,resvport nas:/g_backup

然后在 Mac OS X 客户端执行命令

automount -vc

此时就可以看到系统中有 /nfsdata/nas-g_backup 目录,访问该目录即可以访问基于glusterfs的NFS系统,存储到该NFS挂载的文件将被glusterfs镜像到两个NAS设备 nas1nas2

在Mac OS X客户端使用命令验证检查glusterfs输出的NFS卷

ls /nfsdata/nas-g_backup

检查NAS内容提示错误

ls: : No such file or directory

检查服务器端 glusterfs 是否输出了NFS服务(有可能默认安装的glusterfs服务没有开启NFS),登录 nas1 服务器,输入以下命令

gluster volume status

输出内容显示NFS服务没有启用

Status of volume: g_backup
Gluster process                        Port    Online    Pid
------------------------------------------------------------------------------
Brick 192.168.1.91:/data/backup                49152    Y    356
Brick 192.168.1.92:/data/backup                49152    Y    357
NFS Server on localhost                    N/A    N    N/A
Self-heal Daemon on localhost                N/A    Y    366
NFS Server on 192.168.1.91                N/A    N    N/A
Self-heal Daemon on 192.168.1.91            N/A    Y    353

Task Status of Volume g_backup
------------------------------------------------------------------------------
There are no active volume tasks

激活NFS服务(参考 Using NFS with Gluster

激活步骤不需要,因为默认glusterfs就启用了NFS

gluster volume set g_backup nfs.disable off

但是,我发现glusterfs的服务端NFS依然没有启动。检查 nas1 服务日志 /var/log/glusterfs/nfs.log 有如下报错信息

[2014-10-26 00:03:55.055213] I [glusterfsd.c:1959:main] 0-/usr/bin/glusterfs: Started running /usr/bin/glusterfs version 3.5git (/usr/bin/glusterfs -s localhost --volfile-id gluster/nfs -p /var/lib/glusterd/nfs/run/nfs.pid -l /var/log/glusterfs/nfs.log -S /var/run/b788826635172196ec3b6b3679f26d8a.socket)
[2014-10-26 00:03:55.507620] I [socket.c:3561:socket_init] 0-socket.glusterfsd: SSL support is NOT enabled
[2014-10-26 00:03:55.507817] I [socket.c:3576:socket_init] 0-socket.glusterfsd: using system polling thread
[2014-10-26 00:03:55.508559] I [socket.c:3561:socket_init] 0-glusterfs: SSL support is NOT enabled
[2014-10-26 00:03:55.508661] I [socket.c:3576:socket_init] 0-glusterfs: using system polling thread
[2014-10-26 00:03:57.924851] W [nfs.c:958:nfs_init_state] 0-nfs: /sbin/rpc.statd not found. Disabling NLM
[2014-10-26 00:03:57.942890] I [rpcsvc.c:2102:rpcsvc_set_outstanding_rpc_limit] 0-rpc-service: Configured rpc.outstanding-rpc-limit with value 16
[2014-10-26 00:03:58.125648] I [socket.c:3561:socket_init] 0-socket.nfs-server: SSL support is NOT enabled
[2014-10-26 00:03:58.125877] I [socket.c:3576:socket_init] 0-socket.nfs-server: using system polling thread
[2014-10-26 00:03:58.127007] E [rpcsvc.c:1300:rpcsvc_program_register_portmap] 0-rpc-service: Could not register with portmap
[2014-10-26 00:03:58.127119] E [nfs.c:332:nfs_init_versions] 0-nfs: Program  MOUNT3 registration failed
[2014-10-26 00:03:58.127194] E [nfs.c:1312:init] 0-nfs: Failed to initialize protocols
[2014-10-26 00:03:58.127262] E [xlator.c:403:xlator_init] 0-nfs-server: Initialization of volume 'nfs-server' failed, review your volfile again
[2014-10-26 00:03:58.127332] E [graph.c:307:glusterfs_graph_init] 0-nfs-server: initializing translator failed
[2014-10-26 00:03:58.127401] E [graph.c:502:glusterfs_graph_activate] 0-graph: init failed
[2014-10-26 00:03:58.128736] W [glusterfsd.c:1095:cleanup_and_exit]  0-: received signum (0), shutting down

参考 Arch Linux NFS 可以看到常规的NFS服务是需要安装 nfs-utils 软件包的,而 nfs.log 日志报错信息和nfs服务软件有关,检查系统确实没有安装 nfs-utils 软件包,则安装 nfs-utils

pacman -S nfs-utils

安装完成后重启服务器,启动再次使用 gluster volume status 可以看到 NFS Server 已经启动,并且可以在 Mac OS X客户端挂载和使用NFS卷。

df 命令检查挂载目录

df -h

检查输出有如下内容

nas:/g_backup       1.8Ti   32Mi  1.8Ti     1%       10 386584374    0%   /nfsdata/nas-g_backup

GlusterFS的NFS服务依赖系统的nfs软件包

验证

由于前述的部署,已经实现了Mac OS X的nfs客户端挂载服务器端输出的g_backup卷,所有通过nfs存储的文件将通过底层的glusterfs镜像到nas1nas2两个存储的 /data/backup。下面我们来验证这个部署:

在Mac OS X客户端向 /nfsdata/nas-g_backup 目录复制文件(创建一个1G的测试文件testfile

dd if=/dev/zero of=testfile bs=1024 count=1048576
cp testfile /nfsdata/nas-g_backup/

然后登录 nas1nas2 可以看到对应的底层文件系统 /data/backup 都有相同的文件

[root@nas1 backup]# ls -lh
total 1.0G
-rw-r--r-- 2 501 utmp 1.0G Oct 26 02:16 testfile

[root@nas2 backup]# ls -lh
total 1.0G
-rw-r--r-- 2 501 utmp 1.0G Oct 26 02:16 testfile

以上即实现了在个人家用网络存储上部署GlusterFS分布式文件系统,实现数据备份自动双副本保存。这样,日常备份的数据就多了一层安全保障。