pentium3
(Pentium3)
1
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
raftstore的源码解读中提到:
在 PeerStorage 的 handle_raft_ready 方法中,会将收集到 Ready 中的 Raft 日志收集到一个 WriteBatch 中,最终在 RaftPoller 的 end 方法中批量写入磁盘。而 Ready 中收集到的确认过的 Raft 日志,会被 apply_router 发送到 apply 线程中,由 ApplyBatchSystem 来处理。
请问 RaftBatchSystem 涉及的IO操作是同步的吗?
意思是在RaftPoller::end()中完成一个batch的写盘操作之后 该线程才会开始处理下一个batch?
另外源码解读中提到,日志的分发也需要走raftstore。意思是replicate涉及的网络io也走raftstore吗?
pentium3
(Pentium3)
2
另外这里提到:
上层的写入请求会构造一个 PeerMsg::RaftCommand,里面包含写入的 Key-Value,并将 RaftCommand 通过 Router 发送到 raft 线程池,raft 线程将 Raft 日志写入到 Raft RocksDB 并同步给其他 Peer,当日志提交之后,apply 线程将数据写入 KV RocksDB,整体流程如下图所示:
请问raft线程指的就是raftstore吗?这里提到“同步给其他peer”的代码段在哪里呀?
linning
(Linning)
3
是的
是的
网络io 由额外的线程处理,不在 raftstore 的线程中处理,具体代码在 src/server/raft_client.rs
是的,raft线程指的就是raftstore
“同步给其他peer”的代码
- 底层的 raft-rs 库负责收集需要同步给其他 peer 的日志消息(MsgAppend),并包含在 Ready 中返回 raftstore
- raftstore 通过
poll_ctx.trans
(实际上就是上面提到的 RaftClient
) 发送消息
pentium3
(Pentium3)
4
感谢!
如果网络IO出现延迟导致replicate的过程变慢,会导致raftstore中的线程被阻塞吗?
网络io 由额外的线程处理,不在 raftstore 的线程中处理,具体代码在 src/server/raft_client.rs
这个指的是grpc线程吗?(gRPC poll) 另外这里的网络io也是同步的吗
谢谢啦
linning
(Linning)
5
不会的,raft peer 接收&处理消息都是异步的(这里的异步不是指 async/await, 而是处理逻辑的异步),replicate 的过程变慢会导致 raft log commit 变慢,但不会阻塞 raftstore 线程
在 release-4.0 中是grpc线程,在 matser 中是另外的线程
无论是 release-4.0 还是 matser 这里的网络 io 都是异步的