ceph-osd流程分析
1. OSD全局配置参数初始化,包含cli参数、配置文件解析,主要是初始化两个对象g_conf和g_ceph_context。
2. 根据启动参数知道whoami。
3. 初始化FileStore对象。包含初始化FileStore目录路径,包含current/omap/commit_op_seq。
4. 一些命令操作,包含mkfs/mkkey/flushjournal/dump_journal/convertfilestore。
5. OSD从filestore读取元数据信息,包含magic/whoami/ceph_fsid/fsid,对关键信息whoami/magic进行非法判断。
6. 根据设置的public和cluster网段选择合适的网卡。
7. 初始化ms_public/ms_cluster/ms_hbclient/ms_hb_back_server/ms_hb_front_server/ms_objecter,并绑定端口。
8. 挂成后台daemon。
9. 初始化辅助线程和对象,包含加密、是否重新打开日志、超时线程检测。
10. 初始化monclient,monclient初始化monmap,从conf中读取所有的mon。
11. 初始化erasure_code所在目录。
12. 初始化OSD对象,主要是赋值OSD所用的Messenger、锁、定时器、队列等。
13. OSD预初始化,包含确认filestore是否可以正常使用和增加对配置修改的观察。
14. 启动上面初始化的Messenger,准备加入集群。
15. OSD启动,主要包含如下工作
a. tick定时器启动
b. filestore的mount,包含设置throttle、lock fsid文件、确认filestore的版本是否正确、确认filestore下面使用的文件系统、omap的leveldb库初始化、journal和请求处理线程池启动、
c. OSD读取superblock对象,包含cluster_fsid、osd_fsid、whoami、current_epoch、oldest_map、newest_map、weight、clean_thru。
d. get osdmap。通过superblock对象记录的current_epoch版本号,从current/meta目录下读取该osdmap。
e. 清理临时对象。
f. load_pgs。遍历所有pg,做如下事情
1. 获取该pg所有对应的map_epoch,根据map_epoch从current/meta下获取对应版本的osdmap。若找不到对应版本的osdmap,进程退出。
2. 根据pg的类型、osdmap、pgid,创建PG对象。
3. pg开始初始化,从omap数据库中读取pg_info、past_intervals;从数据库中读取pg_log。
4. service.init_splits_between(pg->info.pgid, pg->get_osdmap(), osdmap);
5. 根据本地osdmap,计算pg的up/up_primary/acting/primary。
6. 计算当前OSD在acting中的序号,即当前osd的pg是否为primary pg。
7. pg状态机从Initalize状态通过load事件进入reset状态,然后?
8. build_past_intervals_parallel?
g. 将OSD加入到所有messenger消息处理的dispatcher中。
h. monc初始化,主要是把monc帮到messenger上。
i. monc订阅monmap。
j. monc->renew_subs();
k. start_boot,主要完成工作如下:
1. 设置状态为PRE_BOOT。
2. 向mon发送获取osdmap最新版本号的消息,收到回应消息后,发送boot消息;
16. 注册信号的处理函数,信号包含SIGHUP、SIGINT、SIGTERM。
17. 等待OSD进程退出及清理工作。
备注:ceph-osd启动最后的工作是向mon发送boot消息,以后所有的状态转换是靠Messenger对消息的处理进行驱动。
后续的逻辑处理流程
一. OSD状态从boot -> active到流程如下:
1. mon对于boot消息的回应消息是向OSD发回最新的osdmaposd。
2. OSD收到osdmap提交到本地meta目录下,OSD状态从boot->active。
二. 主PG初始化后从Initial状态迁移到peering状态。
1. 主PG初始状态为Initial。// 该状态在load_pgs函数中,通过load这个evt进入reset状态。
2. 迁移到reset。
a. 在consume_map -> pg->queue_null
切换到peering_queue的线程
a. process_peering_events
b. advance_pg
c. for handle_advance_map
d. handle_activate_map
e. PG::RecoveryState::Reset::react(const ActMap&)
3. 迁移到Started,直接进入第一子状态Start
4. 迁移到Start
a. 主pg通过MakePrimary进入Primary。
b. 非主pg通过MakeStray()进入Stray。
5. Primary struct Primary : boost::statechart::state< Primary, Started, Peering >, NamedState // 定义Primary状态属于Started状态机,默认子状态为Peering
a. 进入Peering.
6. Peering struct Peering : boost::statechart::state< Peering, Primary, GetInfo >
a. 进入GetInfo
7. GetInfo
8. WaitUpThru struct WaitUpThru : boost::statechart::state< WaitUpThru, Peering >, NamedState // WaitUpThru属于Peering的子状态