善用OSS的S3兼容协议,让 NextCloud 实现计算存储分离

前言

目前网上能查到的 NextCloud 配合对象存储 OSS 的教程清一色都是教着用 ossfs 这个软件来实现的,首先这不是官方推荐的方式有着不可预测的兼容性问题,其次 ossfs 确实从 2019 最后一次更新后已经很久没有释放新的版本了。

其实 NextCloud 很早就有使用对象存储作为主存储引擎的官方方案,使用官方的 S3 对象存储主引擎方案,可以更好的提供程序的兼容性,同时使用习惯没有发生任何变化。

使用对象存储作为网盘的存储引擎而不是使用云服务器的块存储可以带来很多优势:

  1. 对象存储单位存储价格比块存储便宜的多
  2. 对象存储没有性能上限仅需支付极低的请求费用即可,而块存储有IOPS瓶颈,提升 IOPS 性能需要花费更多的成本
  3. 对象存储是默认按量付费的计费模式,无需扩容用多少付多少,而块存储需要预付费且升级扩容复杂并有风险

介绍

NextCloud 是一款开源的企业级私有云软件,其不仅支持网盘功能同时拥有非常丰富的企业办公生态,小微企业/开发团队可以借助 NextCloud 快速时间文件共享、存储、协同编辑、团队邮箱、团队会议等功能。

Nextcloud 允许配置对象存储,如阿里云OSS、 OpenStack Swift 或 Amazon Simple Storage Service (S3) 或任何兼容的 S3 实施 (例如 Minio 或 Ceph 对象网关)作为主存储,取代默认存储文件的存储。

默认情况下,文件存储在 nextcloud/data 或 Nextcloud 实例的 config.php 文件中配置的其他目录。由于兼容性的原因,这个数据目录可能仍然被使用。

影响

使用对象存储作为主存储时,Nextcloud 将采用独占访问权限在使用中的 Bucket 上。

与使用对象存储作为外部存储时相反,当使用对象存储时作为主存储,没有元数据(名称、目录结构等)存储在对象存储。元数据仅存储在数据库中,而对象存储只按唯一标识符保存文件内容。

因此,对象存储作为主存储是通常比使用相作为外部存储时执行得更好,但它限制了从 NextCloud 外部访问文件的能力。

由于 NextCloud 使用对象存储主存储功能下载文件的时候,依旧是从 NextCloud 实例服务器中转的,而非直接从 OSS 调用下载,因此可以通过云服务器 ECS 本身的带宽限制,实现给 OSS 的带宽“限速”(默认OSS是无下载带宽上线的),但与之相反,如果云服务器本身带宽较低的话,NextCloud 的下载体验也会受到影响。

配置

本文不介绍如何安装 NextCloud。我们直接看如何配置对象存储作为主存储。

OSS 设置

一、首先我们需要进入 OSS 控制台,创建一个和 NextCloud 所在同一地域的 Bucket,例如我的云服务器在华北三,那么我们的 OSS Bucket 也创建在华北三。

二、我们需要创建一个能读写操作这个 Bucket 的 RAM 子账户,访问方式中勾选 OpenAPI 调用访问 即可。

具体操作参考:https://help.aliyun.com/document_detail/57445.html

三、创建子账户的权限,直接将我的代码中的 mf8-nextcloud 修改成你的 Bucket 名称即可。然后将这个权限授权给刚才创建的 RAM 子账户。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "oss:*"
            ],
            "Resource": [
                "acs:oss:*:*:mf8-nextcloud",
                "acs:oss:*:*:mf8-nextcloud/*"
            ],
            "Condition": {}
        }
    ]
}

NextCloud 设置

一、修改 NextCloud 的 /config/config.php 文件,插入下面的代码:

'objectstore' => [
        'class' => '\\OC\\Files\\ObjectStore\\S3',
        'arguments' => [
                //填写 OSS 的 Bucket 名称
                'bucket' => 'mf8-nextcloud2',
                'autocreate' => true,
                //填写创建的子账户的 AccessKey ID
                'key'    => 'LLTAI5t7fn8q66Z2JZKxJPSS86',
                //填写创建的子账户的 AccessKey Secret
                'secret' => 'AJBipnrO0cpvZJwoOD12iqyzII7pisk',
                //填写 OSS 的内网 Endpoint 域名
                'hostname' => 'oss-ap-southeast-1-internal.aliyuncs.com',
                'port' => 443,
                'use_ssl' => true,
                'use_path_style'=>false
        ],
],

根据我写了注释的地方,修改四行参数,其中 OSS 如果和 ECS 在同一地域,一定要填写内网地址,这样时延更低。

最终修改的效果是这样的:

二、配置文件保存后,退出账号登录,即可。

三、上传文件到 NextCloud 进行查看,例如我上传了两个文件:

四、可以看到 OSS 中多出了我们上传的对应的文件。

五、到此我们就完成了 NextCloud + OSS 的存储系统改造,其实很是蛮简单的,希望大家可以参考这个教程广泛的使用。

上一篇