Cassandra对磁盘的读取和写入是否是异步的?

pdsfdshx  于 12个月前  发布在  Cassandra
关注(0)|答案(2)|浏览(107)

我在Cassandra的文档(https://cassandra.apache.org/doc/latest/cassandra/operating/hardware.html)中读到Cassandra以异步模式写入sstable。我想问一下是否所有的写入都是异步的。另外,读取也是异步的或依赖于示例到示例的。

h7wcgrx3

h7wcgrx31#

默认情况下,对磁盘的写入是异步的-需要考虑两种不同的写入。
第一个是提交日志,默认情况下是异步的。可以通过更改某些设置来改变该行为,同步频率越高,写入时的性能/吞吐量就越低。

  • commitlog_sync -该值为periodic(默认值)、groupbatch
  • commitlog_sync_period -默认值为10秒。

因此,默认情况下,它将每10秒同步一次,使该节点上的更改具有持久性。每个节点都独立地同步到磁盘,因此在3个副本中,您可以期望数据平均每3.33ms同步到节点的一个磁盘。
第二个是被刷新的memtable,例如当前保存在存储器中的数据,当足够的数据保存在存储器中以超过阈值时,它们可以在任何时间刷新。有许多设置也会影响此行为:

  • 可记忆堆空间
  • 可记忆堆外空间
  • memtable_cleanup_threshold

除非你有一些特定的问题/刷新瓶颈的证据,否则我不会从默认值开始改变这些。
在问题中,您提到了读取-它们是同步的(大部分情况下)-因为如果您在查询中请求数据,它将执行读取。在Cassandra的3.11和更早版本中,read_repair_chance有可能触发异步读取以进行修复。

k2arahey

k2arahey2#

严格地说,我相信你在说两件不同的事情。
您所指的“写”与使用Unix fsync()函数持久化磁盘的commitlog有关,以使其持久化。这与异步的客户端/驱动程序读/写请求是完全不同的概念。
默认情况下,Cassandra的commitlog由操作系统缓存在一个缓存中,该缓存每10秒使用fsync()定期刷新到磁盘。
另一方面,您可以将应用程序配置为执行异步读取或写入,以便客户端请求在等待协调器的结果或确认时不会被阻塞。
所以直接回答你的问题,并不是所有的读或写都是异步的。这取决于你如何编写你的应用程序。我们的建议是使用驱动程序的异步API来最大化集群的性能。干杯!

相关问题