暂未分类 暂未分类 ceph luminous bluestore热插拔实现 zphj1987 2019-09-02 2024-01-05 需求描述 在某些测试场景下面,需要满足能够拔盘以后在插入的时候能够自动上线磁盘,这个需求实际在生产中是不建议使用的,原因是插入的磁盘如果本身存在问题,那么拉起的操作可能会破坏了本身集群的稳定性,所以这个算是一个测试相关的功能,但是做这个功能的前提是我们不要去影响了正常的环境的逻辑
类似的功能的开发都是应该去在外面做触发的也就是能够很方便的开启和关闭功能,整个功能也是集成到原来的环境当中的,原来怎么用,现在怎么用
实现的方式 本次设计的方式是udev去截取lvm的设备的加载,如果直接截获磁盘的加载,这个在ceph bluestore里面是有问题的,因为bluestore采用的是lvm设备,这个是需要设备插入以后,再用一系列的触发,再去做相关的启动的
我们的设计方式是在lvm加载的时候去截取判断,是不是我们需要启动的信息
修改rule文件 /usr/lib/udev/rules.d/69-dm-lvm-metad.rules 这个在最后加上,如果不是我们ceph使用的设备,会在脚本里面去排除
1 2 LABEL="lvm_end" RUN+="/sbin/trigger.sh $name "
在最后面添加一个处理的脚本,修改好文件以后我们需要重载一下规则
1 udevadm control --reload
udev的触发规则 /sbin/trigger.sh 文件的内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 #!/usr/bin/bash logfile=/tmp/udev.log startdisk (){ echo `date ` if [[ $1 != dm* ]]; then exit 0 fi echo "$1 " 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 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
测试的时候可以 删除磁盘 1 echo 1 > /sys/block/sdb/device/delete
扫描磁盘 1 for a in seq 0 2;do echo "- - -" > /sys/class/scsi_host/host$a /scan;done ;
注意 不管是主动做stop还是对相关的进程做kill,都会触发设备的变化,这个地方就没法判断是真的人为触发的stop,还是挂掉的,还是插入磁盘的时候没有启动,这里就通过打标记去判断下
1 2 3 4 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是不要去拉起来的,这个会做一个标志位的设置 启动的时候,默认会把标志位改成要自启动的,这个可以自己手动修改去控制
修改启动脚本,加入引用脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [root@lab101 ~] [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
增加两个钩子脚本,不会影响原来的启动
1 2 3 4 5 6 [root@lab101 ~] echo 1 > /var/lib/ceph/osd/ceph-$1 /autostart[root@lab101 ~] echo 0 > /var/lib/ceph/osd/ceph-$1 /autostart
功能基本完成 需要对一些比较特殊的场景进行下测试了,比如真的起不来的时候要不要做更多的判断控制,目前就这块可能存在一直尝试拉的问题,加个计数器可以解决,这里把主线都基本完成了
更新历史
why
when
创建
2019年09月02日
更新
2019年12月9日