共计 4299 个字符,预计需要花费 11 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 ceph 中 Jewel OSD 进程启动处理流程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
OSD::main()
|__ObjectStore::create()
|__调用 FileStore 构造函数创建 FileStore 类对象
|__MonClient::build_initial_monmap() 从配置文件中读取 monitor map 信息
|__OSD::mkfs()
|__FileStore::mkfs()
|__在 /var/lib/ceph/osd/ceph-${id}/ 目录下生成 fsid 文件
|__在 /var/lib/ceph/osd/ceph-${id}/ 目录下创建 version_stamp 文件
|__在 /var/lib/ceph/osd/ceph-${id}/ 目录下创建 superblock 文件
|__在 /var/lib/ceph/osd/ceph-${id}/ 目录下创建 current 文件夹
|__在 /var/lib/ceph/osd/ceph-${id}/current/ 目录下创建 commit_op_seq 文件且初始化该文件的内容为 1
|__在 /var/lib/ceph/osd/ceph-${id}/current/omap/ 目录下创建 osd_uuid 文件(current/omap 目录是 OSD omap 的工作目录)
|__FileStore::mkjournal()
|__FileStore::new_journal()
|__FileJournal() 构造函数来创建 FileJournal 实例
|__在 /var/lib/ceph/osd/ceph-${id}/ 目录下创建 type 文件且向该文件中写入 filestore
|__FileStore::mount()
|__FileStore::read_fsid()
|__FileStore::version_stamp_is_valid() 检查 version_stmap 文件是否有效并读取该文件中的内容
|__FileStore::read_superblock() 读取 superblock 文件中的内容
|__在 /var/lib/ceph/osd/ceph-${id}/current/ 目录下创建 nosnap 文件
|__把 /var/lib/ceph/osd/ceph-${id}/current/omap 目录作为 omap_store 的基准目录,调用 KeyValueDB::create() 创建 KeyValueDB 实例
|__FileStore::new_journal() 创建 journal
|__JournalingObjectStore::journal_start() 启动 journal
|__启动 ondisk_finishers 和 apply_finishers 线程池
|__FileStore::read() 从”meta”中读取 superblock 对象信息且保存到 OSDSuperblock 类对象中
|__比较 superblock 中的 cluster_fsid 是否有效
|__OSD::write_meta() 将 magic/whoami/ceph_fsid/ready 信息写入到 /var/lib/ceph/osd/ceph-${id}/ 目录下对应的文件中
|__对于需要创建 key 来说,使用 EntityAuth.CryptoKey 来创建一个 key 且将新建的 key 添加到 keyring 中,同时也将该 keyring 写入到 /var/lib/ceph/osd/ceph-${id}/ 目录下 keyring 文件中
|__对于需要创建 journal 来说,调用 FileStore::mkjournal() 函数来创建 journal
|__OSD::peek_meta() 从 /var/lib/ceph/osd/ceph-${id}/ 目录下对应的文件中读取 magic/cluster_fsid/osd_fsid/whoami 信息
|__pick_addresses() 从配置文件中读取 public_addr 和 cluster_addr 值
|__创建 client/cluster/hbclient/hb_back_server/hb_front_server 的 Messenger 类实例。一般情况下 client 和 hb_front_server 用 public_addr,cluster/hbclient/hb_back_server 用 cluster_addr
|__MonClient::build_initial_monmap() 从配置文件中创建 MonMap
|__调用 OSD 类构造函数创建 OSD 类对象
|__OSD::pre_init()
|__启动 client/cluster/hbclient/hb_back_server/hb_front_server 的 Messenger 类实例
|__OSD::init()
|__tick_timer.init() 初始化心跳定时器
|__OSDService.backill_request_timer.init() 初始化 backfill 请求定时器
|__ObjectStore::mount() 挂载文件系统
|__OSD::read_superblock() 从集群中读取 superblock 信息且保存到 OSDSuperblock 类对象中
|__确保 snapmapper 对象存在于”meta”中
|__创建 ClassHandler 类实例
|__get_map() 根据 superblock 中记录的当前 epoch 值获取 osdmap,若 osdmap 没有在 map_cache 中则从”meta”的 osdmap.epoch 中读取 osdmap 且同步到 map_cache 中
|__OSD::load_pgs() 读取 OSD 上所有的 pg 信息
|__FileStore::list_collections() 遍历 /var/lib/ceph/osd/ceph-${id}/current/ 目录下所有目录且只要 TYPE_PG
|__coll_t.parse() 解析 /var/lib/ceph/osd/ceph-${id}/current/ 目录下所有目录,meta 对应 TYPE_META,_head 对应 TYPE_PG,_TEMP 对应 TYPE_TEMP
|__遍历所有 TYPE_PG
|__调用 PG::peek_map_epoch() 函数
|__OSD::_open_lock_pg()
|__OSD::_make_pg() 创建 ReplicatedPG 类实例
|__PG::read_state() 读取 PG 的状态
|__PG::read_info() 从 omap 中读取_infover/_info/_biginfo 属性值
|__PGLog::read_log() 读取 PGLog 信息,根据 PGLog 信息得到 missing 的信息
|__OSDMap::pg_to_up_acting_osds() 计算出该 PG 对应的 OSDs
|__PG::init_primary_up_acting() 这个 PG 所对应的 OSDs
|__OSDMap::calc_pg_role() 计算出 PG 的 roles
|__PG::set_role()
|__PG::reg_next_scrub() 注册下一次进行 scrub 的操作
|__OSD::build_past_intervals_parallel()
|__OSD::create_logger() 创建 OSD logger
|__MonClient::init() 初始化 MonClient 类实例
|__启动 osd_tp/osd_op_tp/recovery_tp/disk_tp/command_tp 线程池
|__OSDService::init() 初始化 OSDService
|__MonClient::authenticate() 做 Monitor 认证
|__OSD::update_crush_location() OSD 启动后更新 crushmap 操作,可以在配置文件中设置 osd_crush_update_on_start = false 来禁止 OSD 启动后更新 crushmap
|__OSDService::final_init()
|__OSD::consume_map()
|__OSD::start_boot()
|__OSD::finial_init()
|__注册一系列通过 socket 进行操作的命令
以上是“ceph 中 Jewel OSD 进程启动处理流程的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!