CMA-PI上共享存储访问工具cmafs介绍

目录

2020.04.16 注:最新版的 cmafs 已经使用当前用户免密码登陆二级存储挂载节点,也就意味着放开了普通用户对挂载节点的访问权限。

如何存储和获取历史数据一直是数值预报模式研发人员关心的问题。

ECMWF有完善的数据归档系统(MARS),提供丰富的接口支持检索和下载归档的模式数据。 但我们还缺乏类似的平台,历史数据大多以离线硬盘的形式保存。

中国气象局正在建设气象大数据云平台,旨在提供从数据、算法、接口到计算能力等气象业务需要的全部基础设施。

数值预报中心在国家气象信息中心的协助下,已开始使用气象大数据云平台中的分布式存储(二级存储)来保存历史归档数据。

二级存储

数值预报业务系统在高性能计算机CMA-PI上生成数据产品,推送到二级存储保存。

使用pird.nmic.cnpiop.nmic.cn域名访问的普通登陆节点无法直接访问二级存储。 二级存储仅挂载到CMA-PI上的4个特定登陆节点,使用dt.piop.nmic.cn域名登陆。

业务系统通过运行在这几个节点上的datatrans队列,实时向二级存储拷贝部分GRIB2数据产品。 其余的数据会在延后一段时间再自动同步到二级存储。

挂载的二级存储就相当于本地目录。 但仅有部分用户可以通过域名登陆到挂载二级存储的节点,众多普通账户无法直接使用二级存储上的数据。 尽管我也认为数据分析工作没必要在高性能计算机上完成,但已有的工作大多只针对HPC,所以将二级存储中的历史数据拷贝到HPC是一个迫切的需求。

CMA-PI提供cmafs工具用于普通用户访问二级存储,提供类似本地文件的操作体验。

cmafs介绍

在CMA-PI上使用下面的命令加载cmafs工具。

module load apps/cmafs/cmafs

运行cma命令,可以查看cmafs提供的工具。

cma command list:
    cmacd             Move the current working directory
    cmals             Accessing files under a path to a remote server
    cmapwd            Get the current working directory.
    cmaput            Upload a file or directory to the server
    cmaget            Download a file or directory from a remote serverr
    cmarm             Delete a file or directory on a remote server
    cmamv             Move a file or directory of a remote server
    cmamkdir          Create a directory in a remote server
    cmatouch          Create a file or modify file properti
    cmalocate         Find eligible documents on a remote server
    cmacp             Copy a file in a remote server
    cmachmod          Modify permissions on a file or directory in a remote server
    cmadf             Display free disk space

包括文件访问、上传、下载等操作,模拟本地文件系统命令,从命令名很容易能猜到命令的功能。

下面的示例展示如何从二级存储中下载GRAPES GFS系统2020年3月11日00时次084时效原始分辨率的GRIB2文件。

cmacd /sstorage1/COMMONDATA/OPER/NWPC/GRAPES_GFS_GMF/Prod-grib/2020031021/ORIG
zhangxn@10.40.140.43's password:
success
[wangdp@login_b09 ~]$ cmals
  the current  path of  secondary storage is  /sstorage1/COMMONDATA/OPER/NWPC/GRAPES_GFS_GMF/Prod-grib/2020031021/ORIG
gmf.gra.2020031100000.grb2
gmf.gra.2020031100003.grb2
gmf.gra.2020031100006.grb2
gmf.gra.2020031100009.grb2
...skip...

[wangdp@login_b09 ~]$ cmaget gmf.gra.2020031100084.grb2 .
  the current  path of  secondary storage is  /sstorage1/COMMONDATA/OPER/NWPC/GRAPES_GFS_GMF/Prod-grib/2020031021/ORIG
gmf.gra.2020031100084.grb2

sent 30 bytes  received 424771126 bytes  169908462.40 bytes/sec
total size is 424719186  speedup is 1.00
[wangdp@login_b09 ~]$

示例中标亮的行有明显的ssh登陆过程。命令本身是shell脚本,源代码也显示cmafs使用ssh登陆二级存储执行相应的操作。

下面介绍对cmafs源码的分析。

cmafs架构

cmafs命令的核心在于执行sshrsync命令,并使用expact命令实现自动输入密码。

cmafs命令执行的示意图如下图所示。

cmafs命令执行示意图

构建命令

cmafs命令根据用户的输入参数构建远程执行的命令,例如列出目录内容的命令如下。

ls  ${@:1:num} $filePath

自动运行ssh命令

再将命令和其他参数传给一个函数,函数中使用expect执行ssh命令并自动输入密码。

function expect_ssh(){
  user=$1
  ip=$2
  password=$3
  command=$4
  /usr/bin/expect << EOF
  spawn ssh -o ControlPersist=2h \
    -o ControlMaster=auto \
    -o ControlPath=$HOME/%r@%h.sock \
    -o StrictHostKeyChecking=no  \
    $user@$ip "$command"
  expect {
    "*yes/no" { send "yes\r" }
    "*password:" { send "$password\r";exp_continue}
  }
EOF
}

expect_ssh $user $ip "$password"  "ls  $* $pwd" 2>/dev/null  1>$HOME/zhangxn_log/stdout

ssh命令使用套接字保存连接,支持SSH连接的重用。套接字保存到$HOME/%r@%h.sock文件中。

显示结果

从最后一行可以看到,expect命令的输出,即ssh命令的输出,被保存到文本文件$HOME/zhangxn_log/stdout中。 命令脚本随后从该文件中获取需要的信息,并反馈给用户,就是上面看到的示例内容。 cmals命令会打印该文件中从第二行开始的内容。

cat $HOME/zhangxn_log/stdout | sed -n '2,$p'

当前目录

文件相关的很多操作需要有一个当前目录,而cmafs命令没有长久保持的ssh连接,无法自动记录当前目录。 所以,cmafs使用一个本地文件记录当前路径.

记录文件保存到$HOME/zhangxn_log/filePath/$PPID,其中PPID是父进程PID号。 对于命令行用户来说,每个终端执行的命令都有同一个PPID,所以不同操作都使用同一个记录文件,可以模拟当前目录的效果。

当执行的操作会改变当前目录时,cmafs命令会更新该文件。

思考

从业务系统开始上传数据到二级存储,我们就一直希望二级存储的数据可以方便地被使用。 但遗憾的是,CMA-PI上一直没有放开普通用户登陆二级存储挂载节点的权限,而是提供使用固定账户通过ssh登陆远程执行命令的cmafs工具。 既然账户名和密码都明文写在命令的脚本中,也就失去限制登陆的意义,还不如全面放开给所有用户直接登陆。 如果去掉命令脚本的读权限,也许能隐藏账户和密码信息。 但我还是觉得使用ssh不是很合适的方式,无法避免用户使用ssh直接登陆到目标服务器。

不过,我也还没想到其他的实现方式,当前目录是实现整套工具的难点。

nwpc-oper/nwpc-data-client项目使用gRPC从二级存储中下载文件。 但实现的功能毕竟与文件浏览还有很大的差距,也许后面可以尝试提供类似cmafs的功能。