在raft中,当节点重新启动时,它会尝试重做所有日志条目以捕获状态。
根据上面的描述,我的问题是,在使用raft的系统中,有必要在实践中使ops幂等吗?
发布于 2018-01-07 16:07:57
在我的经验中,Raft、Paxos和friends用于实现distributed state machines和数据库(这是一个分布式状态机)。在此上下文中查看时,您真的、真的、真的希望条目是幂等的;否则,您的状态机迟早会偏离。非常希望条目是幂等的。
即使您使用的是无序队列-像rabbit mq或ActiveMQ--您也想要幂等性,因为它们的保证最多只能交付一次。
当然,没有什么能阻止你拥有非幂等项。除了,也许是设计审查。简而言之,我想不出有哪种方案能更好地为队列提供非幂等项。一个也没有。
发布于 2018-02-10 05:06:13
是的,它们需要是无能为力的和确定性的,因为在从设备上执行操作应该将从设备移动到与主机相同的状态。
此均值操作不能读取外部状态(挂钟时间、随机数生成器),而只能使用当前状态机值和来自日志条目的数据来决定下一个状态机值。
但是由于raft协议的设计,它提供了至多一次递送的语义,因此,一个操作不可能被多次执行或写入复制日志。您不需要像在只提供至少一次交付语义的的系统中那样检查此操作是否已经执行
发布于 2019-07-07 16:03:57
不,如果您使用分布式共识算法,如Paxos或Raft,则不要求日志条目是幂等的。围绕幂等运算设计系统有很多优点,但并不总是可以做到的。分布式共识算法非常适合于无法实现幂等的情况,因此您需要确保在每个副本上最多处理一次操作。此外,它们还允许您确保在每个副本上始终以完全相同的顺序处理操作。这些都是非常强大的属性,您需要执行一些相对昂贵的协调来确保它们有效,这就是为什么我们尽可能避免它们的原因。
分布式共识保证每个副本上的每个日志条目都是相同的,只要该日志条目已被大多数副本接受。每个复制副本必须仅已被大多数复制副本接受的日志条目,因为其他日志条目可能会在恢复期间更改。每个副本必须仔细跟踪它已经处理过的操作,以避免在恢复期间再次处理这些操作。这很容易做到,因为日志是完全有序的,因此每个副本都可以使用单个数字来跟踪它处理的操作,该数字表示最后处理的操作在日志中的位置。
事实上,看待分布式共识的另一种方式是,它是将幂等(和交换性)重新添加到可能不是幂等(或交换)的操作集合中的有效方法。因此,操作不需要是幂等的,因为您可以从分布式共识算法中获得所需的幂等。
https://stackoverflow.com/questions/48125293
复制相似问题