通过P-SMR看State Machine Replication

在一个复制系统中,为了保持一致性,各个replicated server是串行执行,这样性能上就会比只有一台server的系统慢,因为只有一台server可以进行并行处理。如果在复制系统中各个server也能进行并行处理的话, 这将是很大的进步。

但是如果各个线程之间没有共享变量的话,在复制系统的每个server上进行并行处理也是可行的,实际上以前很多复制系统并行处理都是基于这一点去做的。

P-SMR也是要根据命令之间的依赖关系判断什么情况下可以并行,什么情况下是串行。

我们需要将服务程序抽象成一个状态机,一个Mealy状态机。要构建一个State-Machine Replication系统,其中必不可少的模块就是proxy,client的proxy和server的proxy。比如当请求到达server时,需要server proxy去评估是否能并行执行,以及如何去并行,而且也是通过proxy在replicas之间和client-server之间传递信息。如同RPC(远程过程调用)一样。再例如,对于一个命令,多个server会向client发送多个相同的response,但是经过server
proxy,发给client的只会是一个response。

先来了解一下什么样的两个命令是相互依赖(dependent)的:他们访问(读或写)一个公共变量v,并且至少其中一个命令改变了v的值。如一个命令是读v,另一个是更新v。但这样的话不论是只有一个server的系统还是replication系统,都不能并行执行,只能按照total order来依次处理命令。所以如果命令间是dependent的,replication只能采取串行执行。这样越说越不对劲了,这样的话replication系统要解决什么问题呢?是让independent的命令并行执行,还是让dependent的命令并行执行?下面来寻找答案。

答案是independent。你可能会问:这有什么难的?实际上我们忽略了一个问题,除了命令的执行可以并行化,如何也让命令并行的传递(delivery),此时多个命令还是串行的在传递,所以这应该是P-SMR要去挑战的地方,做到全部并行化,而非半并行化。

所以P-SMR意思是 parallel state-machine replication,能做到命令执行和传递都并行化的一个方法。对于一个replica除了能做到并行执行命令外,也在multicast这个环节做到并行化。到底multicast这个地方并行化的难度在哪里呢?

这里引入P-SMR里的一个概念C-Dep(command dependencies),一般来说如果两条命令的参数是同一个对象,而且是update操作,则可以预判这两条命令相互依赖。在client proxy里有个函数叫 Command-to-Group (C-G) ,它会在client的命令和该命令要去的地方建立起映射,告诉哪个命令该去哪个地方。下面是这个过程的算法:

让我们设想一下,在这个C-G函数中,需要做到:

假设这时有4个命令亟待执行。

1)C-G函数要能判断这4个命令之间的C-Dep

2)假如4个命令之间是independent的,C-G对这4个命令的目的地的映射要达到最大的并行化的目的

3)假如4个命令之间是dependent,C-G要让这4个命令实现串行处理。

如何做到 2) 呢?C-G要将这4个命令分配给不同的组groups。

这里再解释一下P-SMR里的groups。在replication系统中假设有5台server(A, B, C, D, E),每台server配置一样,一台server上拥有4个core,这时我们可以说这个系统的MPL(multiprogramming level)是4,我们可以为每台server定义4个worker thread(t1, t2, t3, t4),这4个thread运行在4个core上,这时我们可以说这个系统有4个groups,分别是:

g1: A(t1), B(t1), C(t1), D(t1), E(t1)

g2: A(t2), B(t2), C(t2), D(t2), E(t2)

g3: A(t3), B(t3), C(t3), D(t3), E(t3)

g4: A(t4), B(t4), C(t4), D(t4), E(t4)

g5: A(t5), B(t5), C(t5), D(t5), E(t5)

再来看一个C-G应用的场景。假设这时有两个命令:

set_state(v)

get_state(v)

对于get_state,虽然这是一个复制系统,但这个命令并不需要发给所有replicas,只需其中一个执行并返回结果即可,而对于set_state,则需要让每一个replica都去执行。

这里先记录下P-SMR的一个优点:

P-SMR offloads scheduling decisions from the replicas, avoiding a bottleneck-prone scheduler, which must deliver a single stream of commands and assign them to the worker threads for execution。

