《向量数据库》第五章 实现分布式向量数据库。
总览四部分,集群数据管理、集群流量管理、集群异常管理、分片。分布式数据库用 CAP 理论约束,Consistency, Availability, Partition tolerance。强一致性,所有副本成功写入之后,系统才写入操作成功。
一致性,数据副本在同一时刻保持一致;
可用性,持续提供服务的能力;
分区容错性,系统能在网络分区情况下,继续运行。
1.集群数据管理
数据管理的两个关键点:一是节点之间的数据复制。二是角色选择。例如,少部分节点拥有写入权限,其他节点只有接收权限。常用一致性,包括 Paxos, Raft, Gossip。
Paxos 协议,强一致,实现复杂,用消息传递和投票机制。
Raft 协议,引入主节点选举,基于日志的复制和安全性。
Gossip 协议,去中心化,不需要集中式控制节点。
NuRaft 基于 C++ 的轻量级的 Raft 版本。一是自动主节点选举,调节多节点角色。二是基于日志完成多节点之间的复制。
NuRaft 新特点,预投票、主节点选举、主节点过期、逻辑快照、SSL。使用 tcp/ip 协议。
NuRaft 对外接口:append_entries, add_srv, remove_srv。
NuRaft 内部接口:日志存储 API,状态机 API(状态转换的重要作用)。
建立主从关系,state_mgr 管理节点状态信息,state_machine 抽象类。
注意,如果是两个抽象类的实例,监听两个不同端口,跑在同一台机器上。
2.集群流量管理
方案,在 VdbServer 前设置代理服务器 ProxyServer,隐藏主从节点细节,代理建立联结,感知主从节点身份变化。
元数据管理,要有一定容灾能力。
ProxyServer,两个线程同时访问内存数据,会产生线程之间的数据竞争,导致程序异常退出。更好的方案,用交换数组和两个原子索引。这里作者没有展开,本站认为,根据并发控制原理,认为两个进程同时访问临界资源时候,有个处理的数组(坑位),还有个 Stand by 数组。两个数组的时钟可以异步。
自动剔除异常节点。
3.集群异常管理
节点之间数据复制后,通过代理服务器统一入口。发现新的主节点时候,自动选主节点,投票决定。更新节点。发现异常节点,开始计数,计数到阈值,则状态设置成【失败状态】。ProxyServer 会自动删除异常节点,需要人工补入新的节点。
4.分片
允许主节点进行执行写操作,水平扩展能力是个重要指标。每个分片,被分到两个不同的节点,这样一个节点故障之后,另一个节点可以使用。
ProxyServer 定期更新相关分片信息,频率不高情况下,用异步定时器,实现代码。
请求转发步骤。(1)提取分片键值;(2)分片键值不存在,通过广播转发;分片键值存在,计算请求得到分片 ID;(3)通过分片ID 选择满足条件的目标节点;(4)将请求转发到实际节点,返回结果。
广播的情况注意,按照 dist 排序选择前 K 个。

第五章小结。主从复制怎么实现?元数据模块能力是什么?代理模块作用是什么?分片策略是什么?