2020-12-15

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的子状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值