在 Red Hat Ceph Storage 3 中,Ceph 对象网关提供了使用 NFS v3 和 NFS v4.1 为生产系统导出 S3 对象命名空间的功能。
注
NFS Ganesha 功能不用于一般用途,而是仅用于迁移到 S3 云。
该实现符合AWS分层命名空间约定,该约定将UNIX样式的路径名映射到S3桶和对象上。附加命名空间的顶层(如果存在,则从属于NFSv4伪根)由Ceph对象网关S3 bucket组成,其中bucket表示为NFS目录。bucket中的对象按照S3约定表示为NFS文件和目录层次结构。支持创建文件和目录的操作。
注
不支持创建或删除硬链接或软链接。NFS不支持对桶或目录执行重命名操作,但在目录内和目录之间以及文件系统和NFS挂载之间支持对文件进行重命名。通过NFS执行文件重命名操作的成本更高,因为它们会更改目标目录,并且通常会强制使用完整的readdir来刷新它。
注
不支持通过 NFS 挂载编辑文件。
注
Ceph 对象网关要求应用程序从偏移量 0 到文件末尾按顺序写入。 尝试乱序写入会导致上传操作失败。 要解决此问题,请在将文件复制到 NFS 空间时使用 cp、cat 或 rsync 等实用程序。始终使用sync选项挂载。
带有NFS的Ceph对象网关基于网关服务器的进程内库打包和NFS- ganesha NFS服务器的文件系统抽象层(FSAL)命名空间驱动程序。在运行时,一个带有NFS的Ceph Object Gateway守护进程实例将一个完整的Ceph Object Gateway守护进程(尽管没有Civetweb HTTP服务)与一个NFS- ganesha实例组合在一个进程中。要使用该特性,请部署NFS-Ganesha 2.3.2或更高版本。
在包含NFS- Ganesha实例(nfs- ganesha -rgw)的主机上执行“开始之前"和"配置NFS ganesha实例”步骤。
每个NFS Ganesha实例都充当一个完整的网关endpoint,当前的限制是NFS Ganesha实例不能配置为导出HTTP服务。与普通网关实例一样,可以启动任意数量的NFS Ganesha实例,从集群导出相同或不同的资源。这将启用NFS Ganesha实例的集群。但是,这并不意味着高可用性。
当常规网关实例和 NFS-Ganesha 实例重叠相同的数据资源时,它们将可以从标准 S3 API 和通过导出的 NFS-Ganesha 实例访问。 可以将 NFS-Ganesha 实例与 Ceph 对象网关实例放在同一主机上。
在尝试运行NFS- ganesha之前,请禁用任何将运行NFS- ganesha的主机上正在运行的内核NFS服务实例。如果正在运行另一个NFS实例,NFS- ganesha将不会启动。
作为root,启用Red Hat Ceph Storage 3 Tools库:
# subscription-manager repos --enable=rhel-7-server-rhceph-3-tools-rpms
确保rpcbind服务正在运行:
# systemctl start rpcbind
注
提供 rpcbind 的 rpcbind 包通常是默认安装的。 如果不是这种情况,请先安装软件包。
有关 NFS 如何使用 rpcbind 的详细信息,请参阅 Red Hat Enterprise Linux 7 存储管理指南中的必需服务部分。
如果 nfs-server服务正在运行,请停止并禁用它:
# systemctl stop nfs-server.service
# systemctl disable nfs-server.service
安装 nfs-ganesha-rgw 包:
# yum install nfs-ganesha-rgw
从Ceph Monitor节点复制Ceph配置文件到NFS-Ganesha主机的/etc/ceph/目录,并根据需要编辑:
# scp <mon-host>:/etc/ceph/ceph.conf <nfs-ganesha-rgw-host>:/etc/ceph
注
Ceph 配置文件必须包含有效的 [client.rgw.{instance-name}] 段以及各种必需的网关配置变量(例如 rgw_data、keyring 或 rgw_frontends)的相应参数。 如果导出不符合有效 S3 桶命名要求的 Swift 容器,请在 Ceph 配置文件的 [client.rgw] 部分将 rgw_relaxed_s3_bucket_names 设置为 true。 例如,如果 Swift 容器名称包含下划线,则它不是有效的 S3 桶名称,除非将 rgw_relaxed_s3_bucket_names 设置为 true,否则不会同步。 在 NFS 之外添加对象和桶时,这些对象将在 rgw_nfs_namespace_expire_secs 设置的时间内出现在 NFS 命名空间中,默认约为 5 分钟。 覆盖 Ceph 配置文件中 rgw_nfs_namespace_expire_secs 的默认值以更改刷新率。
打开 NFS-Ganesha 配置文件:
# vim /etc/ganesha/ganesha.conf
使用FSAL(文件系统抽象层)块配置EXPORT段。提供ID、S3用户ID、S3 访问密钥和secret。对于NFSv4,它应该是这样的:
EXPORT
{
Export_ID={numeric-id};
Path = "/";
Pseudo = "/";
Access_Type = RW;
SecType = "sys";
NFS_Protocols = 4;
Transport_Protocols = TCP;
Squash = No_Root_Squash;
FSAL {
Name = RGW;
User_Id = {s3-user-id};
Access_Key_Id ="{s3-access-key}";
Secret_Access_Key = "{s3-secret}";
}
}
Path 选项指示 Ganesha 在哪里可以找到导出。 对于 VFS FSAL,这是服务器命名空间中的位置。 对于其他 FSAL,它可能是由该 FSAL 的命名空间管理的文件系统中的位置。 例如,如果使用 Ceph FSAL 导出整个 CephFS 卷,则Path将为 /。
Pseudo 选项指示 Ganesha 将导出放置在 NFS v4 的伪文件系统命名空间中的何处。 NFS v4 指定服务器可以构造一个伪命名空间,该命名空间可能不对应于任何实际的导出位置,并且该伪文件系统的一部分可能仅存在于 NFS 服务器的领域内,而不对应于任何物理目录。此外,NFS v4 服务器将其所有导出放在一个命名空间中。 可以将单个导出导出为伪文件系统根,但将多个导出放置在伪文件系统中更为常见。 对于传统的 VFS, Pseudo 位置通常与Path位置相同。 回到使用 / 作为Path的 CephFS 导出示例,如果需要多个导出,导出可能会有其他内容作为 Pseudo 选项。 例如,/ceph。
任何应支持 NFSv3 的 EXPORT 块都应在 NFS_Protocols 设置中包含版本 3。 此外,NFSv3 是支持 UDP 传输的最后一个主要版本。 该标准的早期版本包括 UDP,但 RFC 7530 禁止使用它。 要启用 UDP,请将其包含在 Transport_Protocols 设置中。 例如:
EXPORT {
...
NFS_Protocols = 3,4;
Transport_Protocols = UDP,TCP;
...
}
设置 SecType = sys; 允许客户端在没有 Kerberos 身份验证的情况下进行连接。
设置Squash = No_Root_Squash;允许用户更改NFS挂载中的目录所有权。
使用传统 OS-native NFS 4.1 客户端的 NFS 客户端通常会看到由目标服务器的伪文件根定义的导出文件系统的联合命名空间。 其中任意数量都可以是 Ceph 对象网关导出。
每个导出都有自己的元组name、User_Id、Access_Key和Secret_Access_Key,并创建对指定用户可见的对象名称空间的代理。
ganesha.conf 中的导出也可以包含 NFSV4 块。 Red Hat Ceph Storage 支持 Allow_Numeric_Owners 和 Only_Numberic_Owners 参数作为设置 idmapper 程序的替代方法。
NFSV4 {
Allow_Numeric_Owners = true;
Only_Numeric_Owners = true;
}
配置NFS_CORE_PARAM块。
NFS_CORE_PARAM{
mount_path_pseudo = true;
}
当 mount_path_pseudo 配置设置为 true 时,它将使 NFS v3 和 NFS v4.x 挂载使用相同的服务器端路径到达导出,例如:
mount -o vers=3 <IP ADDRESS>:/export /mnt
mount -o vers=4 <IP ADDRESS>:/export /mnt
Path Pseudo Tag Mechanism Mount
/export/test1 /export/test1 test1 v3 Pseudo mount -o vers=3 server:/export/test1
/export/test1 /export/test1 test1 v3 Tag mount -o vers=3 server:test1
/export/test1 /export/test1 test1 v4 Pseudo mount -o vers=4 server:/export/test1
/ /export/ceph1 ceph1 v3 Pseudo mount -o vers=3 server:/export/ceph1
/ /export/ceph1 ceph1 v3 Tag mount -o vers=3 server:ceph1
/ /export/ceph1 ceph1 v4 Pseudo mount -o vers=4 server:/export/ceph1
/ /export/ceph2 ceph2 v3 Pseudo mount -o vers=3 server:/export/ceph2
/ /export/ceph2 ceph2 v3 Tag mount -o vers=3 server:ceph2
/ /export/ceph2 ceph2 v4 Pseudo mount -o vers=4
当 mount_path_pseudo 配置设置设置为 false 时,NFS v3 挂载使用 Path 选项,NFS v4.x 挂载使用 Pseudo 选项。
Path Pseudo Tag Mechanism Mount
/export/test1 /export/test1 test1 v3 Path mount -o vers=3 server:/export/test1
/export/test1 /export/test1 test1 v3 Tag mount -o vers=3 server:test1
/export/test1 /export/test1 test1 v4 Pseudo mount -o vers=4 server:/export/test1
/ /export/ceph1 ceph1 v3 Path mount -o vers=3 server:/
/ /export/ceph1 ceph1 v3 Tag mount -o vers=3 server:ceph1
/ /export/ceph1 ceph1 v4 Pseudo mount -o vers=4 server:/export/ceph1
/ /export/ceph2 ceph2 v3 Path not accessible
/ /export/ceph2 ceph2 v3 Tag mount -o vers=3 server:ceph2
/ /export/ceph2 ceph2 v4 Pseudo mount -o vers=4 server:/export/ceph2
配置RGW段。指定实例的名称,提供Ceph配置文件的路径,并指定任何初始化参数:
RGW {
name = "client.rgw.{instance-name}";
ceph_conf = "/etc/ceph/ceph.conf";
init_args = "--{arg}={arg-value}";
}
保存 /etc/ganesha/ganesha.conf 配置文件。
启用并启动 nfs-ganesha 服务。
# systemctl enable nfs-ganesha
# systemctl start nfs-ganesha
要访问命名空间,请将配置的 NFS-Ganesha 导出挂载到本地 POSIX 命名空间中的所需位置。 如前所述,此实现有一些独特的限制:
要挂载 NFS-Ganesha 导出,请将以下条目添加到客户端主机上的 /etc/fstab 文件中:
<ganesha-host-name>:/ <mount-point> nfs noauto,soft,nfsvers=4.1,sync,proto=tcp 0 0
指定 NFS-Ganesha 主机名和客户端上挂载点的路径。
注
要成功挂载 NFS-Ganesha 导出,客户端上必须存在 /sbin/mount.nfs 文件。 nfs-tools 包提供了这个文件。 在大多数情况下,默认情况下会安装该软件包。 但是,请验证客户端上是否安装了 nfs-tools 软件包,如果没有,请安装它。
通过提供 nfsvers=3 和 noacl 作为挂载选项,Linux 客户端可以配置为使用 NFSv3 挂载。 要使用 UDP 作为传输,请将 proto=udp 添加到挂载选项。 但是,TCP 是首选协议。
<ganesha-host-name>:/ <mount-point> nfs noauto,noacl,soft,nfsvers=3,sync,proto=tcp 0 0
注
如果挂载将使用版本 3 和 UDP,则使用版本 3 配置 NFS Ganesha EXPORT 块协议设置和使用 UDP 的Transports设置。
由于 NFSv3 不会将客户端 OPEN 和 CLOSE 操作传达给文件服务器,因此 RGW NFS 无法使用这些操作来标记文件上传事务的开始和结束。 相反,RGW NFS 尝试在第一次写入发送到偏移量 0 处的文件时开始新的上传,并在一段时间内没有看到对文件的新写入时(默认为 10 秒)结束上传。 要更改此值,请在 Ceph 配置文件的 RGW 部分中为 rgw_nfs_write_completion_interval_s 设置一个值。