Kudu 旨在最终完全获得 ACID ,但是多 tablet 事务尚未实施。最终 Kudu 将支持完全严格的可序列化语义。事实上,它已经在有限的范围内,但并不是所有的角落都被覆盖,因为这仍然是一个正在进行的工作。
Kudu 目前允许以下操作:
- Write operations是在具有多个副本的单个 tablet 中,插入、更新或删除的 sets of rows ( 行集 )。写操作没有单独的 “read sets” ,即它们在执行写入之前不扫描现有数据。每个写入仅涉及即将更改的行的先前状态。用户不需显示调用“committed” ,它们将在系统完成后自动提交。
- Scans 是可以遍历多个 tablets读取信息的操作,具有一致性或正确性保证。扫描可以按照时间戳读取,即用户能够设置扫描时间戳,获取该时间点上存储的结果。
Single tablet write operations
Kudu 采用多版本并发控制(MVCC)和 Raft 一致性算法。Kudu 的每个写入操作必须经过 tablet leader。
- leader 获取将更改行的锁。
- leader 在写操作提交到副本之前分配写入时间戳。这个时间戳是 MVCC 中写操作的标签。
- 在大多数副本确认更改后,实际的行将被更改。
- 更改完成后,它们可以以原子方式同时进行写入和读取。
tablets 的所有副本都遵循相同的操作顺序,如果为写入操作分配时间戳 n 并更改行 x ,则保证时间戳 m > n 的第二次写入操作可以看到 x 的新值。
写操作是根据时间戳排序的。换句话说,在一个公认的有限的上下文中,写入具有严格的可序列化语义。多行写入操作尚未完全原子化。批量操作中单次写入的故障不会回滚操作,而是产生每行错误。
Writing to multiple tablets
Kudu