heartbeat是开源的HA软件,很多公司使用heartbeat来做双机,熟悉heartbeat的启动,可以方便我们使用HA的时候帮助我们对启动问题的定位和分析。 RunStartStop pre-start 脚本首先执行这个命令,首先监测heartbeat的/etc/ha.d/resource.d目录下是否有startstop脚本,我的机器 ls /etc/ha.d/resource.d/|grep startstop 没有发现这个脚本,所以这步忽略。 StartHA 启动HA,这里首先检查是否启用CRM模块,我这里没有启用,然后检查/etc/ha.d/haresources的合法性,然后初始化watchdog模块,这个需要根据ha.cf配置来选择是否加载生成wachdog,然后创建/var/run下面需要的目录,包括heartbeat和crm目录,heartbeat又有ccm crm dopd目录。下面检查haresouces是否存在,具体逻辑是如果/etc/ha.d/ipresouces存在并且haresouces不存在,重命名ipresouces为haresouces,然后StartSBD 这个主要是启动/sbin/sbd,我这里不存在这个东西,所以没有启动,具体sbd做什么我也不知道,暂时不考虑细节。最后是start_heartbeat,实际上是执行/usr/lib/heartbeat/heartbeat >& /dev/null,至此我们找到具体启动heartbeat程序的入口点了。
我们从heartbeat的源代码入手,一步步揭开heartbeat启动的神秘面纱,首先我们找heartbeat.c的main函数,我们关注几个命令行参数d的话是开启debug模式,这个对我们调试非常有用,也就是说我们在启动脚本里启动的时候加上-d,heartbeat开启debug模式,将提供给我们非常多的信息。-k是在关闭heartbeat选项,如果实际上heartbeat脚本里关闭heartbeat就是传递-k给heartbeat应用。启动的主要是在StartHeartbeat:中的initialize_heartbeat,这个初始化heartbeat的主要几个进程。
下面我们看一下heartbeat如何关闭的,当我们传递-k参数给程序的时候,其实程序主要发信号SIGTERM给master进程
代码如下:
代码如下:id=Gmain_timeout_add_full(PRI_CHECKSIGS, config->heartbeat_ms
代码如下:if (handlers&HB_SIG_TERM_SIG) {
代码如下:if (curproc->type == PROC_MST_CONTROL) {
代码如下:send_local_status();
代码如下:if (!shutdown_last_client_child(SIGTERM)) {
|