NebulaGraph 集群中主节点、分片和主分片的同步机制与 Raft 协议以及集群间同步机制相关,以下是详细介绍:
- Meta 主节点同步:NebulaGraph 的 meta 服务由多个 nebula - metad 进程构成 Raft 集群,其中一个为 leader,其余是 follower。leader 由多数派选举产生,只有 leader 能为客户端或其他组件提供服务。当 leader 接收数据更新请求(如创建或修改图空间、添加或删除分片等操作)后,会通过 Raft 协议将相关日志同步给 follower。follower 接收日志并应用,以此保证所有 meta 节点数据一致。若 leader 故障,follower 会重新选举新 leader,由于 Raft 协议保证了日志一致性,新 leader 上任后集群数据仍保持一致。
- Storage 主分片同步:NebulaGraph 将数据分成多个逻辑分片,每个分片通常有多个副本,基于 Raft 协议会选举出一个主分片(即 leader 副本),其余为从分片(follower 副本)。当客户端向 Storage 服务发送写请求时,请求会被路由到主分片所在节点。主分片处理写请求后,会将写操作日志通过 Raft 协议同步给从分片。从分片接收并应用日志,从而实现与主分片的数据一致。读请求则可由主分片或从分片处理,具体取决于集群配置和负载情况,这样既保证了数据一致性,又能通过多个副本分担读负载,提高查询性能。
- 集群间同步:NebulaGraph 支持主集群数据近实时复制到从集群,用于异地灾备或读写分离等场景。主集群中,任何写入图空间的数据会先发送到 Meta listener 或 Storage listener,listener 再将数据以预写日志(WAL)形式发送给 drainer,drainer 通过从集群的 Meta client 或 Storage client 将数据发送至从集群的对应分片,实现集群间数据同步。数据同步基本单位是图空间,且为异步方式。若从集群对应图空间已有数据,可能产生冲突,因此通常建议从集群图空间在同步前为空。