私有云异地容灾方案

发布于:11/3/2019, 4:11:36 PM @孙博
技术分享 | NAS,异地容灾
许可协议:署名-非商业性使用(by-nc)

随着公有云存储市场的进一步走弱,越来越多的家庭开始选用NAS作为家庭的存储方案,相对于越来越贵的百度网盘,不知不觉就停止服务的360网盘,逐渐淡出家用视野的115等公有云方案,NAS的意义就是用一次性的开销,方便快捷的拓展性,以及内网下的极速传输,代替按月付费、随时可能会消失、带宽限速的在线网盘。

目前家用市场下,成熟的NAS方案有很多,WD MyCloud、QNAP、群晖等等多种选择,这些NAS产品除了提供基础的存储能力之外,通常也具备一些多媒体功能的拓展,比如对照片、视频进行分类并添加索引,通过DLNA分享家庭影音等等,高级一些的除了提供WEB UI外,甚至还有专用的APP。我们只需要将数据存储在NAS中,我们就不用再花钱买百度云盘等同步我们的文件、分享我们的照片。

但是私有云比起公有云来说,虽然有更强的可玩性,但有一个硬伤是难以规避的——部署在单点的物理设备上,随时可能因为断电、摔碰、或者到达寿命使硬盘内容再也无法读取。如果发生了这样的事情,我们很可能会永久的失去这部分数据。


今天给大家介绍的就是一个相对来说较为安全的存储方案,利用群晖与WD MyCloud,通过 rsync 做数据同步,实现异地容灾的目的。

背景

14年,为了能够方便存储手机上的照片,以及想要获得一个家庭的媒体中心,调查了当时比较流行的一些NAS方案,最后出于成本以及对品牌的信赖,买了一部6T单盘版的WD MyCloud,花了两千左右。在使用初期确实是能满足我的要求,西数提供了一套完备的WEB管理界面及远程访问的界面,也源生支持DLNA协议做家庭媒体的分发,但单盘确实成为了一个隐患——6T的数据可能会因为盘挂掉而丢掉全部数据。虽然在保修期内,西数可以承担数据救援服务,但19年快过去的今天,这份保障早已荡然无存。

在18年双十一的时候,由于京东卡还剩小一千没花掉,恰巧群晖又在打折促销,早已经被安利过无数遍的 DS718+ 趁机被我带回了家,买了两块4T的红盘组了Raid1,以为从此就高枕无忧了。

但是如果意外可能会发生,那么最终一定会发生。

在通过虚拟机安装了LEDE,用群晖做了一阵子的软路由之后,在一个月黑风高的夜晚,群晖的系统再也启动不起来了,虽然当时我还没把家庭数据中心迁到群晖,但也十足的给我提了个醒——作为Raid 1的盘组,群晖已经没有单盘故障的担忧,但如果双盘故障,或是系统原因导致弄脏数据,那么我的照片和视频就再也找不回来了。

重要性

随着将近一年的使用,家里越来越多的应用被搬上了群晖,家庭资产管理系统、Git、MySQL、ES、Redis、Moments、还有为了方便比较菜价写的爬虫、为了挂卡跑的ASF——如果这个时候群晖挂了,我损失的不仅仅是可以同步到百度网盘的那点照片,整个数据资源都会随之烟消云散。

现在群晖上管理了家庭6部设备共计140G的照片、2T的电影电视剧动画片等资源、累计接近一年的菜价数据,如果是为了无法计算的价值,我完全可以把他们都搬到阿里云,但是我买不起太大的带宽支撑全部的服务。

寻找一个可行的方案被提上了日程。

前提条件

群晖在所有的NAS方案中,系统是公认最容易使用的一个,西数虽然也有管理系统,但在功能上远远不及群晖的十分之一,毕竟二者的定位是完全不同的。群晖除了存储的基本功能外,丰富的套件及Docker是其无限可能性的基础保障,而这些在西数设备上是无从具备的,况且硬件上要更为出色(毕竟价格高出许多)。

群晖在数据备份上有两种不同的形式——单纯用来备份文件的 Cloud Sync 和除了文件外,还能同时备份配置的 Hyper Backup,尤其是后者,除了备份的基础功能外,通过一个简单的按钮也能从特定历史版本中将当时的配置及文件一并恢复,而这个功能对于 Moments 等应用来说尤为重要。

Cloud Sync

闻其名知其义,“云同步”就是将数据送到云上,Cloud Sync 支持国内外多种公有云方案,比如百度云、腾讯云(COS)、阿里云(OSS)、京东云(OSS)、Dropbox、Amazon S3、Google Cloud Storage 等等,几乎常见的方案都可以得到支持。

通过映射公有云与群晖的目录,当任意一方有改动时均可自动实现双向同步。

Hyper Backup

Hyper 加在前面就说明这个 Backup 并不是普通的备份而已。相较于 Cloud Sync 更多的强调的是“同步”,Hyper Backup 的重点在于“备份”。除了将备份(文件及配置)上云的选择以外,对于多台群晖之间的数据同步,或者与 rsync 兼容的远程服务器都可以当做是备份的目标。


