同步模式
对于 SmartEDB 高可用性应用程序,需要了解两项独立操作:初始同步和事务复制。初始同步在副本连接后执行一次,可以是静态(默认)或热同步。静态初始化会阻塞主服务器上的写事务,而热同步允许在初始化期间执行读写事务。
事务复制分为同步和异步两种模式。同步复制时,主服务器等待每个事务在副本上的确认(ack),因此主服务器的提交只有在副本应用更改后才会返回。异步复制时,主服务器将序列化的事务放入异步缓冲区,稍后发送。异步缓冲区由不同线程处理,因此“稍后”意味着事务在提交调用返回控制权后才发送到网络,具体发送时间未知且不受数据库运行时控制。
静态同步是初始化新附加副本的默认方式。在此模式下,主数据库启动只读事务,导致所有读写事务排队,直到同步完成。使用 MURSIW 事务管理器时,其他只读事务可以在所有读写事务之前或以更高优先级开始并行执行。这是最快的同步模式,且无需应用程序干预。
在 C/C++ 应用程序中,调用 mco_HA_master_params_init() 即可设置静态同步。在 C# 和 Java 应用程序中,默认构造函数 MasterConnection.Parameters 自动设置静态同步模式。
静态同步
如果数据库非常大、通信通道速度慢,或主系统和副本系统运行缓慢,静态同步可能会使主数据库在读写事务中长时间不可用。这些情况下适合使用热同步。热同步允许主数据库在初始同步期间继续更新,但会延长同步时间,因为需要重新传输在此期间修改的数据。此外,主数据库会更繁忙,导致响应时间下降。异步复制模式也会暂时关闭,直到初始同步完成。
在 C/C++ 主应用程序中,通过将 master 的 mode_flags 设置为 MCO_HAMODE_HOTSYNCH 来启用热同步。
mco_HA_master_params_t MasterParams;
mco_HA_master_params_init( &MasterParams );
MasterParams.mode_flags = MCO_MASTER_MODE | MCO_HAMODE_HOTSYNCH;
…
mco_HA_set_master_params( db, &MasterParams );
在 C# 和 Java 主应用程序中,MasterConnection.Parameters 构造函数是通过 MasterConnection.MCO_HAMODE_HOTSYNC 标志来调用的:
MasterConnection.Parameters MParams = new MasterConnection.Parameters(
MasterConnection.MCO_HAMODE_HOTSYNCH );
con.SetReplicationMode( MParams );

结合异步复制与热同步
如果应用程序同时使用热同步初始同步和异步复制,则事务复制通常为异步,但在新附加副本初始化期间会暂时切换为同步模式。
要在 C/C++ 主应用程序中结合异步复制与热同步初始同步,请按以下方式设置这两个标志:
MasterParams.mode_flags = MCO_MASTER_MODE | MCO_HAMODE_HOTSYNCH | MCO_HAMODE_ASYNCH;
在 C# 和 Java 主应用程序中:
MasterConnection.Parameters MParams = new MasterConnection.Parameters(
MasterConnection.MCO_HAMODE_HOTSYNCH |
MasterConnection.MCO_HAMODE_ASYNCH );
二进制模式演进
为了在应用程序升级期间保持系统的可用性,SmartEDB 高可用性支持二进制模式的架构演变。在此模式下,SmartEDB 高可用性运行时会自动将主架构中的对象转换为副本架构中的对象。当副本收到主数据库的副本时,初始同步步骤能够适应新类、新字段、新索引、已删除的类、已删除的字段、已删除的索引、索引的更改以及字段的更改的存在,只要这种更改不会导致精度损失。
在 C/C++ 主应用程序中,通过将 master 中的 mode_flags 元素设置为 MCO_HAMODE_BINEVOLUTION 来启用与二进制模式演进的同步:
mco_HA_master_params_t MasterParams;
mco_HA_master_params_init( &MasterParams );
MasterParams.mode_flags = MCO_MASTER_MODE | MCO_HAMODE_BINEVOLUTION;
…
mco_HA_set_master_params( db, &MasterParams );
在 C# 和 Java 主应用程序中,MasterConnection.Parameters 构造函数是通过 MasterConnection.MCO_HAMODE_BINEVOLUTION 标志来调用的:
MasterConnection.Parameters MParams = new MasterConnection.Parameters(
MasterConnection.MCO_HAMODE_BINEVOLUTION );
con.SetReplicationMode( MParams );
将在线数据库迁移到新架构的过程如下:
- 构建具有更新模式的新版本副本应用程序。
- 安装并启动新的副本应用程序。
- 在 C/C++ 副本中,从 mco_HA_attach_master() 返回后调用 mco_HA_set_master_params();在 C# 和 Java 副本中,从 ReplicaConnection.AttachMaster() 返回后实例化 MasterConnection(),以成为新的主应用程序。
- 停止旧的主应用程序。
- 如果存在其他副本,它们将自动重新连接到新的主应用程序。
- 依次更新旧的主应用程序和其他副本。
- 如有需要,更新后的旧主应用程序重新启动后可再次成为主应用程序。
通过这种方式,始终有一个主应用程序在运行,确保系统可用性。
下图展示了 BSE 的复制过程:

示例
C SDK 示例 Binenv 展示了如何通过设置 MCO_HAMODE_BINEVOLUTION 模式标志来开启二进制模式演化,从而自动将对象从主模式转换为副本模式。Java SDK 示例 habinenv 则通过连接参数 MasterConnection.MCO_HAMODE_BINEVOLUTION 来实现相同的功能。
有状态复制
通常,副本连接到主节点时会通过初始同步(静态或热同步)接收整个数据库的副本,这可能耗时较长。启用有状态复制后,主节点会在循环缓冲区中保留一定数量的事务(由应用程序指定,取决于系统内存)。当需要同步时,主节点仅传输缓冲区中的事务,而不是整个数据库。
例如,通信通道短暂中断可能导致副本在断开和重新连接期间遗漏少量事务。如果这些遗漏的事务仍在主节点的缓冲区中,副本重新连接时可以跳过初始同步,仅重新传输遗漏的事务。这称为有状态复制,因为主节点会根据副本的状态进行调整。
在 C/C++ 主应用程序中,通过将 master 的 mode_flags 设置为 MCO_HAMODE_STATEFUL_REPLICATION 来启用有状态复制。
mco_HA_master_params_t MasterParams;
mco_HA_master_params_init( &MasterParams );
MasterParams.mode_flags = MCO_MASTER_MODE | MCO_HAMODE_STATEFUL_REPLICATION;
MasterParams.trans_log_length = 25;
…
mco_HA_set_master_params( db, &MasterParams );
请注意,通过指定 MasterParams.trans_log_length = value 的值来确定循环事务缓冲区的大小。 在 C# 和 Java 主应用程序中,使用 MasterConnection.MCO_HAMODE_STATEFUL_REPLICATION 标志调用 MasterConnection.Parameters 构造函数:
MasterConnection.Parameters MParams = new MasterConnection.Parameters(
MasterConnection.MCO_HAMODE_STATEFUL_REPLICATION );
con.SetReplicationMode( MParams );