doc001

Results 124 comments of doc001

> > > 但是似乎只能保证线性读,不能保证在一个node上读写是否并发是吧?对于写操作的话由于apply的时候是顺序的不会有并发问题。 > > > > > > 不知道你所指的是哪个case,可以举个例子吗? > > 感谢回复,我的意思是,开启了raft_enable_leader_lease之后,某次读操作和正在进行的写操作之间是无序执行的吧?这样对于数据结构来说要处理并发访问的问题,而如果只有写操作的话,由于写操作在进行apply的时候是串行进行的,并不需要考虑并发问题。 > > 要是开启了raft_enable_leader_lease之后,可以提交一个请求,该请求只到各节点确认leader lease而不记录日志,但是确认之后依然可以由on_apply来通知调用者这次读是lease valid的就好了,这样整个node上不论读还是写都是串行执行的,不需要考虑并发问题。 这里其实和业务有关系,正常情况下,并发的没完成的写,读到新数据或者旧数据都是可以的,只需要保证不回退即可。 至于你说的这个,有一个简单的实现方式,可以开放 fsmcaller 的execution queue接口出来,允许用户提交task进去,由于brpc的execution queue是串行的,on_apply也是在这里执行的,可以满足你的这个需求

> 有考虑支持ReadIndex来保证线性一致性读吗?考虑到节点时钟问题,lease read不是完全可靠 目前没有这个计划,ReadIndex 的性能是相对较差的,一个粗糙的模拟是每次读之前append一条log,在log的回调里读。另外 lease 并没有依赖绝对时钟,节点上时间流逝速度接近的话问题不大(从心跳时刻开始的流逝速度)。

> > > 有考虑支持ReadIndex来保证线性一致性读吗?考虑到节点时钟问题,lease read不是完全可靠 > > > > > > 目前没有这个计划,ReadIndex 的性能是相对较差的,一个粗糙的模拟是每次读之前append一条log,在log的回调里读。另外 lease 并没有依赖绝对时钟,节点上时间流逝速度接近的话问题不大(从心跳时刻开始的流逝速度)。 > > @PFZheng 如果每次读都append log就代价太大了。lease主要还是怕时钟skew吧,有的机器快,有的机器慢,这样其实pre-vote+leadership expiration应该可以解决? lease 看的是 lease 期间同机器上的相对时间,短时间的skew不会很大,这个已经考虑在内了

一般情况下,选举时间需要远大于 RTT,不然选注和心跳都难以维持。 不过这个问题里“C的选举超时时间一段时间内小于A B”这个是什么原因? PS:可以看看是不是把C的选举超时时间调大

当然,这里如果能支持广义上的优先级(在多个节点里区分出作为主的高优、低优先级)会更好一些

> > 一般情况下,选举时间需要远大于 RTT,不然选注和心跳都难以维持。 > > 不过这个问题里“C的选举超时时间一段时间内小于A B”这个是什么原因? > > PS:可以看看是不是把C的选举超时时间调大 > > 这里是为了测试而故意设定的,发现这种情况下一直无法稳定选举,虽然A B一直是正常的。 不知道你们测试这种case的用意是什么,但是按照描述,这里的行为符合预期。因为C的超时时间短,所以它天然会比其它节点更快触发选注

> [05/23/21 05:16:20-346 +08:00][9-31][info][log.cpp:26][OnLogMessage] [raft_log] Replicator=3315714752521 is going to quit [05/23/21 05:16:22-353 +08:00][9-31][info][log.cpp:26][OnLogMessage] [raft_log] Replicator=6605659701249 is going to quit, group config_group [05/23/21 05:16:22-354 +08:00][9-31][info][log.cpp:26][OnLogMessage] [raft_log] Replicator=6605659701249 is going to quit...

“对于定期导入数据的场景,当长时间没有数据写入的情况,本地的log可能为空”这个如何理解?

You should use add_peer/remove_peer/change_peer interfaces to change the configuration.

“_applied_id=1, last_log_kept=0” 这个意味着要干掉所有的日志,看起来像是脑裂的 case。这个问题需要提供几个 sync 参数和各节点详细的日志才能判断。