eNFS 使用指南
简介
非结构化数据高速增长,用户在数据共享访问、数据频繁改写、数据本地/异地灾备保护,以及数据权限/资源管控等场景,NAS 成为海量非结构化生产业务的最佳选择。在 NAS 生产业务中 NFS 协议使用广泛, 但是原生 NFS 客户端在性能和可靠性方面存在一些不足, 主要体现在以下3个方面:
- 一个挂载点仅绑定一个 IP,IO 路径软硬件故障,业务 IO 挂死。
- 云内云外跨三层网络双活的链路无法自动切换。
- 一个挂载点仅绑定一个 IP,高负载业务场景下 NFS 客户端性能存在瓶颈。
eNFS 特性, 对原生 NFS 进行增强, 通过多链路等技术很好的解决这些问题, 极大提升业务的性能与稳定性。eNFS 特性通过 mount 命令进行挂载 NFS 共享时,使用 -o 参数指定本机与 NFS serve 的 IP 列表, eNFS 特性会根据这些 IP 列表创建多条链路, 在进行文件操作时 eNFS 将 IO 通过 RoundRobin 方式负载均衡到多条链路上以提升性能(当前版本负载均衡只支持 NFS V3)。并且在 IO 过程中如果出现部分链路故障,eNFS 也会将超时的 IO 快速分发到可用链路上,以解决业务挂死问题。
软硬件要求
使用 eNFS 特性 所使用的机器需要满足如下软硬件要求:
- CPU 架构为 AArch64 或者 x86_64
- 操作系统为 openEuler 20.03 LTS SP4
eNFS 配置
eNFS 是对原生NFS 进行增强,配置需要在 NFS 客户端进行操作, 无需在 NFS server 侧配置。
通过配置文件 /etc/enfs/config.ini
进行参数设置:
配置路径连通探测周期。
path_detect_interval=10
说明: 取值范围是 5 ~ 300, 默认值为 10,单位 : 秒。
配置路径连通探测消息超过阈值未返回,将认为链路状态异常。
path_detect_timeout=10
说明: 取值范围是 1 ~ 60, 默认值为 10,单位 : 秒。
配置 NFS 的文件操作的超时阈值, 当 NFS server 超时未响应时,将 IO 选其他可用链接进行。
multipath_timeout=0
说明: 取值范围是 0 ~ 30, 默认值为 0(0:使用 mount 命令指定的 timeo 参数, 不使用 eNFS 模块的配置),单位 : 秒。
配置路径连通探测周期。
multipath_disable=0
说明: 取值为 0 或者 1, 默认值为 0 (0 :启用 eNFS 特性)。
eNFS使用
eNFS 是对原生 NFS 客户端的增强, 访问 NFS server 仍然是使用 mount 命令进行挂载。 如果需要使用 eNFS 功能, 则使用 - o 可选参数 localaddrs 和 remoteaddrs 进行指定 IP 列表。
当不输入这 2 个可选参数时, 则是不使用 eNFS 特性, 此时功能与原来 NFS 客户端一致。
命令格式
命令的使用格式为:
mount -t nfs -o [localaddrs=127.17.0.1-127.17.0.4],[remoteaddrs=127.17.0.20-127.17.0.24] 127.17.0.20:/test /mnt/test
参数说明
参数 | 是否必选 | 参数含义 |
---|---|---|
localaddrs | 否 | 当 NFS 客户端本机有多个 IP 可以与 NFS server 连通时, 可以输入此参数指定用于 NFS 挂载的本机 IP 列表,如果不指定则由操作系统进行自动选择 。 IP 地址段使用‘-’标识,多个 IP 用‘~’隔开,最多8个 IP。 |
remoteaddrs | 否 | 当 NFS server 有多个 ip 可以与 NFS 客户端连通时, 可以输入此参数指定用于 NFS 挂载的 NFS server IP 列表。 如果不指定则使用mount参数中 NFS server挂载点的 IP, 如上图示例中的127.17.0.20。 IP 地址段使用‘-’标识,多个 IP 用‘~’隔开,最多8个 IP。 注意: remoteaddrs 指定的 IP 列表 必须都归属为 同一个 NFS server 或者 NFS server 集群系统。 |
后续也可使用 mount -o remount,[localaddrs=127.17.0.1-127.17.0.4],[remoteaddrs=127.17.0.20-127.17.0.24]
进行 IP 列表的修改。
eNFS链路状态查看
使用 mount 挂载 NFS 共享后,可以查看多条链路的状态。具体操作如下。
查看步骤
先使用 mount 命令查看各个挂载点的 enfs_info 信息。
[root@localhost ~]# mount 8.47.219.120:/fszhn1 on /mnt/fszhn1 type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=8.47.219.120,mountvers=3,mountport=2050,mountproto=udp,local_lock=none,addr=8.47.219.120,remoteaddrs=8.47.219.121~8.47.219.122~8.47.219.123~8.47.219.124,enfs_info=8.47.219.120_1)
其中enfs_info 为 8.47.219.120_1。
获取到 enfs_info 后,使用 eNFS 命令查看路径状态和 IO 统计。
1) 查看链路状态, 命令格式:
cat /proc/enfs/8.47.219.120_1/path
其中 8.47.219.120_1 是第一步获取到的 enfs_info 信息。
[root@localhost ~]# cat /proc/enfs/8.47.219.120_1/path id local_addr remote_addr path_state xprt_state 0 8.47.210.220 8.47.219.120 Normal CONNECTED|BOUND 1 8.47.210.220 8.47.219.121 Normal CONNECTED|BOUND 2 8.47.210.220 8.47.219.122 Normal CONNECTED|BOUND 3 8.47.210.220 8.47.219.123 Normal CONNECTED|BOUND 4 8.47.210.220 8.47.219.124 Normal CONNECTED|BOUND
字段含义
字段 含义 id 链路的序号 local_addr 此链路的本机 IP remote_addr 此链路的 NFS server IP path_state 此链路当前健康状态
Init -- 初始状态
Normal -- 链路正常
Fault -- 链路异常xprt_state 此链路当前运行状态
CONNECTED -- 已连接
CONNECTING -- 正在建立链路
BOUND -- 此链路已经可以接收、发送 IO2) 查看链路 IO 统计, 命令格式:
cat /proc/enfs/8.47.219.120_1/stat
其中 8.47.219.120_1 是 enfs_info 信息。
[root@localhost ~]# cat /proc/enfs/8.47.219.120_1/stat id local_addr remote_addr r_count r_rtt r_exec w_count w_rtt w_exec 0 8.47.210.220 8.47.219.120 0 0 0 0 0 0 1 8.47.210.220 8.47.219.121 0 0 0 6 5 23 2 8.47.210.220 8.47.219.122 0 0 0 7 6 17 3 8.47.210.220 8.47.219.123 0 0 0 0 0 0 4 8.47.210.220 8.47.219.124 0 0 0 0 0 0
字段含义
字段 含义 id 链路的序号 local_addr 此链路的本机 IP remote_addr 此链路的 NFS server IP r_count 此链路上发送的读 IO 次数 r_rtt 此链路上发送的读 IO RPC层处理的平均时延, 单位:毫秒 r_exec 此链路上发送的读 IO NFS server 处理的平均时延, 单位:毫秒 w_count 此链路上发送的写 IO 次数 w_rtt 此链路上发送的写 IO RPC层处理的平均时延, 单位:毫秒 w_exec 此链路上发送的写 IO NFS server 处理的平均时延, 单位:毫秒