首页 > 深入理解ceph-disk activate 源码逻辑

深入理解ceph-disk activate 源码逻辑

文章目录

      • CEPH-DISK代码逻辑
        • `Activate osd`的主要逻辑如下
        • DEF main_activate激活osd的入口函数
          • DEF mount_activate挂载临时目录,分配osd id并初始化osd
            • DEF activate 分配osd_id以及初始化osd

CEPH-DISK代码逻辑

本文在上文 :深入理解ceph-disk prepare 源码逻辑基础上描述ceph-diskactivate代码逻辑

通过main函数的子命令解析器,我这里激活osd主要那个用到的是如下解析结果

#对activate子命令进行解析,并设置参数的函数属性为main_activate
make_activate_parser(subparsers)

Activate osd的主要逻辑如下

  1. 将已经prepare且格式化好的磁盘第一分区挂载到临时目录 ,默认为/var/lib/ceph/tmp/mnt.xxx
  2. 根据/var/lib/ceph/tmp/文件夹下磁盘sdx的osd-lockbox.sdx所在行号分配该磁盘的osd id编号
  3. 初始化osd

    a. 将osd加入到monmap中,使用命令ceph --cluster ceph --name client.bootstrap-osd --keyring keyring mon getmap -o monmap

    b. 初始化osd id的集群属性以及用户组,包括ceph-osd --cluster ceph --mkfs -i osd_id --monmap monmap --osd-data path --osd-uuid fsid --seruer ceph --setgroup ceph
  4. 挂载osd对应id的目录/var/lib/ceph/osd/{cluster}-{osd_id}
  5. 启动osd进程systemctl start ceph-osd@id

DEF main_activate激活osd的入口函数

def main_activate(args):...#获取到要激活的设备路径dev = str(args.path)[5:]dev = dev[:-1]osd_prepare_lock = ("%s.%s" %(OSD_PREPARE, dev))...#该函数功能主要是以上描述中的激活osd的前三步(cluster, osd_id) = mount_activate(dev=args.path,activate_key_template=args.activate_key_template,init=args.mark_init,dmcrypt=args.dmcrypt,dmcrypt_key_dir=args.dmcrypt_key_dir,reactivate=args.reactivate,)...#启动osd进程if (not args.no_start_daemon andargs.mark_init not in (None, 'none')):start_daemon(cluster=cluster,osd_id=osd_id,)
DEF mount_activate挂载临时目录,分配osd id并初始化osd
def mount_activate(dev,activate_key_template,init,dmcrypt,dmcrypt_key_dir,reactivate=False,
):...#使用ceph-conf命令从指定的ceph.conf中获取挂载属性(一般为挂载的文件系统类型)mount_options = get_mount_options(cluster='ceph', fs_type=fstype)#使用如上步骤中获取到的挂载属性进行挂载,将第一分区挂载到临时文件目录。#该挂载的目的是为了检查磁盘是否处于deactivate的状态,并查看分区所属用户组以及权限是否正确path = mount(dev=dev, fstype=fstype, options=mount_options)...#调用函数activate进行osd id的分配并初始化osd(osd_id, cluster) = activate(path, activate_key_template, init)...#初始化osd已经成功,卸载掉临时目录,挂载osd对应id的目录`/var/lib/ceph/osd/{cluster}-{osd_id}`if active:LOG.info('%s osd.%s already mounted in position; unmounting ours.'% (cluster, osd_id))unmount(path)elif other:raise Error('another %s osd.%s already mounted in position ''(old/different cluster instance?); unmounting ours.'% (cluster, osd_id))else:move_mount(dev=dev,path=path,cluster=cluster,osd_id=osd_id,fstype=fstype,mount_options=mount_options,)
DEF activate 分配osd_id以及初始化osd
def activate(path,activate_key_template,init,
):#检查当前路径是否是osd的data分区(第一分区),否则报错check_osd_magic(path)#从临时目录下获取从集群配置文件以及密钥文件中中获取到的集群相关属性:#ceph_fsid集群唯一标识#cluster集群名称#fsid bluestore唯一标识#keyring osd的启动密钥ceph_fsid = read_one_line(path, 'ceph_fsid')if ceph_fsid is None:raise Error('No cluster uuid assigned.')LOG.debug('Cluster uuid is %s', ceph_fsid)cluster = find_cluster_by_uuid(ceph_fsid)if cluster is None:raise Error('No cluster conf found in ' + SYSCONFDIR +' with fsid %s' % ceph_fsid)LOG.debug('Cluster name is %s', cluster)fsid = read_one_line(path, 'fsid')if fsid is None:raise Error('No OSD uuid assigned.')LOG.debug('OSD uuid is %s', fsid)keyring = activate_key_template.format(cluster=cluster,statedir=STATEDIR)#先从临时目录下/var/lib/ceph/tmp/mnt.xxx 的whoami文件中获取osd idosd_id = get_osd_id(path)#获取不到,则进行创建if osd_id is None:#创建osd_id依赖 /var/lib/ceph/tmp/osd-lockbox.sdx #该文件是prepare过程中为每个磁盘分配的锁文件ceph-osd-lockbox.sdx(sdx为磁盘符号)#osd编号是直接从该锁文件读取得到,该文件是在prepare时创建的osd_id = allocate_osd_id(cluster=cluster,fsid=fsid,keyring=keyring,path=path,)write_one_line(path, 'whoami', osd_id)LOG.debug('OSD id is %s', osd_id)...#通过mkfs初始化osd,设置osd在集群中的属性:#osd加入monmap,osd的数据分区路径,osd所在的bluestore标识,osd各个分区的用户权限以及用户组权限if not os.path.exists(os.path.join(path, 'ready')):LOG.debug('Initializing OSD...')# re-running mkfs is safe, so just run until it completesmkfs(path=path,cluster=cluster,osd_id=osd_id,fsid=fsid,keyring=keyring,)#移除初始化标记,防止其他方式需要初始化osd需要打标for other in INIT_SYSTEMS:if other != init:try:os.unlink(os.path.join(path, other))except OSError:pass#向文件夹中标记activate状态为okif not os.path.exists(os.path.join(path, 'active')):write_one_line(path, 'active', 'ok')