还记得这个文档的标题么?私有云异地容灾方案,我们要关注的重点,其实更多的用途是备份及恢复。而基于这个目的,其实 Hyper Backup 就很好的满足了我们的方案。

对于家里有矿的朋友,其实双群晖是很安全可靠的形式,几乎不用太多的动手操作,而对于想要有效利用 WD MyCloud 的我来说,就得想想别的办法了。

WD MyCloud 虽然速度较慢(CPU弱势),但是能够轻松开启root权限就给我们开放了很多可能性,更喜人的是,我发现家里的WD MyCloud中,已经预装了rsync(rsync version 3.0.9 protocol version 30),这就意味着我仅仅需要简单的配置即可完成我的需求了。

所以以下内容才是本文的重点。(上面写的都是废话)


配置与启用

rsync 作为服务端启动时,默认的配置文件为 /etc/rsyncd.conf,所以我们需要创建一个文件。WD MyCloud 默认安装了 vi 用来编辑文本,对于命令使用不是很熟的朋友可以简单记住 i模式 用来插入内容,使用 vi 打开文件后,按 i 即可直接编辑;另外一个就是 :wq,在文件编辑完之后,可以按 ESC 键回到命令模式,然后依次输入 :wq 三个字母即可实现保存并关闭的动作;如果是写配置写错了,又实在记不住修改、删除相关的指令,也可以干脆的按 :q! 强行退出,重新再来一次。

我们同样也需要指定一个目录用来存放群晖备份过来的文件,在启动rsync之前,我们可通过西数的WEB UI(默认路径为 http://wdmycloud/UI/)先创建一个“共享文件夹”,然后在“设置”中开启“SSH”功能,然后我们就可以使用XShell等工具与我们的WD MyCloud进行连接,默认情况下帐号密码分别为 rootwelc0me

如果我们在西数中建立了一个共享文件夹(如 DSBackup),那么在 /shares/ 下就可以找到这个目录,我们 cd 进去之后,可以创建一个文件夹比如叫 backup 用来存放群晖同步进来的文件。我们还需要再创建一个用户用来提供给群晖登陆使用(也可以使用西数中既存的用户)。

cd /shares/DSBackup
mkdir backup

# 创建一个虚拟用户(rsync),并将备份目录授权给它。
useradd -s /sbin/nologin -M rsync
chown -R rsync.rsync /shares/DSBackup/backup

这些内容完成后,我们就可以进行rsync的配置工作, 下面给出一个配置文件的例子。

uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[backup]
path = /shares/DSBackup/backup/
ignore errors
read only = false
list = false
#hosts allow = 0.0.0.0/32
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password

根据上文的设置,我们需要为 rsync 将用户名密码写入配置文件(/etc/rsync.password)。

echo "rsync_backup:welc0me" > /etc/rsync.password

# 如果不希望其他用户访问到这个文件,也可以限制下文件的权限,限制为只有拥有者才可以读写。
chmod 600 /etc/rsync.password

这些准备工作做完后,便可以已后台方式启动应用了。

rsync --daemon

到这一步,WD MyCloud 就成功开启了一个 rsync 的服务,下面只需在群晖中做简单的配置即可。

与敲命令的方式不同,群晖的界面操作功能极为丰富,我们在 Hyper Backup 的界面中,按加号的标识创建一个“数据备份任务”即可,文件服务器类型选择“rsync”,并在下一步选择“rsync兼容服务器”,并根据自己刚才在西数中指定的各项配置的实际数值来填写,对第一次使用的小伙伴来说,需要记住那些项目设置的内容对应的中文名称,下面基于之前给出的配置标上注释。

uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log

# 备份模块
[backup]
path = /shares/DSBackup/backup/
ignore errors
read only = false
list = false
# 用户账号
auth users = rsync_backup
# 密码(文件中的内容)
secrets file = /etc/rsync.password

大家会发现,群晖设置中缺少了一个“目录”对应的配置,其实这个“目录”需要设置为一个 path 下不存在的文件夹名,在备份任务开始时,会自动的在 path 下创建一个以 .hbk 结尾的目录。比如你设置目录名字叫 ds718,那么在 /shares/DSBackup/backup/ 下就会自动创建一个名为 ds718.hbk 的目录,未来所有的备份数据都会以群晖指定的格式写入这个目录下。

剩下的就是选择要备份的“文件夹”、“应用程序”了,这些内容就不必做过多的介绍,大家操作一下就能立刻明白。

完成到这一步的话,整个的备份任务就算全部创建完毕了。再未来,除了群晖自己保存的数据之外,还会按照大家指定的时间,自动将指定内容同步到西数的硬盘中,虽然有墨菲定律的存在,但毕竟三块盘同时出故障的概率还是微乎其微的,大家基本可以放心。

有的朋友可能会问,标题里写的是“异地容灾”,这个“异地”体现在哪里?


从某种意义上,两个独立的物理设备不在同一个房间是不是就可以看成是异地部署了……