事务系统实现模式很简单?你确定没忽视这些差异?
副问题[/!--empirenews.page--]
本文试图接头这几个题目:
本文旨在叙述Fault-Tolerant Transaction的几种实现模式。固然乍一看它们也许都是Raft+KVEngine +Concurrency Control,轻易被以为是统一类要领,但现实上的差别很大,在接头时不该该忽视它们之间的差别。 一、根基观念 接头的Fault-Tolerance,指的是通过收集通讯的多个计较机节点,在部门节点产生Stop Failure的环境下,如故极力担保可用性; 不接头详细的Fault-Tolerance要领,默认读者对Raft等算法有根基领略; 也不接头详细的Concurrency Control要领,默认读者对其有根基的领略; 会涉及到Spanner、TiKV、MongoDB等详细的数据库。 1、基于RSM的Fault-Tolerant KV Replicated State Machine最早应该是在『Implementing fault-tolerant services using the state machine approach』提出。它是一种很简质朴用的实现容错的要领,焦点头脑是:几个状态机具有沟通的初始状态,而且凭证同样的次序执行了同样的呼吁序列,那么它们的最终状态也是一样的。因为状态一样,那么恣意一个状态机宕机,都可以被其他的取代,因此实现了Fault Tolerant。 这里提到了几个观念,呼吁、执行次序、状态机,它们都是抽象观念,对应到详细的应用场景才有现实意义。在KVEngine的场景下,呼吁就是Put/Get等操纵,状态机就是KVEngine自己,而执行序列,则由Replication Log抉择。 既然提到了RSM和KV,那么基于RSM的KV也就呼之欲出了。把发到KVEngine的操纵先用Raft复制一遍,在Apply的时辰扔回到KVEngine执行,于是我们就获得了一个Fault-Tolerant的KVEngine。 看起来很简朴,但我在这里显然忽略了许多细节:
2、基于RSM的事宜 我们来思量最后一个题目,RSM中的呼吁,可以直接是一个事宜吗? 既然Raft都是串行Apply了,那么看起来把事宜的全部操纵作为一个呼吁扔到状态机执行并没有什么题目。 但题目在于,现实中的事宜是交互式的,也就是包括了if-else等逻辑的,而且逻辑还也许依靠了数据库体系外部的状态,以是不能简朴地用Write Batch + Snapshot来实现一个事宜,照旧要有Concurrency Control的逻辑。 为了办理Concurrency Control的题目,我们在Raft Leader上,实现一个Lock Table和Transaction Manager。拿S2PL要领举例:
这里举的例子是S2PL,但对付其他的并发节制要领也根基通用。譬喻Snapshot Isolation,事宜开始时得到KV的Snapshot,读操纵都走Snapshot,写操纵得到写锁,数据Buffer在当地,事宜提交时搜查[begin, end]之间有没有写斗嘴,没有的话则通过Raft写事宜日记,在Apply事宜日记之后,把写操纵应用到KVEngine,最后开释写锁。 这种要领靠近Spanner的做法,它具有几个特点:
3、基于共享存储的事宜 从头看一下上面这个模子,复制协议所做的工作很是简朴,和其他模块的耦合也很小,仅仅是维护一个有序的Log,因此,我们可以把它从share-nothing推广到share-storage的模子中。 也就是说,我们把平凡的单机事宜引擎,放到一个高可用的存储上,就获得了根基可用的Fault-Tolerant 事宜引擎了,连复制协议也不必要实现的。 不外工作显然不会这么简朴:
(编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |