异步复制
在异步或延迟复制中,更新会在主节点上的事务提交后异步传播到副本节点。这些更新作为单独的事务应用,可以提高事务响应速度,但可能导致副本读取过时数据。如果主节点上的事务已提交但尚未传播到副本,副本应用程序可能会读取“过时”的数据。
在 C/C++ 应用程序中,通过将 master 的 mode_flags 设置为 MCO_HAMODE_ASYNCH 来启用异步复制。
mco_HA_master_params_t MasterParams;
mco_HA_master_params_init( &MasterParams );
MasterParams.mode_flags = MCO_MASTER_MODE | MCO_HAMODE_ASYNCH;
…
mco_HA_set_master_params( db, &MasterParams );
在 C# 和 Java 应用程序中:
MasterConnection.Parameters MParams = new MasterConnection.Parameters(
MasterConnection.MCO_HAMODE_ASYNCH);
con.SetReplicationMode( MParams );
主应用程序还必须创建一个内存设备,以容纳在共享内存或常规内存中的异步缓冲区。缓冲区的大小以字节为单位定义(而非以事务数量为单位),并在 SmartEDB 高可用性运行时内的单独任务中进行处理。
以下代码片段展示了如何在 C/C++ 应用程序中初始化异步缓冲区:
/****************************************************
* Asynchronous commit thread
* It sends transaction data to replicas using the async_databuf
****************************************************/
void AsyncCommit( sample_task_t * descriptor )
{
/* wait for async commit event and output the portion of data to the stream */
while (mco_HA_async_send_data_to_replicas(descriptor->db_connection) ==
MCO_S_OK)
sample_sleep(1);
}
/****************************************************
/* Snippet from the master main that initializes async replication */
/****************************************************
mco_HA_master_params_init( &MasterParams );
MasterParams.mode_flags = MCO_MASTER_MODE | MCO_HAMODE_ASYNCH;
/* assign the device as an asynchronous buffer */
MasterParams.async_databuf.assignment = MCO_MEMORY_ASSIGN_HA_ASYNC_BUF;
/* set the device size */
MasterParams.async_databuf.size = ASYNC_DATABUF_SIZE;
if ( runtime_info.mco_shm_supported )
{
/* set the device as a shared named memory device */
MasterParams.async_databuf.type = MCO_MEMORY_NAMED;
/* set memory name */
sprintf( MasterParams.async_databuf.dev.named.name, "%s-ha", db_name);
MasterParams.async_databuf.dev.named.flags = 0; /* zero flags */
/* set mapping address or zero it out */
MasterParams.async_databuf.dev.named.hint = 0;
}
else
{
/* set a conventional memory device */
MasterParams.async_databuf.type = MCO_MEMORY_CONV;
MasterParams.async_databuf.dev.conv.ptr = (void*)malloc(ASYNC_DATABUF_SIZE);
}
mco_HA_set_master_params(db, &MasterParams); /* set MASTER mode */
/* start the ListenToReplicas thread*/
sample_start_connected_task(&listen_task, ListenToReplicas, db_name, &ha );
/* start the AsyncCommit thread*/
sample_start_connected_task(&async_commit_task, AsyncCommit, db_name, 0 );
一个类似的 C# 实现看起来会像下面这样:
// Asynchronous commit thread that sends transaction data to replicas,
// using async databuf
public void Replicate()
{
MasterConnection con = new MasterConnection(db);
while (con.AsyncSendDataToReplicas())
{
Thread.Sleep(REPLICATION_PERIOD);
}
con.Disconnect();
}
Master()
{
//****************************************************
// Snippet from the master main that initializes async replication
//****************************************************
// set HA mode
MasterConnection.Parameters MParams = new
MasterConnection.Parameters(
MasterConnection.MCO_HAMODE_ASYNCH );
MasterParams.AsyncBuf = new
Database.PrivateMemoryDevice( Database.Device.Kind.AsyncBuffer,
ASYNC_BUF_SIZE );
con.SetReplicationMode( MParams );
MParams.listening = true;
// start listen and async. commit threads
Thread listenThread = new Thread(new ThreadStart(Listen));
Thread replicateThread = new Thread(new ThreadStart(Replicate));
listenThread.Start();
replicateThread.Start();
与同步复制一样,在主应用程序或副本应用程序中均无需额外的复制逻辑;所有复制操作均由 SmartEDB 高可用性运行时内部管理。

复制事件通知
无论使用同步复制还是异步复制,副本应用程序实例都可以配置为接收各种同步和复制事件的通知。可能的通知事件定义如下:
- MCO_REPL_NOTIFY_CONNECTED:副本成功连接。
- MCO_REPL_NOTIFY_CONNECT_FAILED:副本连接失败。
- MCO_REPL_NOTIFY_DB_EQUAL:数据库相同,无需加载。
- MCO_REPL_NOTIFY_DB_LOAD_BEGIN:开始加载数据库。
- MCO_REPL_NOTIFY_DB_LOAD_FAILED:加载数据库失败;通知回调中的 param1 是 MCO_RET 返回代码。
- MCO_REPL_NOTIFY_DB_LOAD_OK:数据库加载成功;通知回调中的 param1 是 MCO_E_HA_REPLICA_STOP_REASON 代码。
- MCO_REPL_NOTIFY_DB_CREATION_FAILED:数据库创建失败;通知回调中的 param1 是 MCO_RET 返回代码。
- MCO_REPL_NOTIFY_COMMIT_FAILED:事务提交失败;通知回调中的 param1 是 MCO_RET 返回代码。
- MCO_REPL_NOTIFY_REPLICA_STOPPED:复制停止。
- MCO_REPL_NOTIFY_HOTSYNC:热同步开始。
- MCO_REPL_NOTIFY_EOHOTSYNC:热同步完成。
- MCO_REPL_NOTIFY_STATEFUL_SYNC:有状态同步开始。
- MCO_REPL_NOTIFY_STATEFUL_SYNC_END:有状态同步完成。
- MCO_REPL_NOTIFY_MASTER_DB_EXTENDED:主服务器扩展了数据库内存。
在 C/C++ 复制应用程序中,通过在传递给 mco_HA_attach_master() 的 mco_HA_replica_params_t 结构中的 mode_flags 元素中设置 MCO_HAMODE_REPLICA_NOTIFICATION 位,并在 notifying_callback 元素中设置事件处理程序的函数地址来启用复制事件通知。在 C# 和 Java 应用程序中,模式标志和回调是在传递给方法 ReplicaConnection.AttachMaster() 的 ReplicaConnection.Parameters 中指定的。