本地服务器挂载S3实现数据持久储存

契机

本地数据中心部署了多套应用,ERP,nextcloud等应用的数据存储均在本地,现状是没有一套合适的数据备份机制,数据存储的可用性,持久性都是极大的风险。此次只考虑应用数据机别,应用系统自身的备份我们会通过其他方式实现。

数据持久的重要性

现如今绝大多数企业的应用现状,本地数据中心任然占据着重要的位置,本地应用多数已经通过虚拟化等技术实现高可用性,但数据存储的高可用及备份容灾一直都是令人烦恼。特别是小型企业,应用数量少,如果为了实现存储层的高可用需要支付高额的存储双活费用,性价比很低。与此同时,部分核心数据的持久化保存需求让备份成为一大难题,搭建备份系统的投入产出比较低。

云计算持久存储的优势

视野跳出本地数据中心,云计算已经成为一个绕不开的话题,云计算有着众多的特性,优劣势都非常明显,无法在此一一展开来谈,今天着重讲一下S3在小型企业市局持久化储存中的优势。

认识一下S3

S3在AWS官网的页面,其中对S3的介绍如下“Amazon Simple Storage Service (Amazon S3) 是一种对象存储,它具有简单的 Web 服务界面,可用于存储和检索 Web 上任何位置、任意数量的数据。它能够提供 99.999999999% 的持久性,并且可以在全球大规模传递数万亿对象。”

且在官网列出的众多S3优势中有以下几个关键字持久、安全、可用、成本低廉。以上这些特性,使得S3非常适合用来存储小型企业用户用来储存重要数据,能够用非常低的成本实现重要应用数据的持久安全可用。

本地应用对接S3

通过插件应用对接S3

我们搭建了Nextcloud,知名的私有云同步网盘,之所以在众多同类产品中选择了它,是因为nextcloud不仅免费,还生态完整,插件众多,产品成熟。最重要的一点是nextcloud的APP功能完善,除了官方app之外,还有众多第三方app可选,App界面长这样


Nextcloud内容丰富的应用中心


可以看到,各种类型的不同类型的APP可选,其中我们最关心的是一个叫外部存储的APP,这个APP是nextcloud官方提供的,便于我们对接其他存储的。官方的说明是“This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. ” 可以对接的种类很多,包括FTP,SFTP,.WebDAV,多种对象存储,还有Amazon S3,我们选择将安全持久可用的S3挂给nextcloud服务器,这样我们的用非常低的价格实现数据的持久存储。

设计思路是,nextcloud应用服务器自身通过虚拟化技术去实现较高的可用性,通过基于虚拟化平台的备份去实现应用级的备份(本地or云),如果备份仓库放置在本地数据中心,依然很难保证数据的持久储存,如选择S3作为外部存储,即可实现轻松的实现文件99.999999999%的持久性。


外部存储菜单

遇到的第一个坑

在挂载S3时,根据应用的需要做了相应的配置,始终出现告警信息。


告警信息如下:

“Exception: Creation of bucket "nextprocloud" failed. Error executing "CreateBucket" on "https://xxxxxx.s3.cn-northwest-1.amazonaws.com/"; AWS HTTP error: cURL error 7: Failed connect to xxxxxx.s3.cn-northwest-1.amazonaws.com:443; Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)”

对比发现,外部存储应用请求的URL地址为s3.cn-northwest-1.amazonaws.com。而中国区AWS的地址有别于常规的AWS地址,域名为s3.cn-northwest-1.amazonaws.com.cn。所以无法直接通过外部存储APP挂载中国区S3用于nextcloud。

为了解决此问题,尝试了一下方法:

1、查找官方文档,希望找到方法通过命令行方式配置外部存储。未完成,nextcloud9版本开始已经更改为通过occ命令管理外部存储,且occ管理工具文档中无有直接配置外部存储的命令。

2、尝试通过更改域名解析的方式,在本地发送请求时将amazonaws.com的请求重定向到amazonaws.com.cn。多次尝试无果,放弃了。

3、因为看到告警信息提示时用curl拼接的链接,尝试从curl的角度去更改配置解决问题,尝试无果,又放弃了。

4、尝试在官方论坛和github发帖了,没有回复,这个中国区aws域名问题估计也很少有人碰到。(挺尴尬的,github上贡献者回复,我们这个页面是汇报bug的,你这个不算bug,手动捂脸

通过本地目录

多次尝试(放弃)之后,重新整理了思路,不如我将S3挂载给本地服务器的一个目录,再用nextcloud的本地目录功能,一样可以实现通过nextcloud应用存储的文件都安全持久的存储在S3上。

本地linux服务器挂载S3

首先要解决的问题时本地服务器挂载S3,目前最主流的用法是通过s3fs-fuse去挂载,这个项目的github页面。它的说明文档很详细(但是不够详细,)

网上很多教程都是用gitclone安装,再去build/make/install,其实官方文档给出的直接用yum安装的方式更加高效,gitclone不改hosts文件的话一般会很慢。

正常通过s3fs去挂载s3到本地目录使用以下命令就行了

s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs

s3fs 命令   mybucket 桶名称  /path/to/mountpoin 本地挂载路径  -o passwd_file=${HOME}/.passwd-s3fs 使用指定目录的文件passwd-s3fs用于身份认证

在使用s3fs去挂载的时候,遇到了跟使用外部存储一样的问题,就是中国区的S3链接不同于常规S3,以上这种常规的挂载方式无法挂载中国区的S3,好在s3fs官方文档中有这样一段:

If you use s3fs with a non-Amazon S3 implementation, specify the URL and path-style requests:

s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs -o url=https://url.to.s3/ -o use_path_request_style

此处可以自定义url,最终我们使用-o url=https://s3.cn-northwest-1.amazonaws.com.cn 参数成功的挂载了S3到本地目录。

挂载好时候,我们尝试在Nextcloud外部存储应用中选取S3挂载到本地的目录,用作文件存储,但在配置时出现了多次错误,无法实现本地路径挂载给S3,后来搜了以下在StackOverflow找到了相似的问题,发现是因为挂载时没有添加参数 -o allow_other(文档里面只在加fstab的时候提及此参数,被忽略了)。

成功的挂载S3到本地目录,并将本地目录设置为nextcloud的外部存储之后,就可以轻松的使用nextcloud应用将内容存储到S3。

忙活了一大阵,为什么不直接用工具传S3?因为nextcloud功能众多,支持多个平台APP,有协同办公功能。




至此,数据存储在S3,能保证较高的数据持久性,且费用较低(较……较搭一套备份)。

此方案只适合对性能要求不高的场景,高性能的应用不太适合通过本地数据中心挂载S3的方式。

你可能感兴趣的:(本地服务器挂载S3实现数据持久储存)