CMA-PI上共享存储访问工具cmafs介绍
2020.04.16 注:最新版的 cmafs 已经使用当前用户免密码登陆二级存储挂载节点,也就意味着放开了普通用户对挂载节点的访问权限。
如何存储和获取历史数据一直是数值预报模式研发人员关心的问题。
ECMWF有完善的数据归档系统(MARS),提供丰富的接口支持检索和下载归档的模式数据。 但我们还缺乏类似的平台,历史数据大多以离线硬盘的形式保存。
中国气象局正在建设气象大数据云平台,旨在提供从数据、算法、接口到计算能力等气象业务需要的全部基础设施。
数值预报中心在国家气象信息中心的协助下,已开始使用气象大数据云平台中的分布式存储(二级存储)来保存历史归档数据。
二级存储
数值预报业务系统在高性能计算机CMA-PI上生成数据产品,推送到二级存储保存。
使用pird.nmic.cn
和piop.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命令的核心在于执行ssh
或rsync
命令,并使用expact
命令实现自动输入密码。
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的功能。