文档章节

ceph rbdmap遇到的一个问题

加油2018
 加油2018
发布于 2015/03/04 10:18
字数 861
阅读 1.5K
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

运行于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
	fi

	# 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
			fi
		fi
		#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}"
			fi
		fi
	done < $RBDMAPFILE
	exit ${RET}

}

do_unmap() {
	RET=0
	## Unmount and unmap all rbd devices
	if ls /dev/rbd[0-9]* >/dev/null 2>&1; 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)
			fi
			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
			fi
			#log_action_end_msg ${RET_OP} "${UMAP_RV}"
			[ -n "${UMNT_RV}" ] && log_action_msg "${UMNT_RV}"
		done
	fi
	exit ${RET}
}


case "$1" in
  start)
	do_map
	;;

  stop)
	do_unmap
	;;

  restart|force-reload)
	$0 stop
	$0 start
	;;

  reload)
	do_map
	;;

  status)
	rbd showmapped
	;;

  *)
	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出现了上述问题,有时间读读rbdmap脚本。

© 著作权归作者所有

加油2018
粉丝 150
博文 276
码字总数 246145
作品 0
海淀
架构师
私信 提问
加载中

评论(0)

利用ceph-deploy在ubuntu server14.04上部署ceph并进行其它配置

环境与说明 在ubuntu14.04 server上部署ceph-0.87;设置rbdmap自动挂载/卸载rbd块设备;利用带rbd支持的tgt导出iscsi的rbd块。 2. 安装ceph 1)配置hostname与无密码登录 root@mon0:/etc/cep...

加油2018
2014/11/11
4.7K
16
设置开机ceph自动map rbd块设备

先下载init-rbdmap到/etc/init.d目录: wget https://raw.github.com/ceph/ceph/a4ddf704868832e119d7949e96fe35ab1920f06a/src/init-rbdmap-O /etc/init.d/rbdmap 下载的原始文件有些错误,......

加油2018
2014/08/14
3.7K
0
004.Ceph块设备基础使用

一 基础准备 参考《002.Ceph安装部署》文档部署一个基础集群; 新增节点主机名及IP在deploy节点添加解析: 1 [root@deploy ~]# echo "172.24.8.75 cephclient" >>/etc/hosts 配置国内yum源:...

osc_td8iepxa
2019/01/18
5
0
2、ceph-deploy之配置使用RBD

说明 部署完ceph集群(active+clean状态)之后, 我们来实践下ceph block device(即RBD或RADOS block device)。 我们需要在一台新的client节点上,初始化、使用ceph集群创建、提供的卷(i...

osc_hssgzmz0
2018/05/04
2
0
配置Kubernetes共享使用Ceph存储

目录 简要概述 环境测试 结果验证 简要概述 Kubernetes pod 结合Ceph rbd块设备的使用,让Docker 数据存储在Ceph,重启Docker或k8s RC重新调度pod 不会引起数据来回迁移。 工作原理无非就是拿...

Linux就该这么学
2019/04/25
67
0

没有更多内容

加载失败,请刷新页面

加载更多

Discourse 如何在首页中显示 Box 的子分类

如下图, 如何在 Discourse 中显示子分类。 discourse-sub-col-01 1207×872 147 KB 你可以在分类的设定中进行设置,这个设定需要在上级目录中设置。 discourse-sub-col-02 556×656 76.3 KB...

honeymoose
30分钟前
27
0
OSChina 周六乱弹 —— 妈妈快看,外面有只人类

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《1万年の时を越えて》- 上松範康 手机党少年们想听歌,请使劲儿戳(这里) @火眼...

小小编辑
37分钟前
27
0
git-Linux客户端使用

下载test代码 git pull https://gitee.com/yunmhs/test.git 上传test代码 git add . 将新更新的文件更新至本地git仓库( . 代表当前目录所有 ) git commit -m "Dockerfile Images update huan......

huanke
38分钟前
26
0
静态方法和类方法之间的区别 - Difference between staticmethod and classmethod

问题: 用@staticmethod装饰的函数和用@staticmethod装饰的函数有@staticmethod @classmethod ? 解决方案: 参考一: https://stackoom.com/question/ZP7/静态方法和类方法之间的区别 参考二...

javail
38分钟前
13
0
垃圾收集器与内存分配策略

对象已死? 垃圾标记算法 1.引用计数算法 C++智能指针、Python 2.可达性分析算法 JavaGC Roots的根对象作为起始节点,通过引用链到某个对象不可达时,证明此对象不可能再被使用。 强引用:...

LoSingSang
昨天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部