增量检查点(incremental checkpoint)的解疑

原文:oracle8以后Oracle推出了incremental checkpoint的机制,在以前的版本里每次常规checkpoint时都会做一个full thread checkpoint,这样的话所有脏数据会被写到磁盘,巨大的i/o对系统性能带来很大影响。为了解决这个问题,oracle引入了checkpoint queue机制,每一个脏块会被移到检查点队列里面去,按照low rdb(第一次对此块修改对应的redo block address)来排列,靠近检查点队列尾端的数据块的low rba值是最小的,而且如果这些赃块被再次修改后它在检查点队列里的顺序也不会改变,这样就保证了越早修改的块越早写入磁盘。每隔3秒钟ckpt会去更新控制文件中的checkpoint progress recored区域,记录checkpoint执行的情况。
注意:增量检查点并不去更新数据文件头,只是在控制文件中记录了checkpoint progress record这个区域,记下low rba,on-disk rba等信息。这些信息就可以用来快速恢复。

每隔3秒钟ckpt会去更新控制文件中的checkpoint progress recored区域,记录checkpoint执行的情况。

解疑:这里应该是只更新控制文件每3秒不是更新数据文件头,而是在控制文件中记录checkpoint的执行情况,基于增量检查点和checkpoint  queue的原理,在发生检查点的时候,ckpt 进程每次只是告诉dbwr,写dirty  buffe要一直写到最新这个位置(发生检查点:也就是alter system checkpoint),这样做呢,仅仅是告诉dbwr一个checkpoint queue中的结束点,ckpt绝对不会等到dbwr写完所有脏数据在更新控制文件和数据文件头,而是每3秒钟,在控制文件中的checkpoint progress recored区域中报告一下dbwr最新写入的位置(也就是dbwr的写状态的scn)。 这样使得,比如数据库要做恢复的时候(instance  recovery)可以从这个最新报告的scn位置开始做恢复,而不是从数据文件中的checkpoint  scn开始做恢复,这样将缩短恢复时间,尤其是instance  crash的情况下启动更快。另外要注意的是,检查点发生的时候,ckpt 去更新数据文件头和控制文件,并不是把当前检查点发生时候的scn 更新进去,而是把上一次dbwr写入已经完成的检查点发生时候的  scn 更新进去 ,也就是说,更新控制文件和数据文件头是滞后于检查点的发生的,这个从恢复的原理也很容易理解,因为检查点发生的时候dirty buffer还没有写入,自然不能立即更新成当前的scn了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12361284/viewspace-119993/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12361284/viewspace-119993/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Flink 中,增量 Checkpoint 是一种 Checkpoint 优化方式,它只会对有状态的算子进行 Checkpoint,而对于没有状态的算子,则不会进行 Checkpoint。这样可以减少 Checkpoint 的时间和资源消耗。 要配置增量 Checkpoint,可以通过以下步骤进行: 1. 在 Flink 的配置文件中,设置 `state.backend` 为 `rocksdb`。RocksDB 是一种高效的键值存储引擎,可以用于存储增量 Checkpoint 的状态数据。 2. 设置 `state.backend.rocksdb.enable.incremental.compaction` 为 `true`,启用增量压缩功能。 3. 设置 `state.checkpoints.dir`,指定 Checkpoint 的存储路径。 4. 设置 `state.checkpoints.interval`,指定 Checkpoint 的时间间隔。 5. 在算子中,调用 `env.enableCheckpointing()` 方法启用 Checkpoint,并设置 `CheckpointMode.EXACTLY_ONCE` 为确切一次的 Checkpoint 模式。 6. 在算子中,通过 `statefulStreamOperator.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION)` 方法启用外部化 Checkpoint,以便在作业取消时保留 Checkpoint 数据。 下面是一个示例代码: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setStateBackend(new RocksDBStateBackend("file:///path/to/checkpoints", true)); env.enableCheckpointing(1000, CheckpointingMode.EXACTLY_ONCE); env.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION); DataStreamSource<String> source = env.addSource(new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), props)); SingleOutputStreamOperator<String> operator = source .keyBy(key -> key) .process(new MyProcessFunction()); operator.print(); env.execute("Incremental Checkpoint"); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值