尝试解释一下:传统的并行执行,是让linux内核来做调度,将4个independent的命令分配在4个线程上。而在P-SMR中client proxy中的C-G起到了调度官(scheduler)的作用,即由C-G来制定线程分配的调度策略,这样的话就能指定某个命令分配到特定的线程上,而这在传统的linux内核调度上是做不到的,这也是P-SMR能做到并行执行的核心思想和方法所在。下面是我对P-SMR的理解:

时间: 2024-11-29 07:14:02

通过P-SMR看State Machine Replication的相关文章

如何在SMR(State Machine Replication)系统中使用PAXOS算法

大家虽然看过那么多有关PAXOS算法的理论和论文,但仍然云里雾里,原因就是没有实践.这里咱们不讲理论,直接用实际开发来通俗讲解PAXOS算法的应用. 提案(proposal)是PAXOS算法一个重要的组成部分. 先来看一下用于在分布式节点间传递提案(accept_req)的数据结构: struct accept_req { node_id_t node_id; view_stamp msg_vs; view_stamp req_canbe_exed; }; struct view_stamp {

Mina State machine状态机讲解

原文地址:Mina State machine(Apache Mina User guide Chapter14 State machine) 如果您使用的是Mina与复杂网络开发应用程序交互,你可能在某些时候发现自己达到的美好状态模式尝试解决一些复杂性.然而,在你这样做之前你可能想检查mina-statemachine试图解决一些状态模式的不足之处. 1.1.1. 一个简单的例子 让我们演示mina-statemachine如何以一个简单的例子工作.下图显示了一个典型的录音机一个状态机.椭圆形

Finite State Machine

Contents [hide] 1 Description 2 Components 3 C# - FSMSystem.cs 4 Example Description This is a Deterministic Finite State Machine framework based on chapter 3.1 of Game Programming Gems 1 by Eric Dybsend. Therea are two classes and two enums. Include

Finite State Machine 是什么?

状态机(Finite State Machine):状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动       作.完成特定操作的控制中心. 类别: ~ 若输出只和状态有关而与输入无关,则称为Moore状态机 ~ 输出不仅和状态有关而且和输入有关系,则称为Mealy状态机 关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成.状态机通过响应一系列事件而"运行".每个事件都在属于"当前&qu

Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)

近期在读Hadoop#Yarn部分的源代码.读到状态机那一部分的时候,感到enmu的使用方法实在是太灵活了,在给并发编程网翻译一篇文章的时候,正好碰到一篇这种文章.就赶紧翻译下来,涨涨姿势. 原文链接:http://www.javacodegeeks.com/2011/07/java-secret-using-enum-to-build-state.html 作者:Peter Lawrey    译者:陈振阳 综述 Java中的enum比其它的语言中的都强大,这产生了非常多令人吃惊的使用方法.

Finite State Machine 有限状态机

? ?????首先这是一篇FSM翻译,关于Finite State Machine 的架构赏析,如果项目对ai需求不是非常强,可以在此基础上扩展,keyle也是在学习中欢迎交流,后面两篇计划是在写一篇Behavior?Tree(行为树),最后一篇实现基于Lua的AI的热更新?QQ群交流:137728654 ? ? Finite State Machine Contents 1?Description 2?Components 3?C# - FSMSystem.cs 4?Example Descr

unity5, animator state machine, 无条件transition实现播放动画序列

今天遇到这样一个需求,我有一个名为happy的animation clip和一个名为speak的animation clip.想实现当主角胜利后播放动序列: happy->speak->happy->speak->... 这样无限循环. 走了一些弯路后发现直接在animator state machine里就可以搞定,如下图: transition{idle->happy}上condition设为triggerWin,由于idle到happy的transition不能太拖沓,

MITK中State machine和configuration详解和调用顺序

(学习笔记,错误难免,请指正:私人劳动,转载请注明出处) 下面以MITK自带的mitkPointSetDataInteractor.h.mitkPointSetDataInteractor.cpp.PointSet.xml.PointSetConfig.xml为例,解释MITK中的交互原理,以及State machine和configuration的调用顺序. PointSet.xml: <statemachine> <state name="start" start

(三)Unity5.0新特性------State Machine Behaviours

出处:http://blog.csdn.net/u010019717 author:孙广东      时间:2015.3.31 (State machine behaviours)状态机的行为在Animator Controller的脚本中是可以附加到动画状态或子状态机.每当你进入一种状态,就可以对其添加各种各样的状态依赖例如播放声音等行为,他们甚至可以独立于动画animation.而用于(logic state machines )逻辑状态机.要添加(State machine behavio