zoukankan      html  css  js  c++  java
  • ceph luminous bluestore热插拔实现

    需求描述

    在某些测试场景下面,需要满足能够拔盘以后在插入的时候能够自动上线磁盘,这个需求实际在生产中是不建议使用的,原因是插入的磁盘如果本身存在问题,那么拉起的操作可能会破坏了本身集群的稳定性,所以这个算是一个测试相关的功能,但是做这个功能的前提是我们不要去影响了正常的环境的逻辑

    类似的功能的开发都是应该去在外面做触发的也就是能够很方便的开启和关闭功能,整个功能也是集成到原来的环境当中的,原来怎么用,现在怎么用

    实现的方式

    本次设计的方式是udev去截取lvm的设备的加载,如果直接截获磁盘的加载,这个在ceph bluestore里面是有问题的,因为bluestore采用的是lvm设备,这个是需要设备插入以后,再用一系列的触发,再去做相关的启动的

    我们的设计方式是在lvm加载的时候去截取判断,是不是我们需要启动的信息

    修改rule文件
    /usr/lib/udev/rules.d/69-dm-lvm-metad.rules
    这个在最后加上,如果不是我们ceph使用的设备,会在脚本里面去排除

    LABEL="lvm_end"
    RUN+="/sbin/trigger.sh $name"
    

    在最后面添加一个处理的脚本,修改好文件以后我们需要重载一下规则

    udevadm control --reload
    

    udev的触发规则

    /sbin/trigger.sh 文件的内容如下

    #!/usr/bin/bash
    logfile=/tmp/udev.log
    startdisk(){
    	#记录时间信息
    	echo `date` 
    	# 判断是不是dm设备,不是dm设备的直接忽略即可
    	if [[ $1 !=  dm* ]]; then
    	exit 0
    	fi
    	# 记录设备名称,有问题可以排查
    	echo "$1"
    	# 获取lv_name和vgname 这个拔掉盘实际还是能查到
    	dev_vg=`udevadm info  --query=property  /dev/$1|grep "DM_LV_NAME="|awk -F '=' '{print $2}'`
    	dev_vg_name=`udevadm info  --query=property  /dev/$1|grep "DM_VG_NAME="|awk -F '=' '{print $2}'`
    	echo $dev_vg_name
    	echo $dev_vg
    	# 为了确认设备是不是存在,进一步判断
    	/usr/sbin/lvdisplay $dev_vg_name 
    	if [ $? -ne 0 ]; then
    	echo "设备不存在"
    	exit 0
    	fi
    	# 判断下是不是ceph用的设备
    	osdindex="osd-block"
            if [ ! -n "$dev_vg" ]||[[ $dev_vg != *$osdindex* ]]; then
            echo "not ceph partition"
    	exit 0
            fi
    
    	dev_lv_name=$dev_vg
    	fsid=${dev_lv_name:10}
    	echo $fsid
    	# 去自启动里面拿到这个信息,如果盘本身不想自启动的,我们就不会拉起了,直接跳过
    	osdid=`ls /etc/systemd/system/multi-user.target.wants/ceph-volume@*|grep $fsid |awk -F '/' '{print $6}'|awk -F '@' '{print $2}' |awk -F '-' '{print $2}'`
    	echo $osdid
    	service=`ls /etc/systemd/system/multi-user.target.wants/ceph-volume@*|grep $fsid |awk -F '/' '{print $6}'|awk -F '@' '{print $2}'`
    
    	if [ ! -n "$osdid" ]; then
    	echo "no osd id"
    	exit 0
    	fi
    
    	if [ ! -n "$service" ]; then
    	echo "not ceph partition"
    	exit 0
    	fi
    	# 需要判断一次状态,如果设备本身已经是启动的,那么我们就不操作,不判断会无限循环
    	osdstatus=`systemctl is-active  ceph-osd@$osdid`
    	if [[ $osdstatus == active ]]; then
    	echo "osd runing"
    	exit 0
    	fi
    	
    	dostart=`cat /var/lib/ceph/osd/ceph-$osdid/autostart`
    	# 主动的停止不需要启动拉起
    	if [[ $dostart == 0 ]]; then
            echo "not want start osd"
                 exit 0
            fi
    
    	# 卸载掉设备,进行一次自启动和挂载
    	umount /var/lib/ceph/osd/ceph-$osdid
    	systemctl start ceph-volume@$service
    	# 再判断一次,万一真拉不起来,那就多等待一会,避免反复拉起,后面看下要不要改成拉不起来就不拉了,磁盘应该挂上了只是启动不了
            osdstatus=`systemctl is-active  ceph-osd@$osdid`
            if [[ $osdstatus != active ]]; then
            echo "osd not runing wait 1 min"
    	sleep 60
            exit 0
            fi
    }
    
    startdisk  $1 >> $logfile 
    
    

    测试的时候可以

    删除磁盘

    echo 1 > /sys/block/sdb/device/delete
    

    扫描磁盘

    for a in seq 0 2;do echo "- - -" > /sys/class/scsi_host/host$a/scan;done;
    

    注意

    不管是主动做stop还是对相关的进程做kill,都会触发设备的变化,这个地方就没法判断是真的人为触发的stop,还是挂掉的,还是插入磁盘的时候没有启动,这里就通过打标记去判断下

    KERNEL[22163.000802] change   /devices/virtual/block/dm-3 (block)
    UDEV  [22163.060487] change   /devices/virtual/block/dm-3 (block)
    KERNEL[22183.407454] change   /devices/virtual/block/dm-3 (block)
    UDEV  [22183.472656] change   /devices/virtual/block/dm-3 (block)
    

    也就是会再次进入监控的流程里面,所以需要加入判断
    主动进行的stop是不要去拉起来的,这个会做一个标志位的设置
    启动的时候,默认会把标志位改成要自启动的,这个可以自己手动修改去控制

    修改启动脚本,加入引用脚本

    [root@lab101 ~]# cat /usr/lib/systemd/system/ceph-osd@.service
    [Unit]
    Description=Ceph object storage daemon osd.%i
    After=network-online.target local-fs.target time-sync.target ceph-mon.target
    Wants=network-online.target local-fs.target time-sync.target
    PartOf=ceph-osd.target
    
    [Service]
    LimitNOFILE=1048576
    LimitNPROC=1048576
    EnvironmentFile=-/etc/sysconfig/ceph
    Environment=CLUSTER=ceph
    ExecStart=/usr/bin/ceph-osd -f --cluster ${CLUSTER} --id %i --setuser ceph --setgroup ceph
    ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id %i
    ExecReload=/bin/kill -HUP $MAINPID
    ExecStartPost=-/usr/lib/ceph/ceph-osd-start.sh  %i
    ExecStop=-/usr/lib/ceph/ceph-osd-stop.sh  %i
    ProtectHome=true
    ProtectSystem=full
    PrivateTmp=true
    TasksMax=infinity
    Restart=on-failure
    StartLimitInterval=30min
    StartLimitBurst=30
    RestartSec=20s
    
    [Install]
    WantedBy=ceph-osd.target
    
    

    增加两个钩子脚本,不会影响原来的启动

    [root@lab101 ~]# cat /usr/lib/ceph/ceph-osd-start.sh 
    #! /bin/bash
    echo 1 >  /var/lib/ceph/osd/ceph-$1/autostart
    [root@lab101 ~]# cat /usr/lib/ceph/ceph-osd-stop.sh 
    #! /bin/bash
    echo 0 >  /var/lib/ceph/osd/ceph-$1/autostart
    

    功能基本完成

    需要对一些比较特殊的场景进行下测试了,比如真的起不来的时候要不要做更多的判断控制,目前就这块可能存在一直尝试拉的问题,加个计数器可以解决,这里把主线都基本完成了

    更新历史

    why when
    创建 2019年09月02日
    更新 2019年12月9日
  • 相关阅读:
    xheditor富文本编辑器支持从word复制粘贴保留格式和图片的插件
    kindeditor富文本编辑器支持从word复制粘贴保留格式和图片的插件
    fckeditor富文本编辑器支持从word复制粘贴保留格式和图片的插件
    PAT 甲级 1078 Hashing (25 分)(简单,平方二次探测)
    PAT 甲级 1077 Kuchiguse (20 分)(简单,找最大相同后缀)
    Node.js+Express框架+Mongo学习(一)第一个node.js实例
    python web开发——django学习(二)orm介绍与model检查
    python web开发——django学习(二)第一个django网站运行成功
    排序算法分析
    "飞机大战"游戏_Java
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575457.html
Copyright © 2011-2022 走看看