目录
1. 向单个tablet写入数据
- 1. 向单个tablet写入数据
- 2. 向多个tablet事务写入数据
- 3. Scan的可选参数
write operation的定义:指对一个tablet进行insert或update或delete。在完成后由系统自动进行commit。一个tablet上的一个write operation完成后,才能进行下一个write operation
Kudu采用MVCC多版本并发控制和Raft一致性算法,write流程如下:
- tablet的leader获取待change的row的lock
- tablet的leader生成一个timestamp,作为MVCC中write的tag
- 所有replica对change进行实施
- 当所有replica的change完成,change的row可见
write transaction指对一个或多个tablet的多个write operation同时进行操作,每个事务都有一个事务ID。事务由用户手动进行commit,commit方式为两阶段提交
在一个批次写入多行数据到一个或多个tablet,会先将一个批次的数据缓存到内存,然后flush到server端。一个batch具有相同的timestamp
一个事务中的待change的多个rows也会进行lock。当一个row被一个事务lock,其它事务操作该row需等待lock释放
事务通过类KuduTransaction实现
3. Scan的可选参数scan读取的是snapshot的数据,不会阻塞write
部分可选参数示例代码如下:
val scanner: KuduScanner = client.newScannerBuilder(table)
// ...... 其它参数
.readMode(AsyncKuduScanner.ReadMode.READ_AT_SNAPSHOT)
.snapshotTimestampMicros(System.currentTimeMillis() * 1000)
.replicaSelection(ReplicaSelection.CLOSEST_REPLICA)
.build()
ReadMode可选值如下:
- READ_LATEST:默认读取模式,读取最新的snapshot数据
- READ_AT_SNAPSHOT:读取指定snapshot的数据,通过
snapshotTimestampMicros(System.currentTimeMillis() * 1000)
进行指定。如果此时还有write的timestamp小于指定的snapshot,则会等待write完成,再返回数据 - READ_YOUR_WRITES:读取最新的snapshot数据 + 当前application正在write的数据。原理是server端scan的时候会指定一个比该application大的timestamp
ReplicaSelection的选择不影响数据一致性,可选值如下:
- LEADER_ONLY:默认副本选择策略。读取leader tablet的数据
- CLOSEST_REPLICA:读取最近的replica的数据