FAQ
项目要求 C++17 还是 C++23?
Section titled “项目要求 C++17 还是 C++23?”构建配置为 C++17,以 CMakeLists.txt 为准。
单节点启动时是否需要填写 initial_peers?
Section titled “单节点启动时是否需要填写 initial_peers?”不用。单节点引导时留空即可,Raftor 会把本节点作为唯一投票节点启动。
多节点首次引导时 initial_peers 应该怎么填?
Section titled “多节点首次引导时 initial_peers 应该怎么填?”应填写完整初始成员列表,并且包含当前节点自己。不同节点第一次启动时看到的初始成员集合应保持一致。
ReadIndex() 为何不直接返回业务数据?
Section titled “ReadIndex() 为何不直接返回业务数据?”因为它的职责是确认当前读取是否满足线性一致性,而不是替代状态机的读取逻辑。实际数据仍应由应用层读取。
应优先使用 Raftor 还是 RawNode?
Section titled “应优先使用 Raftor 还是 RawNode?”默认优先使用 Raftor。只有在你必须自己掌控 Ready 持久化、消息发送和推进顺序时,才考虑直接使用 RawNode。
何时启用快照?
Section titled “何时启用快照?”只要日志会持续增长,就应规划快照策略。开发阶段可先手动触发;进入长期运行场景后,应配置自动快照阈值。
pre_vote 和 check_quorum 是否需要关闭?
Section titled “pre_vote 和 check_quorum 是否需要关闭?”通常不建议关闭。默认保持开启更符合大多数生产场景,也更有利于线性一致读和稳定选主。
应参考哪个示例?
Section titled “应参考哪个示例?”- 验证最小接入流程:
minimal_node - 参考完整应用结构:
kvstore
单节点测试是否必须打开网络端口?
Section titled “单节点测试是否必须打开网络端口?”不一定。可以设置 transport_kind = TransportKind::Noop,此时不会打开 socket,也不会连接远端 peer。该模式只适合单节点或测试。
如何更新节点地址?
Section titled “如何更新节点地址?”运行期地址变更应调用 UpdateNodeAddress(id, addr)。initial_peers 只在首次引导时生效,WAL 已初始化后重启会优先使用持久化地址簿。
什么时候启用 enable_entry_checksum?
Section titled “什么时候启用 enable_entry_checksum?”需要检测 entry 数据损坏时可以启用。默认关闭是为了兼容旧 WAL 和滚动升级。启用后如果发现 ChecksumMismatch,节点会停止并拒绝后续请求。