默认情况下,写入tikv的数据的落盘方式是同步还是异步,是否可以设置落盘方式,谢谢

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【TiDB 版本】
4.0.9
【问题描述】
默认情况下,写入tikv的数据的落盘方式是同步还是异步,是否可以设置落盘方式


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

默认情况下,写入tikv的数据的落盘方式是异步的

首先,了解一下 tikv 内数据两次落盘,详情可参考 官方问文档 Performance-map

  1. raftstore 线程池处理 raft 数据落盘到 rocksdb raft ,解决分布式一致性问题;
  2. apply 线程池处理 kv 数据落盘到 rocksdb kv , 解决数据的持久性问题;

对数据落盘方式的问题分为两个组件回答:

  1. 组件 raftstore 线程池落盘时是同步的,链接 Raftstore 线程池是 TiKV … 中介绍,“所有的写请求都会先在 Raftstore 线程 fsync 的方式写入 RocksDB”,也就是说在一致性处理组件-- raftstore 组件中,采用同步落盘方式;
    Raftstore 处理细节,参考官网文章– Raftstore 的工作流程 中介绍的,“在有写请求时,Raft 状态机需要将日志落盘并且将日志发送给其他 Region 副本” 部分内容;
  2. 组件 apply 线程池落盘时应该是异步的, 从 compaction-readahead-sizebytes-per-syncwal-bytes-per-sync 等 rocksdb 的参数配置上推测,应该是异步的,官网并没有给出 rockdb kv 数据落盘的修改方式。 个人觉得,也没有必要修改,因为一致性问题已经在 Raftstore 部分使用同步的方式、借用 raft 协议的多数派特性解决了,出于性能考虑真正的 kv 数据也没有必要采用同步的方式。

对于是否可以设置落盘方式问题:

  1. raftstore.sync-log,可以设置raftstore 数据和 log 的落盘方式,默认值:true 详情参考官方文档 sync-log
    注意:手动将 raftstore.sync-log 设置为 false 可以提升一部分写性能,也会增加在机器故障时数据丢失的风险;
  2. 处理 rocks kv 的 apply 线程池落盘方式不能修改

总结来说,tikv 的 raft 数据是同步的,落盘方式可修改;tikv 的 kv 数据的落盘是异步的,落盘方式不可修改;

4 个赞

楼上正解:+1:

对tikv的实现不熟悉,官网上也没找到相关说明,所以来这提问,谢谢你的详细回答,解答了我的疑问。

:love_you_gesture::love_you_gesture::+1:

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。