您当前的位置: 首页 >  apache

Bulut0907

暂无认证

  • 0浏览

    0关注

    346博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Apache Kudu的Transaction Semantics事务语义

Bulut0907 发布时间:2022-06-28 08:47:13 ,浏览量:0

目录
  • 1. 向单个tablet写入数据
  • 2. 向多个tablet事务写入数据
  • 3. Scan的可选参数

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的数据
关注
打赏
1664501120
查看更多评论
立即登录/注册

微信扫码登录

0.0454s