Domino(Decrease cOnflict, assist comMIt, NO rollback)是构建在HBase上的分布式事务引擎,支持完整的ACID事务特性。在架构上,Domino与HBase完全松耦合,使用HBase Coprocessor作为运行时框架,因此可以与任何升级后的HBase版本兼容。事务系统的核心为并发控制,Domino的并发控制机制称之为Stateless and Statefull update Concurrency Control(SSCC). SSCC具备三大特征:降低冲突Decrease cOnflict(支持高并发)、辅助提交assist comMIt(提高吞吐率)、无需回滚No rollback(减少IO)。Domino/SSCC为开源系统,开源协议为Apache License。
Domino的关键算法是其并发控制机制,称之为Stateless and Stateful update Concurrency Control(SSCC,旧名为SUCC)。SSCC的核心思想是把写入(更新)操作分为两类:“有状态更新stateful update”和“无状态更新stateless update”。“有状态更新”是指写入(更新)的数据内容是基于当前已有数据的值,如w(x)=x+1;“无状态更新”是指写入(更新)的数据和当前数据无关,即“纯”写入。
无状态更新操作在最近兴起的大数据环境中广泛存在,特别是在web应用方面,其以文本和二进制数据为主,不涉及基于当前数值的更新操作。例如,搜索引擎的索引更新,一篇文档的更新涉及到原始数据和倒排链的多处改动,无论原始数据表还是索引数据表,其旧数据被直接覆盖或自动删除,和数据当前的值(内容)无关,正因为如此,Google提出了事务引擎Percolator来处理索引更新;再如,一些数据管理系统使用二级索引表进行数据查询,其对二级索引表的维护大部分为无状态更新操作。另外,一些互联网应用中,旧的文本数据往往被新的文本数据直接覆盖,例如微博系统中最热门的消息或最新消息都是直接被新来的数据覆盖掉。
实际上,blind-write (write-only)事务类型在20年前就被讨论过。这种事务类型包含的操作和数据对象的状态无关,而是直接对数据进行改动(Such transactions consist of operations that do not observe the states of the objects instead they “blindly” modify the object states.),所对应的写入操作被称之为blind-write操作:A blind write is when a transaction writes to an object without ever reading the object。Write-only事务包含的操作全部是blind-write。在大数据环境下,这种操作显得比以前更加频繁和重要。我们定义的无状态更新操作和blind-write是一致的,只不过我们讨论的事务可以任意包含各种操作,而不仅限于write-only事务。
可以在Github上找到Domino/SSCC的详细介绍和代码:https://github.com/domino-succ/domino/wiki/%E4%B8%AD%E6%96%87-%E7%AE%97%E6%B3%95%E8%AE%BE%E8%AE%A1