高可用
DolphinDB 提供多层次的高可用机制,确保在不同层面的故障场景下系统仍能持续运行。高可用能力覆盖数据存储、集群管理(元数据)、流式计算(流表) 和客户端连接。DolphinDB 分布式架构提供数据、元数据和客户端的高可用方案,即使数据库节点发生故障,数据库仍然可以正常运作,保证业务不会中断。
数据高可用
在分布式环境下,为保证数据读写服务的高可用,DolphinDB 会把同一个分区的数据同时写入到集群中的多个不同的节点上。同一个分区在不同节点上的数据拷贝称为副本(Replica)。DolphinDB 集群支持处理千万级以上的分区数据,为了保证数据的强一致性和事务 ACID 特性,它采用了轻量、高效且可行的两阶段提交协议(Two-phase Commit)来管理数据副本之间的一致性。这种方式确保了即使某个节点上的数据出现损坏,仍然可以通过访问其他节点上的副本数据来持续提供数据服务,从而保证了服务的不中断性。同时,针对数据损坏或其它原因导致的副本数据不一致的情况,系统会通过 recovery 机制将数据恢复到一致状态。
在生产环境中,一般把副本个数设置为大于2,可以保证数据的高可用。
集群高可用(controller 高可用)
DolphinDB 控制节点存储的元数据记录了分区分布的节点,版本信息等。在一个集群中可以部署多个控制节点,通过元数据冗余来保证元数据服务不中断。DolphinDB 采用 Raft 协议保证控制节点的高可用性。一个集群中的所有控制节点组成一个 Raft 组,一个 Raft 组中只有一个 Leader,其他都是 Follower。只有 Leader 与数据节点进行交互,当它收到接收数据节点的请求后,先写入本地日志文件中,并向集群中的每一个 Follower 发送同步日志的请求,当日志同步到大多数节点后告诉 Follower 提交日志。Follower 接收并持久化 Leader 同步的日志,在 Leader 告知提交后,提交日志,这样就能保证 Leader 和 Follower上元数据的强一致性。如果当前 Leader 宕机,系统会立即选举出新的 Leader 来提供元数据服务。Raft 组能够容忍小于半数的控制节点宕机,只要宕机的控制节点少于半数,集群仍然可以提供服务,因此可以保证控制节点上元数据的一致性。例如包含三个控制节点的集群可以容忍一个控制节点出现故障,包含五个控制节点的集群可以容忍两个控制节点出现故障。要设置元数据高可用,集群中控制节点的数量至少为3个,同时需要设置数据高可用,即副本数必须大于1。
流表高可用(Raft Learner)
针对流式计算场景,DolphinDB 提供基于 Raft Learner 的流表高可用能力(需预先配置多集群管理)。
Raft Learner 是 Raft 共识算法的一种特殊成员角色,用于从 Raft 主集群同步日志,但不参与投票和主节点选举。借助这一机制,DolphinDB 可以在不同集群间建立流表数据的实时复制,实现:
- 跨集群容灾:当主集群不可用时,远端 Learner 仍保留完整数据,可用于恢复或容灾。
- 读写隔离:Learner 节点可用于承载只读流式计算或下游消费,降低对主集群的影响。
- 高性能:写入路径保持在单集群内完成,不受跨地域网络延迟影响。
传统 Raft 限定一个 Raft 组运行在单个集群内部,所有 Voter 节点(Leader 与 Follower)需频繁通信。为支持跨集群高可用,DolphinDB 对 Raft 机制做了如下扩展:
- 仅 Learner 节点允许跨集群部署;
- Voter 节点(Leader 与 Follower)必须在同一集群内,不允许跨集群分布。
这种机制在保证数据一致性和性能的前提下,拓展了高可用范围,使 DolphinDB 能在流式计算场景下实现跨集群数据保护与容灾能力。
客户端高可用
DolphinDB API 提供了强大的自动重连和切换机制,旨在确保与数据节点/计算节点的交互始终保持高可用性。使用 DolphinDB API 与 DolphinDB 的数据节点/计算节点进行交互时,如果连接的节点宕机,API 会尝试自动重新建立连接,若尝试重连失败,API 会自动连接到集群中其他可用的数据节点/计算节点,以保证客户端与服务器之间连接的稳定性。而且切换过程对用户来说是完全透明的,用户不会察觉到当前连接的节点已经发生了切换。