需求描述

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

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

实现的方式

本次设计的方式是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日

ceph luminous bluestore热插拔实现的更多相关文章

  1. ceph luminous 新功能之内置dashboard

    前言 ceph luminous版本新增加了很多有意思的功能,这个也是一个长期支持版本,所以这些新功能的特性还是很值得期待的,从底层的存储改造,消息方式的改变,以及一些之前未实现的功能的完成,都让ce ...

  2. Ceph luminous 安装配置

    Ceph luminous 安装配置 #环境centos7 , Ceph V12 openstack pike 与 ceph 集成 http://www.cnblogs.com/elvi/p/7897 ...

  3. ceph luminous 新功能之内置dashboard 之 mgr功能模块配置

    前言 ceph luminous版本新增加了很多有意思的功能,这个也是一个长期支持版本,所以这些新功能的特性还是很值得期待的,从底层的存储改造,消息方式的改变,以及一些之前未实现的功能的完成,都让ce ...

  4. Ceph学习之路(三)Ceph luminous版本部署

    1.配置ceph.repo并安装批量管理工具ceph-deploy [root@ceph-node1 ~]# vim /etc/yum.repos.d/ceph.repo [ceph] name=Ce ...

  5. ceph luminous版部署bluestore

    简介 与filestore最大的不同是,bluestore可以直接读写磁盘,即对象数据是直接存放在裸设备上的,这样解决了一直被抱怨的数据双份写的问题 Bluestore直接使用一个原始分区来存放cep ...

  6. Ceph Luminous版本创建OSD无法激活问题

    一.问题描述 部署ceph的Luminous之ceph-12.2.10版本,在其中一个集群节点部署OSD时,发现命令执行完毕后,集群中并没有将格式化的盘加入到OSD中,也没有任何报错,问题如下: [r ...

  7. ceph扩展bluestore的db分区

    前言 在ceph 14版本里面才加入了bluefs-bdev-migrate,分区迁移相关的命令,那么在12版本里面其实也是可以扩展分区的 测试的版本 [root@lab102 ceph-0]# ce ...

  8. ceph Luminous版手动安装零散记录

    1.安装必要的依赖包,关防火墙,向/etc/hosts内添加域名等 2.安装ceph 配置yum源 (如果嫌慢,可以配置cachedir=/home/yum/$basearch/$releasever ...

  9. Ceph的BlueStore总体介绍

    整体架构 bluestore的诞生是为了解决filestore自身维护一套journal并同时还需要基于系统文件系统的写放大问题,并且filestore本身没有对SSD进行优化,因此bluestore ...

随机推荐

  1. 扫描仪扫描文件处理-ABBYY自动矫正图像歪斜

    修改界面语言: 设置为不识别图片文字(因为我们只需要把图片歪斜校正): 保存无损彩色格式:

  2. 【UR #9】App 管理器

    UOJ小清新题表 题目内容 UOJ链接 一句话题意:给出一个强联通的混合图,有一些有向边和无向边.删除一些边使其维持强联通的状态,求删边方案. 数据范围 \(1\leq n\leq 5000,0\le ...

  3. spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

    一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...

  4. Java Map转成xml标签字符串

    一个简单的java实现,供参考: package com.trilogy.session.data; import java.lang.reflect.Field; import java.util. ...

  5. Python之包的相关

    包的产生: 由于模块不断更新,越写越大,仅用单个py文件会使模块逻辑不够清晰,所以需要将模块的不同功能放入不同的py文件,然后将所有py文件放在一个目录内,这个目录就是包 包就是一个包含用__init ...

  6. HTML编辑器(1)

    前言 现在网上有很多这样的HTML编辑器,这种编辑器无疑给人带来了很多方便,所以自己也想尝试制作一款这样的HTML编辑器,既然要制作,那就肯定是先把UI搭起来,再慢慢完善功能 设计思路 我的思路就是将 ...

  7. 普通人如何站在时代风口学好AI?这是我看过最好的答案

    摘要:当前,数据.算法.算力的发展突破正推动AI应用的逐步落地. AI是什么? 根据维基百科的定义,人工智能是一种新的通用目的技术(GPT, General Purpose Technology),它 ...

  8. 一些免费API接口

    转载自:https://www.cnblogs.com/haimishasha/p/6351403.html 天气接口 聚合数据: http://op.juhe.cn/onebox/weather/q ...

  9. 常用物联网应用层协议(1)——先说HTTP协议

    概念 简介 HTTP是一个属于应用层的面向对象的协议,目前使用最为广泛的是HTTP1.1协议.当然,许多网站已经开始支持HTTP2.0,HTTP2复杂度高于HTTP1.1,我们先从HTTP1.1说起. ...

  10. A. Peter and Snow Blower 解析(思維、幾何)

    Codeforce 613 A. Peter and Snow Blower 解析(思維.幾何) 今天我們來看看CF613A 題目連結 題目 給你一個點\(P\)和\(n\)個點形成的多邊形(照順或逆 ...