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

编写和测试数据服务

本节介绍一些有关编写和测试数据服务的信息。

使用持续连接机制

对于服务器端,使用 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 数据库仍然不可用。