集群模块(Cluster)
概述
SmartEDB 集群是基于 SmartEDB 高可用性技术构建的。不过,尽管 SmartEDB 高可用性在主从副本场景中提供了同步/复制支持,但 SmartEDB 集群为管理“对等”节点的对等网络提供了一个简单的接口。
当有新节点连接到集群时,它将以热模式进行同步,即新连接的节点从其他节点接收同步数据和事务。在新节点启动同步期间,当前已连接的集群节点仍可执行读写事务。(新节点在连接时选择已完成事务数量最多的活动节点进行同步。如果所有集群节点的已完成事务数量相同,则从活动集群节点中随机选择同步器节点。)
SmartEDB 集群是一种分布式数据库实现。应用程序的实例可以在网络中的不同节点上运行,并且所有数据库修改都会在所有实例之间自动复制。例如,以下图表展示了一个 5 节点集群。

集群中的所有节点都持有相同的数据库副本。集群中的所有节点都是平等的,即 SmartEDB 集群没有专用的主节点或副本节点(与 SmartEDB 高可用性不同)。每个节点都可以执行读写和只读操作。只读事务是本地的,即它们不需要网络操作,并且运行速度与独立数据库一样快。
操作原理
为了更新数据库,我们使用两阶段提交协议。所有操作都是本地进行的,直到事务最终提交之前不会涉及网络通信。以下是更新过程的具体步骤:
在集群节点(称为发起者)上运行的线程会调用 C/C++ 函数 mco_trans_commit() 或 Java/C# 的 ClusterConnection.CommitTransaction() 方法,以处理 READ_WRITE 事务。
内部实现中,SmartEDB 集群会在发起者的数据库副本上调用 commit_phase1()。如果 commit_phase1() 失败,事务将被本地中止并回滚。(此过程中不涉及任何网络通信。)
如果 commit_phase1() 成功,事务会被序列化,并发送到集群中的其他节点(称为参与者)。
每个参与者节点会开启一个事务,应用来自发起者的序列化数据,并执行 commit_phase1()。
这些操作的结果(成功或失败)会被发送回发起者。
发起者会收集所有参与者的回复,并根据结果决定如何完成全局事务:
- 如果所有参与者都报告成功,发起者将通过 commit_phase2() 完成本地事务,并向参与者发送确认消息。
- 如果至少有一个参与者回复失败,发起者将回滚事务并向参与者发送拒绝消息。
- 根据收到的消息类型(确认或拒绝),参与者会执行 commit_phase2() 或 rollback() 来完成事务。
最终,数据库更改要么应用于所有节点,要么全部回滚。由于悲观锁定在网络环境中实现时非常昂贵且容易出现不可预测的故障点,SmartEDB 集群采用了更高效的 MVCC 事务管理器。
此外,SmartEDB 集群通过超时和保持活动消息自动控制节点的可用性。如果多个节点变得不可用(即没有法定人数),读写事务的处理可能会暂停,以确保系统的稳定性和一致性。
使用参与集群的数据库的 C/C++ 应用程序的模式必须包含 auto_oid 声明。
术语
“节点地址”这一术语指的是包含节点传输层相关地址的字符字符串。例如,对于 TCP/IP 传输,节点地址可以是 <hostname>:<port>
或 <IP-address>:<port>
。
节点仲裁等级这一术语指的是一个整数值,用于确定是否有足够相互连接的节点处于在线状态以继续工作。如果节点 A 与其所有相连节点的 qrank 值之和大于集群中所有节点(在线和离线)的 qrank 值之和的一半,那么节点 A(以及其他在线节点)将继续工作。
考虑两个节点仲裁等级示例场景是有帮助的:
所有节点的 qrank 值都相同:在这种情况下,如果超过半数的节点处于活动状态并且相互连接,集群就能正常工作。如果集群恰好被均分为两半,集群将无法工作。
一个节点(称为主节点)的 qrank 值为 1,所有其他节点的 qrank 值为 0:在这种情况下,与主节点相连的节点集群将始终运行。如果主节点出现故障,集群将停止运行。
在任何情况下,如果集群节点分裂成几个不相连的部分,写入操作仅允许在一个部分中进行。
集群的应用程序
所有 SmartEDB 集群应用程序都必须执行一组简单的操作:启动集群运行时,初始化集群参数,创建集群数据库,创建一个“监听器”线程并监听连接节点,然后关闭集群。 集群应用程序的 API 与所使用的编程语言相关。请使用以下链接查看您开发环境的详细说明和示例:
开发语言 | 说明 |
---|---|
C / C++ | C / C++ 语言实现集群应用程序的一般说明 |
Java | Java 语言实现集群应用程序的一般说明 |
C# | C# 语言实现集群应用程序的一般说明 |
Python | Python 语言实现集群应用程序的一般说明 |
集群实现细节
BSE(业务服务引擎)、数据库快照、事务日志记录和数据库分片的实现细节。
使用 MPI 通道与 SmartEDB 集群
在集群应用程序中使用 MPI 通道的说明。
OpenSSL 与 SmartEDB 集群的集成
为便于安全通信、授权和验证,SmartEDB 集群传输层安全机制采用安全套接层(TLS/SSL)来实现。OpenSSL 被选为最普及且广受认可的 TLS 协议实现方式之一。
要在应用程序中使用 OpenSSL 网络功能,用户系统必须安装有本地的 OpenSSL。编译器必须能够访问 OpenSSL 的头文件和库文件。
有关实现 OpenSSL 安全性的详细信息,请参阅“网络通信”页面。
集群 SDK 示例
请使用以下链接查看感兴趣的 API 的编程示例:
开发语言 | 说明 |
---|---|
C | 集群 C 语言示例 |
Java | 集群 Java 语言示例 |
C# | 集群 C# 语言示例 |
Python | 集群 Python 语言示例 |