ceph中rbdmap遇到问题的案例分析

79次阅读
没有评论

共计 3978 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章将为大家详细讲解有关 ceph 中 rbdmap 遇到问题的案例分析,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

运行于 centos6.5 的 rbdmap:

[root@mon0 ceph]# cat /etc/init.d/rbdmap 
#!/bin/bash
# rbdmap Ceph RBD Mapping
# chkconfig: 2345 70 70
# description: Ceph RBD Mapping
### BEGIN INIT INFO
# Provides: rbdmap
# Required-Start: $network $remote_fs
# Required-Stop: $network $remote_fs
# Should-Start: ceph
# Should-Stop: ceph
# X-Start-Before: $x-display-manager
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Ceph RBD Mapping
# Description: Ceph RBD Mapping
### END INIT INFO
DESC= RBD Mapping: 
RBDMAPFILE= /etc/ceph/rbdmap 
. /lib/lsb/init-functions
do_map() {if [ ! -f  $RBDMAPFILE  ]; then
 #log_warning_msg  $DESC : No $RBDMAPFILE found. 
 exit 0
 # Read /etc/rbdtab to create non-existant mapping
 RET=0
 while read DEV PARAMS; do
 case  $DEV  in
   |\#*)
 continue
  */*)
  *)
 DEV=rbd/$DEV
 esac
 #log_action_begin_msg  ${DESC}  ${DEV} 
 newrbd= 
 MAP_RV= 
 RET_OP=0
 OIFS=$IFS
 IFS= , 
 for PARAM in ${PARAMS[@]}; do
 CMDPARAMS= $CMDPARAMS --$(echo $PARAM | tr  =    ) 
 done
 IFS=$OIFS
 if [ ! -b /dev/rbd/$DEV ]; then
 MAP_RV=$(rbd map $DEV $CMDPARAMS 2 1)
 if [ $? -eq 0 ]; then
  newrbd= yes 
 else
  RET=$((${RET}+$?))
  RET_OP=1
 #log_action_end_msg ${RET_OP}  ${MAP_RV} 
 if [  $newrbd  ]; then
 ## Mount new rbd
 MNT_RV= 
 mount --fake /dev/rbd/$DEV  /dev/null 2 1 \
  MNT_RV=$(mount -v /dev/rbd/$DEV 2 1)
 [ -n  ${MNT_RV}  ]   log_action_msg  mount: ${MNT_RV} 
 ## post-mapping
 if [ -x  /etc/ceph/rbd.d/${DEV}  ]; then
  #log_action_msg  RBD Running post-map hook  /etc/ceph/rbd.d/${DEV} 
  /etc/ceph/rbd.d/${DEV} map  /dev/rbd/${DEV} 
 done   $RBDMAPFILE
 exit ${RET}
do_unmap() {
 RET=0
 ## Unmount and unmap all rbd devices
 if ls /dev/rbd[0-9]*  /dev/null 2  then
 for DEV in /dev/rbd[0-9]*; do
 ## pre-unmapping
 for L in $(find /dev/rbd -type l); do
  LL= ${L##/dev/rbd/} 
  if [  $(readlink -f $L)  =  ${DEV}  ] \
    [ -x  /etc/ceph/rbd.d/${LL}  ]; then
  log_action_msg  RBD pre-unmap:  ${DEV}  hook  /etc/ceph/rbd.d/${LL} 
  /etc/ceph/rbd.d/${LL} unmap  $L 
  break
  fi
 done
 #log_action_begin_msg  RBD un-mapping:  ${DEV} 
 UMNT_RV= 
 UMAP_RV= 
 RET_OP=0
 MNT=$(findmnt --mtab --source ${DEV} --noheadings | awk  {print $1})
 if [ -n  ${MNT}  ]; then
 # log_action_cont_msg  un-mounting  ${MNT} 
  UMNT_RV=$(umount  ${MNT}  2 1)
 if mountpoint -q  ${MNT}  then
  ## Un-mounting failed.
  RET_OP=1
  RET=$((${RET}+1))
 else
  ## Un-mapping.
  UMAP_RV=$(rbd unmap $DEV 2 1)
  if [ $? -ne 0 ]; then
  RET=$((${RET}+$?))
  RET_OP=1
  fi
 #log_action_end_msg ${RET_OP}  ${UMAP_RV} 
 [ -n  ${UMNT_RV}  ]   log_action_msg  ${UMNT_RV} 
 done
 exit ${RET}

 *) log_success_msg  Usage: rbdmap {start|stop|restart|force-reload|reload|status} exit 1 esac

修改一些在 centos 上没有的 log 后,这个脚本使用起来还是有问题,具体描述如下:

1. 在只 rbd map 一个块得到 /dev/rbd0 后,使用 rbdmap 脚本可以正常 map/unmap /dev/rbd0。

2. 当将 /dev/rbd0 格式化后挂载到一个目录上,再使用 rbdmap,关机的时候系统就会 hang 在 unmounting filesystem 上了,只能强制断电;再开机启动后执行了 rbdmap 的 do_map() 函数,一切正常。

排查后发现,当将 /dev/rbd0 挂载到目录后,rbdmap 就不会执行 do_unmap() 函数,即使函数中加入显式 umount 操作也不会执行。

想了一个折中的办法,在 rbdmap 停止优先级高的服务中的 stop 函数中显式加入 umount 操作,重启时一切正常了。

先来看一下 ceph、rbdmap 的启停顺序:

head rbdmap
#!/bin/bash
# rbdmap Ceph RBD Mapping
# chkconfig: 2345 70 70
# description: Ceph RBD Mapping
head ceph
#!/bin/sh
# Start/stop ceph daemons
# chkconfig: - 60 80
### BEGIN INIT INFO
# Provides: ceph
# Default-Start:
# Default-Stop:
# Required-Start: $remote_fs $named $network $time
# Required-Stop: $remote_fs $named $network $time

可以看出 ceph 先于 rbdmap 启动,rbdmap 先于 ceph 停止。如果采用 nfs,使用 rbdmap 映射出的块设备,先看看 nfs 的启停顺序:

head /etc/init.d/nfs
#!/bin/sh
# nfs This shell script takes care of starting and stopping
# the NFS services.
# chkconfig: - 30 60
# description: NFS is a popular protocol for file sharing across networks.
# This service provides NFS server functionality, which is \
# configured via the /etc/exports file.
# probe: true

nfs 是这三者中最先启动的,也是最先停止的。所以在 nfs 的 stop 函数中加入 umount 命令:

umount /mnt/nfs
umount /mnt/nfs2

在 rbdmap 中加入挂载命令:

mount /dev/rbd0 -o rw,noexec,nodev,noatime,nobarrier,discard /mnt/nfs
mount /dev/rbd1 -o rw,noexec,nodev,noatime,nobarrier,discard /mnt/nfs2

/etc/ceph/rbdmap 的设置如下:

backup1/backup.img
backup2/backup.img

记得在 ceph-0.80 时测试是没有问题的,到了 0.87.1 出现了上述问题。

关于“ceph 中 rbdmap 遇到问题的案例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3978字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)