- 论坛徽章:
- 0
|
Linux 集群认证ZT
服务脚本
对于简单“冷备用”情况,我们可以不加修改地使用标准 /etc/init.d/slapd 脚本。我们希望做一些特别的事,因此我们创建了自己的 slapd 脚本,该脚本存储在 /etc/ha.d/resource.d/ 中。Heartbeat 将该目录放置在其搜索路径中的第一位,因此我们不必担心会运行 /etc/init.d/slapd 脚本。但是,您应该检查以确保引导时不再启动 slapd(从 /etc/rc.d 树结构除去所有 S*slapd 文件)。首先,我们在第 17 行和第 18 行指明 slapd 服务器的启动配置文件。
该脚本遵循标准 init.d 语法,因此启动信息包含在从第 21 行开始的 test_start() 函数中。首先,我们停止当前运行的所有 slapd 实例。在第 39 行,我们使用主服务器配置文件启动主服务器。我们的设计将遵循这样的规则:如果主节点和辅助节点都已启动,则在主节点上将 slapd 作为主服务脚本启动,在辅助节点上将 slapd 作为从服务脚本启动,并启动复制守护程序。如果只有一个节点启动,则将 slapd 作为主服务脚本启动。将虚拟 IP 绑定到 slapd 主服务脚本。要完成这一点,我们必须知道哪个节点正在执行该脚本,如果是主节点,那么我们需要知道辅助节点的状态。重要的内容在脚本的‘start’分支中。因为我们已经在 Heartbeat 配置中指明了主节点,所以我们知道当 test_start() 函数运行时,它运行在 Heartbeat 主节点上(因为 Heartbeat 使用 /etc/init.d/ 脚本,因此所有的脚本都用参数“start|stop|restart”调用)。当调用脚本时,Heartbeat 会设置许多环境变量。下面是我们感兴趣的一个:
HA_CURHOST=slave6
可以使用‘HA_CURHOST’值来了解何时正在主节点(slave6)上执行以及何时处于故障转移中(HA_CURHOST 应是‘slave5’)。现在我们需要知道另一个节点的状态。要了解这一点,可以“询问” Heartbeat。我们将使用随 Heartbeat 一同提供的 api_test.c 文件,并创建一个简单的客户机来“询问”节点状态(api_test.c 文件有许多内容都与客户机有关,我们只需除去不需要的内容,然后添加一条输出语句)。请注意程序中执行查询的第 31 行。
Heartbeat 查询源代码清单
- 1 /* taken from api_test.c in the heartbeat package, with thanx */
-
- 2 #include <stdio.h>;
- 3 #include <stdlib.h>;
- 4 #include <string.h>;
- 5 #include <fcntl.h>;
- 6 #include <unistd.h>;
- 7 #include <errno.h>;
- 8 #include <signal.h>;
- 9 #include <sys/types.h>;
- 10 #include <sys/utsname.h>;
- 11 #include <sys/time.h>;
- 12 #include <sys/stat.h>;
- 13 #include <stdarg.h>;
- 14 #include <heartbeat.h>;
- 15 #include <hb_api_core.h>;
- 16 #include <hb_api.h>;
-
-
- 17 int
- 18 main(int argc, char ** argv)
- 19 {
- 20 unsigned fmask;
- 21 ll_cluster_t* hb;
-
- 22 (void)_heartbeat_h_Id;
- 23 (void)_ha_msg_h_Id;
-
-
- 24 hb = ll_cluster_new("heartbeat");
- 25 if (hb->;llc_ops->;signon(hb, NULL)!= HA_OK) {
- 26 fprintf(stderr, "Cannot sign on with heartbeat\n");
- 27 fprintf(stderr, "REASON: %s\n", hb->;llc_ops->;errmsg(hb));
- 28 exit(1);
- 29 }
-
- 30 /* here is where we ask for status */
- 31 fprintf(stdout, "%s\n" ,hb->;llc_ops->;node_status(hb, "slave5"));
- 32
- 33 if (hb->;llc_ops->;signoff(hb) != HA_OK) {
- 34 fprintf(stderr, "Cannot sign off from heartbeat.\n");
- 35 fprintf(stderr, "REASON: %s\n", hb->;llc_ops->;errmsg(hb));
- 36 exit(10);
- 37 }
- 38 if (hb->;llc_ops->;delete(hb) != HA_OK) {
- 39 fprintf(stderr, "REASON: %s\n", hb->;llc_ops->;errmsg(hb));
- 40 fprintf(stderr, "Cannot delete API object.\n");
- 41 fprintf(stderr, "REASON: %s\n", hb->;llc_ops->;errmsg(hb));
- 42 exit(11);
- 43 }
- 44 return 0;
- 45 }
复制代码
编译后,我们将文件安装在 /etc/ha.d/resource.d/ 中。程序的名称为‘other_state’。以下是访问完整的故障转移脚本的链接,我们还是从与 Heartbeat 一同提供的示例脚本开始,并增加少许修改:
启动脚本
|
|