默认情况下,写入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 个赞