更多相关:

  • 文章目录1. 解决问题2. 应用场景3. 实现方式C++实现C语言实现4. 缺点5. 和其他三种创建模式的对比(单例,工厂,建造者) 1. 解决问题 如果对象的创建成本较大,而同一个类的不同对象之间的差别不大(大部分字段相同),在这种情况下,我们可以利用已有对象(原型)进行赋值(拷贝)的方式,创建新的对象,从而达到节省对象创...

  • 混合osd的部署 先部署所有的ssd 在/etc/ceph.conf中最后添加ssd做osd的block大小如下: 比如部署中有两个ssd,则添加 [osd.0] bluestore_block_size = xxxx [osd.1] bluestore_block_size = xxx 如上的size大小计算如下,如ssd容量...

  • 文章目录Pool创建ec pool创建副本pool创建Pool参数创建根故障域及添加osd其他命令Tier相关 Pool创建 ec pool创建 创建profile ceph osd erasure-code-profile set $profile_name k=$k m=$m crush-failure-domain...

  • 文章目录简介使用OSD相关操作PG相关操作对象相关操作总结 简介 ceph-objectstore-tool工具,能够操作到ceph最底层的数据,包括pg,对象层级。它能够对底层pg以及对象相关数据进行获取、修改。并能够对一些问题pg和对象进行简单修复。所以使用该工具进行操作的时候需要谨慎(涉及到修改的操作最好备份一份数据)...

  • 文章目录ceph版本:环境配置:异常问题:问题解决:总结 ceph版本: ceph 12.2.1 环境配置: tier_pool 16个分区大小800G 的osd容量 3副本 data_pool 32个4T盘 3副本 异常问题: ps:在分布式存储中遇到任何问题都不要先去通过重设存储节点,清除磁盘数据来解决,一定要...

  •     先吐为敬!   最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆“代码拷贝党”、“留一手”、“缺斤少两”、“不说人话”、“自己都没跑通还出来发blog”、“各种缺少依赖包”、“各种注释都没有”、“自己都不知道在写什么”的程序大神纷纷为了增加自己博客一个帖子的名额而发布了各种千奇百�...

  • 阅读ceph源码过程中需要明确当前操作是由哪个线程发出,此时需要根据线程id来确认线程名称 C++获取线程id是通过系统调用来直接获取 函数描述 头文件: 函数名称:syscall(SYS_gettid) 该函数直接返回了一个pid_t int类型的数字,即为当前线程id 此外函数pthread_s...

  • 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实际生产环境中必须考虑的问题。 面试题剖析 基于数据库的实现方案 数据库自增 id 这个就是说你的...

  • ORM操作    单表、一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(m...

  • 建立如下表: 建表语句: class表创建语句 create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset=utf8;student表创建语句 c...