Sun Cluster 数据服务开发者指南(适用于 Solaris OS)

编写和测试数据服务

使用 TCP 持续连接保护服务器

在服务器端使用 TCP 持续连接保护服务器,以避免为关闭的(或网络分区的)客户机浪费系统资源。如果在持续运行了足够长时间的服务器中没有清理这些资源,当客户机崩溃或重新引导时,会最终导致浪费的资源量无限地增长。

如果客户机-服务器通信使用 TCP 流,则客户机和服务器都应启用 TCP 持续连接机制。这也适用于非 HA 单服务器情况。

其他面向连接的协议可能也需要具有持续连接机制。

在客户机端,使用 TCP 持续连接机制,将使客户机在网络地址资源进行故障转移或从一个物理主机切换到另一个物理主机时收到通知。网络地址资源的这种传送将中断 TCP 连接。但是,除非该客户机已启用了持续连接机制,否则当连接中断而当时该连接又正处于静止状态时,该客户机不一定会收到关于此情况的通知。

例如,假设客户机正在等待服务器对长时间运行请求的反应,且该客户机的请求消息已发送到服务器并已在 TCP 层得到了确认。在此情况下,客户机的 TCP 模块无需不断重新传送请求。另外,客户机应用程序将处于阻塞状态,等待对该请求的响应。

在可能的情况下,客户机应用程序除了使用 TCP 持续连接机制以外,还必须在其级别上执行自己的定期持续连接。TCP 持续连接机制在处理所有可能的边界问题上并不都是完美的。通常情况下,使用应用程序级的持续连接机制要求客户机-服务器协议支持空操作,或至少支持有效的只读操作(例如状态操作)。

测试 HA 数据服务

本节提供了如何在 HA 环境中测试数据服务实现的建议。测试情况只是一些建议,并不很全面。您需要访问测试平台 Sun Cluster 的配置,以便测试工作不会对生产计算机造成影响。

测试 HA 数据服务在资源组在物理主机之间移动的所有情况下是否能正常运行。这些情况包括系统崩溃以及使用 scswitch 命令的情况。测试客户机在这些情况下是否可以继续获取服务。

测试方法的幂等性。例如,用可多次调用原始方法的简短 shell 脚本暂时替换所有方法。

协调资源间的依赖性

有时,某个客户机-服务器数据服务在满足某个客户机请求的同时,也会向其他的客户机-服务器数据服务发出请求。例如,如果当数据服务 A 提供其服务时,数据服务 B 也必须提供其服务,则说明数据服务 A 依赖于数据服务 B。为了满足此要求,Sun Cluster 允许在资源组内配置资源的依赖性。这些依赖性会影响 Sun Cluster 启动和停止数据服务的顺序。有关详细信息,请参见 scrgadm(1M) 手册页。

如果您的资源类型的资源依赖于其他类型的资源,则您需要指导群集管理员正确配置资源和资源组。或者,提供正确配置它们的脚本或工具。如果依赖资源必须和“被依赖”资源在同一节点上运行,则必须在同一资源组中配置这两种资源。

决定是使用显式资源依赖性,还是忽略它们,并用您 HA 数据服务的自身代码轮询其他数据服务的可用性。如果依赖资源和被依赖资源可以在不同节点上运行,则可以在不同的资源组中对它们进行配置。在此情况下,需要进行轮询,这是因为不能跨组配置资源依赖性。

某些数据服务本身不直接存储数据。而是依赖其他后端数据服务存储其所有的数据。这样的数据服务将所有只读和更新请求转送到对后端数据服务的调用中。例如,假设一个将其所有数据都保留在 SQL 数据库(例如 Oracle)中的客户机-服务器日程日历服务。日程日历服务具有自己的客户机-服务器网络协议。例如,它可能已使用 RPC 规范语言(例如 ONC RPC)定义了自己的协议。

在 Sun Cluster 环境中,您可以使用 HA-ORACLE 使后端 Oracle 数据库具有高可用性。然后,就可以编写用于启动和停止日程日历守护进程的简单方法。群集管理员使用 Sun Cluster 注册日程日历资源类型。

如果日程日历应用程序必须与 Oracle 数据库在同一节点上运行,则群集管理员必须在与 HA-ORACLE 资源所在的同一资源组中配置日程日历资源并使其依赖于 HA-ORACLE 资源。使用 scrgadm 中的 Resource_dependencies 属性标记指定该依赖性。

如果 HA-ORACLE 资源可以在与日程日历资源不同的节点上运行,则群集管理员将它们配置到两个不同的资源组中。群集管理员可能会在 Oracle 资源组中配置日历资源组的资源组依赖性。但是,资源组依赖性仅当两个资源组同时在同一节点上启动或停止时才有效。因此,日历数据服务守护进程在启动后可能进行轮询,以等待 Oracle 数据库成为可用的数据库。在此情况下,日历资源类型的 Start 方法通常返回成功消息。但是,如果 Start 方法无限期地处于阻塞状态,它将使其资源组处于繁忙状态。此繁忙状态将阻止对该组进行任何进一步的状态更改(例如编辑、故障转移或切换)。但是,如果日历资源的 Start 方法超时或以非零状态退出,则其超时或非零退出状态可能会导致该资源组在两个或多个节点之间切换,而 Oracle 数据库仍不可用。