1. Omid是什么
Apache Omid的全称是Optimistically transaction Management In Datastores,也就是数据库的乐观事务管理。它是灵活、高可用和高性能和可扩展的事务框架,帮助MVCC的键值NoSQL数据库实现ACID的事务特性。
当前的实现提供了在Apache HBase的多行数据的事务能力,但Omid的设计足够灵活可以支持其他数据库的实现,只要它们的API可以提供MVCC的特性。
2. 为什么用Omid
事务指的是将对数据库的一组操作整合为一个操作单元,因此所有操作要么全部完成(commited),要么都不生效(aborted)。换句话说,事务不允许有部分操作成功,部分失败,因为数据库的状态将因此不可控。
没有事务的支持,开发者就要承担着保证对数据库的分散操作的原子性,特别是在操作出现失败时,以及由多个客户端发起的并发访问的处理。
为了实现事务,数据库提供了一个特殊的组件,称之为事务管理器。事务管理器的目的是为了保证事务所谓的ACID特性:原子性、一致性、隔离性、可见性。然而,当数据库处理海量数据和成千上万的并发用户时,ACID的特性很难实现,因为海量的数据必须是分区的、分布式和多副本的。这也就是为什么NoSQL的大数据存储最初设计是不支持事务性,像HBase、Dynamo、BigTable、PNUTS和Cassandra都是如此。然而,随着NoSQL的大数据存储在越来越多的工业界的使用,对于这些应用来说事务是必须的。
Omid填补了这个空白,并且在HBase上提供了不需要锁的镜像隔离(snapshot isolation)的事务支持,Omid保证了大数据应用可以在利用NoSQL大数据存储的可扩展性的同时,也可以使用事务处理的并发处理和原子性。
Omid的好处
总结下Omid提供的好处:
- Omid提供HBase多行和多表的事务;
- Omid是无锁的。基于锁的实现,在某个客户端的事务未完成前,会阻止其他客户端操作,如果一个客户端比较慢,会拖累其他客户端。
- Omid提供了镜像隔离(Snapshot Isolation)级别的保证;
- Omid不需要修改HBase的代码,所有的事务实现逻辑都在框架内部;
- Omid不需要修改HBase的表结构,Omid使用HBase的元数据,特别是单元时间戳,保存每个值在插入、更新和删除时的事务时间戳。这保证了并发读时获取正确的时间戳。
- Omid具有良好的性能和可靠性。
3. Omid的架构
Omid的架构图如下:
Omid有一个中心化的server,称为Transactional Status Oracle(TSO),它负责监控事务修改的rows和cells,用此检查写-写冲突。
用户的应用通过Transactional Clients(TC)发起,提交或中断事务,并发起和TSO的远程通信,允许对数据库中的数据执行事务操作。
当事务创建时,由Timestamp Oracle(TO)分配一个唯一的起始时间戳。这个时间戳作为事务的识别码,当有其他事务同时在写数据时,TSO用此时间戳来保证镜像隔离(SI)。在冲突检测成功完成之后,TSO分配给该事务一个提交时间戳,并将起始时间戳和提交时间戳写入到Commit Table(CT)中,然后再将响应返回客户端。当接收到响应时,TC为事务中每个写cell的操作分配一个Shadow Cell(SC),保证后续的读操作不需要TSO就可以读到正确的镜像版本。
这里主要的组件功能描述如下:
- Timestamp Oracle(TO):分配起始和提交时间戳来标用定事务的上下文;
- Transaction Status Oracle(TSO):Omid架构在server端的核心组件,主要用于解决并发事务的冲突;
- Commit Table(CT):临时保存每个提交事务的起始时间戳到提交时间戳的映射;
- Transactional Client(TC):允许客户端应用通过事务管理器标定事务的边界,并通过事务表(Transactional Tables)执行事务的读写操作;
- Shadow Cells(SC):这些特殊的元数据cells和数据存储中的数据cells同时写,允许Transactional Client不通过Commit Table解决读的版本问题,其中包含了写入数据cell的最后一个事务的边界。
进一步阅读请参考:http://omid.incubator.apache.org/omid-components.html