小伙伴们的ceph源码分析二——monitor启动流程

原文链接: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不会启动mon


mkfs分支:

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   < ---用上面获得参数,monmapstore

非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.检查loggerclusterlogger

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/)


其他:

1.converter
Monitor::StoreConverter converter(g_conf->mon_data,store);
0.52版本后,monmap格式修改,解决兼容性问题
2.magic
err= store->get(Monitor::MONITOR_NAME, "magic", magicbl);
0.48版本后,magic变量做了修改

3.rank计算相关内容

src/mon/monmap.h

class MonMap {
public:
  map<string, entity_addr_t> mon_addr;
  map<entity_addr_t,string> addr_name;
  vector<string> rank_name;
  vector<entity_addr_t> rank_addr;
}

void calc_ranks()


版权声明:本文为kakaxi8891原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。