HA 应用
双层架构
SmartEDB 高可用性采用双层架构,这有助于开发基于 SmartEDB 的高可用性应用程序。较高层称为协议层。此层负责应用程序的高可用性逻辑。较低层称为传输层或网络层,它实现了主节点与副本节点之间的实际数据传输。
应用程序使用高层协议 API 来实现高可用性。协议层使用传输层 API 在网络节点之间发送和接收数据,因此应用程序开发人员通常无需与较低层的 API 进行交互。只有在实现自定义传输层时,开发人员才会关注这些较低层的功能。
应用程序结构
提供了多种宿主语言 API 以整合 SmartEDB 高可用性功能。下面将对 C/C++、Java 和 C# API 进行描述。也可以使用 xSQL 作为高可用性主应用程序或副本应用程序。(有关使用 xSQL 的更多信息和说明,请参阅 xSQL 用户指南。)
要整合 SmartEDB 高可用性:
C/C++
若要将 SmartEDB 高可用性功能整合到 C/C++ 应用程序中,需要执行以下操作:
- 将 mcoha.h 包含到应用程序源代码中
- 在数据库模式中声明一个自动对象标识符(auto_oid)
- 链接两个分别实现协议层(HA)和传输层(NW)的库
- 链接序列化库 libmcoseri.a 或 libmcoseri_debug.a 。

协议层是在 mcoha 库(对于 Unix 系统为 libmcoha.a,对于 Windows 系统为 mcoha.lib)中实现的,而平台无关的传输层是在名为 mconwXXX 的库中实现的(对于 Unix 系统为 libmconwXXX.a,对于 Windows 系统为 mconwXXX.lib),其中“XXX”表示所使用的网络协议类型。而且,单个 SmartEDB 高可用性应用程序可以链接多个传输层库。
以下网络传输层协议由 SmartEDB 高可用性提供:
TCP:适用于 Unix 的 libmconwtcp.a,适用于 Windows 的 mconwtcp.lib
UDP:Unix 系统使用 libmconwudp.a,Windows 系统使用 mconwudp.lib
命名管道:Unix 系统使用 libmconwpipes.a,Windows 系统使用 mconwpipes.lib
QNX 消息传递:libmconwqnxm.a(仅适用于 QNX 操作系统)。
要初始化 SmartEDB 高可用性,所有 C 和 C++ 应用程序都必须调用 mco_HA_start() 来启动高可用性运行时,并调用 mco_HA_channel_implementation_add() 来注册一个或多个 NW 通道。例如:
...
mco_runtime_start();
mco_HA_start();
mco_HA_channel_implementation_add(mco_nw_tcpip_vt());
...
C#
若要将 SmartEDB 高可用性功能整合到 C# 应用程序中,应用程序需要:
在应用程序源代码中包含 SmartEDB 命名空间(使用 SmartEDB;)
在 Database 对象的构造函数中设置 HighAvailabilitySupport 标志,以使高可用性支持库动态加载。
Java
若要将 SmartEDB 高可用性整合进来,Java 应用程序需要:
在应用程序源代码中包含 SmartEDB 命名空间(导入 com.mcobject.smartedb.*;)(将“SmartEDB”翻译成“SmartEDB”)
在 Database 对象的构造函数中设置 HighAvailabilitySupport 标志,以使高可用性支持库动态加载。
复制数据流
以下图表说明了基本的 SmartEDB 高可用性应用程序数据流:

SmartEDB 高可用性应用程序支持同步或异步复制,并通常实现热切换逻辑。主副本和副本是相同应用程序的实例,分别作为主节点或副本运行,且副本可在必要时切换角色。所有复制功能由 SmartEDB 高可用性运行时管理,但可通过响应特定事件在副本中实现自定义处理。
初始同步通过以下方式完成:主节点调用 C/C++ 函数 mco_HA_attach_replica() 或 C#/Java 方法 MasterConnection.AttachReplica();副本调用 C/C++ 函数 mco_HA_attach_master() 或 C#/Java 方法 ReplicaConnection.AttachMaster()。同步完成后,主节点调用 mco_trans_commit()(C)或 MasterConnection.CommitTransaction()(C#/Java)进行后续复制管理。
通信通道操作、异步缓冲处理等内部功能由超时值控制。C 应用程序中,这些超时值通过 mco_HA_set_master_params() 和 mco_HA_attach_master() 设置;C# 和 Java 应用程序中,超时值为 MasterConnection.Parameters 和 ReplicaConnection.Parameters 的属性,分别通过 MasterConnection.SetReplicationMode() 和 ReplicaConnection.AttachMaster() 设置。
DDL 要求
在高可用性模式下可能被复制的使用数据库的 C/C++ 应用程序的模式必须包含 auto_oid 声明。
declare auto_oid [100000];
在 C# 和 Java 应用程序中,当通过调用带有高可用性支持的 Database 类构造函数创建数据库实例时,auto_oid 实现会自动完成。在 C# 中,操作如下:
Database db = new Database( …, Database.Mode.HighAvailabilitySupport);
在 Java 中,MCO_CFG_HA_SUPPORT 标志的指定方式如下:
Database db = new Database( Database.MCO_CFG_HA_SUPPORT );
数据库是否实际参与高可用性同步是在运行时确定的。在为高可用性编译数据定义时,SmartEDB 高可用性 DDL 编译器会在每个对象中插入一个 8 字节的唯一标识符(称为 auto_OID,不要与字段类型 autoid 混淆)。此 auto_OID 由备用应用程序中的运行时使用,在主应用程序的地址空间之外执行同步提交。可以将其视为全局对象标识符。为它维护一个哈希索引,以便在必要时副本运行时能够快速定位对象。
(这些实现细节仅作参考之用。没有发布可用于访问索引的接口。)
初始同步
初始同步是复制的第一步,由 SmartEDB 高可用性运行时管理。主节点通过调用 C/C++ 函数 mco_HA_attach_replica() 或 C# 和 Java 的 MasterConnection.AttachReplica() 方法进行初始同步。副本则通过调用 C/C++ 函数 mco_HA_attach_master() 或 C# 和 Java 的 ReplicaConnection.AttachMaster() 方法完成初始同步。
初始同步有四种模式:静态同步、热同步、使用 BSE 同步和有状态同步。这些模式的差异详见“同步”页面。C/C++ 应用程序通过设置 mco_HA_master_params_t 结构中的 mode_flags 元素选择模式;C# 和 Java 应用程序则在 MasterConnection.Parameters 中设置模式,并传递给 MasterConnection.SetReplicationMode() 方法。
需要注意的是,静态模式和热模式不能组合使用,但其他模式可以组合。