从1.4节可以看出,命令“obd cluster start <集群名称>”负责启动整个集群,OBD会通过SSH登录到各个物理节点上逐一启动OBServer,启动后的OBServer会通过参数获知其他OBServer的存在,并通过选举机制或者根据Primary Zone设置为每个分区选出Leader,然后集群中各台OBServer根据OBProxy的调度接收SQL请求并合作完成处理。
节点上的OBServer进程通过执行可执行程序observer形成,OBServer进程(及其下属的线程)的所有状态信息都汇聚在一个ObServer类的实例中,几乎每一种子系统都被表现为某种类的实例,并相应地存放或者链接在ObServer实例的某个属性中。自然地,按照面向对象的思想,ObServer中也包含了大部分属性的Get和Set方法。图3.1a给出了ObServer的主要子系统以及各子系统对应的主要属性,而图3.1b则展示了各子系统之间的主要互动关系。
作为一个C++编写的程序,OBServer进程的运行也始于主函数main(位于src/observer/main.cpp中)。main函数会执行以下几项启动工作:
1)解析命令行参数。
2)创建运行状态、日志、配置目录,即2.3节所述的数据目录下run、log、etc子目录。
3)调用start_daemon函数将OBServer进程从一个普通进程转变成守护进程,并将守护进程的PID(进程号)写入运行状态目录下的observer.pid文件。
4)设置运行日志管理器OB_LOGGER,日志文件是log下的observer.log,还会根据解析的命令行参数设置日志级别,日志的最大文件大小为256×1024×1024,之后便开始记录运行日志。
图3.1 ObServer主体结构
5)如果守护进程启动成功,则开始启动OBServer的实例(线程)。
①调用ObServer类的get_instance方法得到一个ObServer实例。
②调用init方法根据命令行参数、日志配置初始化ObServer。
③调用start方法运行OBServer进程。
④调用wait方法等待停止信号,发现停止信号后调用stop方法停止ObServer中各个子系统。
⑤如果wait结束,调用destroy方法关闭OBServer进程。
OBServer中各个子系统的生命周期也和OBServer本身一样由初始化(init方法)、启动(start方法)、等待停止(wait方法)、停止(stop方法)组成,它们分别会在OBServer的相应阶段被调用。