原文链接:http://write.blog.csdn.net/postedit/10921297
代码位置:src/ceph_mon.cc
首先help看下ceph-mon的usage
usage:
ceph-mon -i monid [--mon-data=pathtodata][flags]
--debug_mon n
debug monitor level (e.g. 10)
--mkfs
build fresh monitor fs
--force-sync
force a sync from another mon bywiping local data程序中有一个 if (mkfs) 分支,如果启动参数的有--mkfs,进去之后会不大一样,而且最后return 0不会启动monmkfs分支:
1.解析public_address(public_address是什么,不懂看这个http://ceph.com/docs/master/rados/configuration/network-config-ref/)
2.创建或者载入monmap < ----从配置文件中载入
3.检查monmap中的quorum中是否有该mon
4.检查fsid
5.读取osdmap
6.建立monitorDBstore,储存配置中的mon_data
7.创建新的mon < ---用上面获得参数,如monmap、store
非mkfs分支:
1.创建monitorestoreDB(封装了LevelDB,用于monmap等信息的存储)
2.获取注入的monmap ,并且获得、写入、保存新的version
3.获得最新的monmap
4.获取ip
5.检查rank,rank代表在monmap的位置,如果不在为-1(此rank值会在以后的选举中用到)
6.创建messenger < --- 其实是其派生类simplemessenger(ceph是基于消息传递机制实现分布式数据一致性的,此messenger就是负责ceph中消息传递的,底层套接字管道)
7.创建monitor ,调用 ❶mon->preinit() ;❷ messenger->start();❸ mon->init();
monitor::preinit():
1.检查logger,clusterlogger
2.fsid
3.检查是否为quorum,创建quorum,取配置文件中mon_initial_members,在monmap中写入initial——member以及extra——probe_peers
4.保证store的一致性
5.monitor::initpaxos(),调用paxos->init() 《---loadpaxosvariables from stable storage ,开启六个paxosserivce
6.quorumservice::init(),检查health
7.注册一些admin-sockets(预留了套接字用户系统运行期间动态改变一些参数http://ceph.com/docs/master/rados/configuration/ceph-conf/)
其他:
src/mon/monmap.h