ceph中Jewel OSD进程启动处理流程的示例分析

65次阅读
没有评论

共计 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 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4299字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)