braft icon indicating copy to clipboard operation
braft copied to clipboard

有对线性一致性读的支持吗

Open Tachone opened this issue 4 years ago • 12 comments

ReadIndex或者LeaseRead

Tachone avatar Oct 25 '20 14:10 Tachone

配置文件里加上: --raft_enable_leader_lease=true 然后在每次 leader 读之前调用一次 is_leader_lease_valid 可以保证线性一致读

PFZheng avatar Nov 02 '20 09:11 PFZheng

配置文件里加上: --raft_enable_leader_lease=true 然后在每次 leader 读之前调用一次 is_leader_lease_valid 可以保证线性一致读

leader apply比较快,而follower apply慢,但某个点follower当选了leader,只依赖leader的判断这个时候不能直接读吧?

wangxun155423 avatar Nov 06 '20 03:11 wangxun155423

配置文件里加上: --raft_enable_leader_lease=true 然后在每次 leader 读之前调用一次 is_leader_lease_valid 可以保证线性一致读

leader apply比较快,而follower apply慢,但某个点follower当选了leader,只依赖leader的判断这个时候不能直接读吧?

braft里保证了这个事情。这个lease的有效时间是从on_leader_start开始的,也就是所有的已commit数据已经全部apply完了

PFZheng avatar Nov 06 '20 03:11 PFZheng

配置文件里加上: --raft_enable_leader_lease=true 然后在每次 leader 读之前调用一次 is_leader_lease_valid 可以保证线性一致读

leader apply比较快,而follower apply慢,但某个点follower当选了leader,只依赖leader的判断这个时候不能直接读吧?

braft里保证了这个事情。这个lease的有效时间是从on_leader_start开始的,也就是所有的已commit数据已经全部apply完了

但是似乎只能保证线性读,不能保证在一个node上读写是否并发是吧?对于写操作的话由于apply的时候是顺序的不会有并发问题。

rpbear88 avatar Nov 11 '20 08:11 rpbear88

配置文件里加上: --raft_enable_leader_lease=true 然后在每次 leader 读之前调用一次 is_leader_lease_valid 可以保证线性一致读

leader apply比较快,而follower apply慢,但某个点follower当选了leader,只依赖leader的判断这个时候不能直接读吧?

braft里保证了这个事情。这个lease的有效时间是从on_leader_start开始的,也就是所有的已commit数据已经全部apply完了

但是似乎只能保证线性读,不能保证在一个node上读写是否并发是吧?对于写操作的话由于apply的时候是顺序的不会有并发问题。

不知道你所指的是哪个case,可以举个例子吗?

PFZheng avatar Nov 11 '20 08:11 PFZheng

但是似乎只能保证线性读,不能保证在一个node上读写是否并发是吧?对于写操作的话由于apply的时候是顺序的不会有并发问题。

不知道你所指的是哪个case,可以举个例子吗?

感谢回复,我的意思是,开启了raft_enable_leader_lease之后,某次读操作和正在进行的写操作之间是无序执行的吧?这样对于数据结构来说要处理并发访问的问题,而如果只有写操作的话,由于写操作在进行apply的时候是串行进行的,并不需要考虑并发问题。

要是开启了raft_enable_leader_lease之后,可以提交一个请求,该请求只到各节点确认leader lease而不记录日志,但是确认之后依然可以由on_apply来通知调用者这次读是lease valid的就好了,这样整个node上不论读还是写都是串行执行的,不需要考虑并发问题。

rpbear88 avatar Nov 11 '20 08:11 rpbear88

但是似乎只能保证线性读,不能保证在一个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也是在这里执行的,可以满足你的这个需求

PFZheng avatar Nov 11 '20 09:11 PFZheng

这里其实和业务有关系,正常情况下,并发的没完成的写,读到新数据或者旧数据都是可以的,只需要保证不回退即可。

是的,这个业务倒是ok的,主要是不想让代码中为此维护一些互斥锁之类的。

至于你说的这个,有一个简单的实现方式,可以开放 fsmcaller 的execution queue接口出来,允许用户提交task进去,由于brpc的execution queue是串行的,on_apply也是在这里执行的,可以满足你的这个需求

OK,我觉得这个倒是一个不错的方案,可以看下改造难度,感谢。

rpbear88 avatar Nov 11 '20 09:11 rpbear88

有考虑支持ReadIndex来保证线性一致性读吗?考虑到节点时钟问题,lease read不是完全可靠

lkkey80 avatar Nov 23 '20 03:11 lkkey80

有考虑支持ReadIndex来保证线性一致性读吗?考虑到节点时钟问题,lease read不是完全可靠

目前没有这个计划,ReadIndex 的性能是相对较差的,一个粗糙的模拟是每次读之前append一条log,在log的回调里读。另外 lease 并没有依赖绝对时钟,节点上时间流逝速度接近的话问题不大(从心跳时刻开始的流逝速度)。

PFZheng avatar Nov 24 '20 05:11 PFZheng

有考虑支持ReadIndex来保证线性一致性读吗?考虑到节点时钟问题,lease read不是完全可靠

目前没有这个计划,ReadIndex 的性能是相对较差的,一个粗糙的模拟是每次读之前append一条log,在log的回调里读。另外 lease 并没有依赖绝对时钟,节点上时间流逝速度接近的话问题不大(从心跳时刻开始的流逝速度)。

@PFZheng 如果每次读都append log就代价太大了。lease主要还是怕时钟skew吧,有的机器快,有的机器慢,这样其实pre-vote+leadership expiration应该可以解决?

zhanglistar avatar Feb 15 '22 10:02 zhanglistar

有考虑支持ReadIndex来保证线性一致性读吗?考虑到节点时钟问题,lease read不是完全可靠

目前没有这个计划,ReadIndex 的性能是相对较差的,一个粗糙的模拟是每次读之前append一条log,在log的回调里读。另外 lease 并没有依赖绝对时钟,节点上时间流逝速度接近的话问题不大(从心跳时刻开始的流逝速度)。

@PFZheng 如果每次读都append log就代价太大了。lease主要还是怕时钟skew吧,有的机器快,有的机器慢,这样其实pre-vote+leadership expiration应该可以解决?

lease 看的是 lease 期间同机器上的相对时间,短时间的skew不会很大,这个已经考虑在内了

PFZheng avatar Feb 16 '22 10:02 PFZheng