Apache Kudu的Transaction Semantics事务语义

1. 向单个tablet写入数据

write operation的定义:指对一个tablet进行insert或update或delete。在完成后由系统自动进行commit。一个tablet上的一个write operation完成后,才能进行下一个write operation

Kudu采用MVCC多版本并发控制和Raft一致性算法,write流程如下:

  1. tablet的leader获取待change的row的lock
  2. tablet的leader生成一个timestamp,作为MVCC中write的tag
  3. 所有replica对change进行实施
  4. 当所有replica的change完成,change的row可见

2. 向多个tablet事务写入数据

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可选值如下:

  1. READ_LATEST:默认读取模式,读取最新的snapshot数据
  2. READ_AT_SNAPSHOT:读取指定snapshot的数据,通过snapshotTimestampMicros(System.currentTimeMillis() * 1000)进行指定。如果此时还有write的timestamp小于指定的snapshot,则会等待write完成,再返回数据
  3. READ_YOUR_WRITES:读取最新的snapshot数据 + 当前application正在write的数据。原理是server端scan的时候会指定一个比该application大的timestamp

ReplicaSelection的选择不影响数据一致性,可选值如下:

  1. LEADER_ONLY:默认副本选择策略。读取leader tablet的数据
  2. CLOSEST_REPLICA:读取最近的replica的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值