高可用性示例
SmartEDB 高可用性软件包包含演示基本高可用性功能的示例应用程序。除 haswitch 外的所有子目录都包含 master 和 replica 两个子目录,分别包含每个示例的两部分的项目文件。
高可用(HA)应用程序可以在多个通道上进行通信,因此主应用程序的命令行参数是采用 <通道>:<端口>
形式的连接字符串。例如:
ha_sample-master :tcp:20000
使用端口 20000 通过 TCP 通信通道启动主应用程序。副本应用程序以 <通道>:<主机名>:<端口>
的形式指定连接字符串。因此,连接到上述主应用程序的副本应用程序将使用如下命令行:
ha_sample-replica :tcp:127.0.0.1:20000
如果未指定任何命令行参数,则在端口 10000 上使用 TCP 通信通道。在除 hamultichan 之外的所有示例中,主节点都不接受任何命令行参数。因此,主节点始终使用 TCP 通道并在端口 10000 上监听(hacascade 除外)。由于仅配置了 TCP 通道,因此副本可以省略连接字符串中的 :tcp
部分。例如,启动示例副本的命令可以缩短为:
ha_sample-replica 127.0.0.1:20000
请使用以下链接查看以下子目录中各个示例的描述和具体说明:
基本功能
此示例展示了基本功能。
主应用程序创建数据库,然后等待副本的连接请求。副本连接后,主应用程序在数据库中创建几个对象。副本应用程序创建主数据库的副本,将其与主数据库同步,然后从主应用程序接收提交数据并执行复制。副本使用通知机制报告其当前状态。
在控制台窗口中运行:
\target\bin\hasimple_master
然后运行一个副本应用程序:
\target\bin\hasimple_replica
二进制转换
此示例展示了二进制模式演变功能。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本的连接请求时创建和删除对象。副本应用程序创建主数据库的副本,将其与主数据库同步,然后从主应用程序接收提交数据,并以异步模式执行复制。主应用程序和副本应用程序的数据库模式不同。高可用性子系统会进行必要的数据转换(二进制转换)。
请注意,库 mcoha
必须配置为 MCO_CFG_BINARY_SCHEMA_EVOLUTION
才能运行此示例。
在控制台窗口中运行:
\target\bin\habinev_master
然后运行副本应用程序:
\target\bin\habinev_replica
级联复制
此示例演示了如何在其中使用级联复制。
主应用程序创建并填充数据库,然后进入一个循环,在等待来自副本的连接请求时创建和删除对象。hacascade-rplmst 应用程序连接到“主”应用程序并与其数据库同步。同时,hacascade-rplmst 作为主应用程序运行,即在 20000 端口等待来自其他副本的连接。
请注意,“主”应用程序不允许副本执行写入事务。
在控制台窗口中运行:
\target\bin\hacascade_master
然后运行一个或多个副本应用程序:
\target\bin\hacascade_rplmst
然后运行一个或多个副本应用程序,这些应用程序连接到 rplmst 并与它的数据库进行同步:
\target\bin\hacascade_replica
请注意,来自 hacascade_master 的数据库更新会先传至 hacascade_rplmst,然后再传至二级的 hacascade_replica 应用程序。
异步模式
此示例展示了异步模式。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本应用程序的连接请求时创建和删除对象。副本应用程序创建主数据库的副本,并与之同步。然后从主数据库接收提交的数据,并以异步模式执行复制操作。
请注意,库 mcoha
必须配置为 MCO_CFG_HA_ASYNC_REPLICATION
才能运行此示例。
在控制台窗口中运行:
\target\bin\haasync_master
然后运行一个或多个副本应用程序:
\target\bin\haasync_replica
即使主应用程序以异步模式运行,也可以在同步模式下运行副本应用程序。要实现这一点,必须在副本中设置 MCO_HAMODE_FORCE_SYNC
标志。这在 haasync_rplsync 中有演示:
同步和异步事件
此示例演示了同步和异步事件。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本的连接请求时创建和删除对象。副本应用程序创建主数据库的副本,将其与主数据库同步,然后从主应用程序接收提交数据并执行复制。在从主应用程序接收提交数据时,运行时会在副本端生成同步和异步事件。
要运行示例,首先必须启动“master”应用程序。
在控制台窗口中运行:
\target\bin\haevents_master
然后运行一个副本应用程序:
\target\bin\haevents_replica
扩展内存
此示例演示了如何在数据库中扩展内存。
主应用程序创建数据库,然后进入一个循环,插入对象,并在间隔时间扩展数据库内存。副本应用程序在主应用程序扩展数据库时接收通知,并报告新的数据库大小。
要运行示例,首先必须启动“master”应用程序。
在控制台窗口中运行:
\target\bin\haextend_master
然后运行一个副本应用程序:
\target\bin\haextend_replica
筛选器
此示例应用程序演示了在副本端和主端使用部分复制筛选器。
模式中的关键字 local 表示哪些类受部分复制的影响。例如,请考虑以下模式定义。
对于主数据库:
#define uint4 unsigned<4>
declare database filtermstdb;
declare auto_oid [2000];
class T1
{
uint4 key;
unique tree<key> tkey;
};
class T2
{
uint4 key;
unique tree<key> tkey;
};
class T3
{
uint4 key;
unique tree<key> tkey;
};
local class T4
{
uint4 key;
unique tree<key> tkey;
};
对于副本数据库:
#define uint4 unsigned<4>
declare database filterrpldb;
declare auto_oid [2000];
local class T1
{
uint4 key;
unique tree<key> tkey;
};
class T2
{
uint4 key;
unique tree<key> tkey;
};
class T3
{
uint4 key;
unique tree<key> tkey;
};
class T4
{
uint4 key;
unique tree<key> tkey;
};
来自主数据库的本地类对象(T4)不会复制到副本节点;从主数据库接收到的副本数据库中的本地类对象(T1)的内容不会写入数据库。主数据库和副本数据库上的本地类可以不同,并且无需启用二进制演化即可强制执行部分复制。
主应用程序创建并填充数据库,然后继续创建和删除对象。主应用程序仅向副本发送非本地对象。副本应用程序创建数据库,与主数据库同步,然后从主应用程序接收事务数据。副本仅接收非本地对象。
在控制台窗口中运行:
\target\bin\hafilter_master
然后运行一个副本应用程序:
\target\bin\hafilter_replica
强制终止
此示例演示了终止功能。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本应用程序的连接请求时创建、更新和删除对象。副本应用程序创建主数据库的副本,并将其与主数据库同步。同步完成后,副本终止主应用程序并停止运行。
在控制台窗口中运行:
\target\bin\haforce_master
然后运行一个副本应用程序:
\target\bin\haforce_replica
热同步
此示例演示了热同步功能。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本应用程序的连接请求时创建和删除对象。副本应用程序创建主数据库的副本,使用增量复制与主数据库同步,然后同时从主应用程序接收提交的数据。
请注意,库 mcoha
必须配置为 MCO_CFG_HA_INCREMENTAL_REPLICATION
才能运行此示例。
在控制台窗口中运行:
\target\bin\hahotsync_master
然后运行一个副本应用程序:
\target\bin\hahotsync_replica
多播模式
此示例演示了多播模式。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本应用程序的连接请求时创建和删除对象。副本应用程序创建主数据库的副本,将其与主数据库同步,然后从主应用程序接收提交数据,并以多播模式执行复制操作。
请注意,库 mcoha
必须配置为 MCO_CFG_HA_MULTICAST_SUPPORT
才能运行此示例。
在控制台窗口中运行:
\target\bin\hamcast_master
然后运行一个副本应用程序:
\target\bin\hamcast_replica
多通道
此示例展示了如何在应用程序中使用多个 NW 通道实现。
主应用程序创建并填充数据库,然后进入一个循环,在等待来自副本的连接请求时创建和删除对象,这些请求既可以通过 TCP 通道也可以通过 UDP 通道发出。hamultichan_rpltcp 应用程序通过 TCP 通道连接到主数据库并与其同步。同样,hamultichan_rpludp 使用 UDP 通道连接到主数据库。
在控制台窗口中运行:
\target\bin\hamultichan_master
然后运行一个或多个 TCP 副本应用程序:
\target\bin\hamultichan_rpltcp
运行一个 UDP 副本应用程序:
\target\bin\hamultichan_rpludp
通知
此示例展示了在副本端使用通知的情况。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本的连接请求时创建和删除对象。副本应用程序创建主数据库的副本,将其与主数据库同步,然后从主应用程序接收提交数据并执行复制。副本使用通知机制报告其当前状态。
在控制台窗口中运行:
\target\bin\hanotify_master
然后运行一个副本应用程序:
\target\bin\hanotify_replica
性能测试
此基准测试提供不同高可用性模式下创建、更新和删除操作的一些性能统计数据。
主应用程序创建数据库,然后创建、更新和删除对象(以展示未附加副本时的性能),然后等待连接请求。在副本附加后,它重复创建 - 更新 - 删除的循环,以展示具有复制功能的操作性能。
只读操作(例如搜索或获取字段值)本质上是“本地”操作,因此未进行测量。副本还测量同步时间。
主程序具有以下命令行选项:
- -a N - 使用异步模式,异步缓冲区大小为 N 千字节
- -h - 使用热同步
- -m - 使用多播
- -w N - 使用大小为 N 的事务窗口
- -s - 使用共享提交模式 - 仅适用于共享内存配置
- -n N - 每个事务执行N个操作(默认情况下N = 1)
该副本具有以下命令行选项:
- -m - 使用多播(必须与 haperf_master 的设置相同)
<connection_string>
,主实例的地址,默认为 127.0.0.1:10000 。
在控制台窗口中运行:
\target\bin\haperf_master
然后运行一个副本应用程序:
\target\bin\haperf_replica
共享提交模式
此示例演示了共享提交模式。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本应用程序的连接请求时创建和删除对象。一旦启动了“主主应用程序”,就会启动一个“次主应用程序”。(请注意,此示例只需要一个“次主应用程序”,否则数据库中的对象索引会发生冲突)。次主应用程序运行一个循环,创建、更新和删除对象。副本应用程序创建主数据库的副本,将其与主数据库同步,然后从主应用程序接收提交数据并执行复制。
请注意,库 mcolib
与mcoha
必须配置为 MCO_CFG_MULTIPROCESS_SHM_SUPPORT
才能运行此示例。
在控制台窗口中运行:
\target\bin\hashared_master
然后运行“辅助主程序”:
\target\bin\hashared_master
然后运行一个或多个副本应用程序:
\target\bin\hashared_replica
状态复制
此示例展示了有状态复制。
在有状态复制中,当副本连接时,主应用程序会获悉副本数据库的状态。由于系统故障可能导致正在处理事务的副本被丢弃,因此该副本数据库将无法与主数据库同步。为解决此问题,主应用程序可以请求高可用性运行时维护一个事务缓冲区,然后在副本重新连接时重放这些事务以同步副本数据库。
主应用程序声明一个事务缓冲区以及分离副本后的“附加事务”数量(请注意,此数量必须小于事务缓冲区长度)。然后,主应用程序创建并填充数据库,并进入一个循环,在等待副本的连接请求时创建和删除对象。
在达到指定计数后,主节点会将所有副本分离。
在控制台窗口中运行:
\target\bin\hastateful_master
在等待副本重新连接期间,主节点会提交额外的事务;然后报告事务数量和副本数量。
然后运行一个副本应用程序:
\target\bin\hastateful_replica
副本应用程序会两次调用 attach_master() 函数,因此在主服务器断开连接后,会自动重新连接。
在第二次调用 attach_master() 函数时,会加载主数据库的最新副本,并从主服务器接收错过的事务的提交数据。
主从切换
此示例演示了如何在主应用程序和副本应用程序之间进行切换。
在控制台窗口中运行:
\target\bin\haswitch
该应用程序尝试连接到现有的主数据库。如果尝试失败,它将切换到主模式,创建并填充数据库,然后进入一个循环,创建和删除对象。
然后运行一个副本应用程序:
\target\bin\hastateful_replica
此实例连接到第一个应用程序实例。要交换主实例和副本实例的角色,请在第一个或第二个控制台窗口中按 <Enter>
键。要停止应用程序,请输入“q <Enter>
”。
事务窗口
此示例展示了事务窗口功能。
事务窗口允许设置事务数据包的大小。副本仅对每个事务数据包回复一次。尚未确认的事务在主节点侧保存。
主应用程序创建并填充数据库,然后进入一个循环,在等待副本的连接请求时创建、更新和删除对象。主应用程序将事务窗口大小从 1 切换到 1000,以展示性能提升。
副本应用程序会创建主数据库的副本,将其与主数据库同步,然后从主数据库接收提交的数据并执行复制操作。
在控制台窗口中运行:
\target\bin\hawindow_master
然后运行一个副本应用程序:
\target\bin\hawindow_replica
取消
此示例演示了取消功能。
副本创建一个取消套接字,并启动一个取消线程,然后创建主数据库的副本,将其与主数据库同步,接着从主数据库接收提交数据并执行复制。10 秒后,副本调用 mco_HA_cancel() 函数来终止复制。
在控制台窗口中运行:
\target\bin\hacancel_master
然后运行副本应用程序:
\target\bin\hacancel_replica