cassandra - Redis AOF fsync(始终)与 LSM 树

标签 cassandra redis wal

我对日志结构化合并树(LSM 树)的理解是,它利用了附加到磁盘非常快(因为它不需要查找)的事实,只需将更新附加到预写日志并返回到客户端。 我的理解是,这仍然提供即时持久性,同时仍然非常快。

Redis,我认为它不使用 LSM 树,它似乎有一种模式,您可以在每次写入时进行 AOF+fsync。 https://redis.io/topics/latency 。文档说:

AOF + fsync always: this is very slow, you should use it only if you know what you are doing.

我很困惑为什么这会非常慢,因为原则上你仍然只是在每次更新时附加到一个文件,就像 Cassandra 等 LSM 树数据库所做的那样。

最佳答案

LSM 是您有时想要实际读取的 AOF。您做了一些日常工作,以便稍后可以更快地阅读。 Redis 的设计使您永远不会或仅在特殊情况下读取它。另一方面,Cassandra 经常读取它来服务请求。

对于像 Cassandra 这样的数据库来说,Redis 所说的慢实际上非常非常快。

==============================更新

事实证明,我下结论太早了。从设计的角度来看,上述一切都是正确的,但实现差异很大。尽管 Cassandra 声称绝对耐用,但它不会对每个事务进行 fsync,并且没有办法强制它这样做(但每个事务都可以进行 fsync)。我能做的最好的事情就是“在上一次 fsync 之后至少 1ms 以批处理模式进行 fsync”。这意味着对于 4 线程基准测试,我使用的是每个 fsync 执行 4 次写入,并且线程正在等待 fsync 完成。另一方面,Redis 在每次写入时都会进行 fsync,因此频率增加了 4 倍。通过添加更多线程和更多表分区,Cassandra 可以赢得更大的胜利。但请注意,您描述的用例并不典型。其他架构差异(Cassandra 擅长分区,Redis 擅长计数器、LUA 等)仍然适用。

数字:

Redis命令:set(KEY + (tstate.i++), TEXT);

Cassandra 命令:execute("插入 test.test (id,data) 值 (?,?)", state.i++, TEXT)

其中TEXT =“醒来,Neo。我们已经更新了我们的隐私政策。”

Redis 每秒 fsync,HDD

Benchmark              (address)   Mode  Cnt      Score      Error  Units
LettuceThreads.shared  localhost  thrpt   15  97535.900 ± 2188.862  ops/s

  97535.900 ±(99.9%) 2188.862 ops/s [Average]
  (min, avg, max) = (94460.868, 97535.900, 100983.563), stdev = 2047.463
  CI (99.9%): [95347.038, 99724.761] (assumes normal distribution)

Redis 每次写入都会 fsync,HDD

Benchmark              (address)   Mode  Cnt   Score   Error  Units
LettuceThreads.shared  localhost  thrpt   15  48.862 ± 2.237  ops/s

  48.862 ±(99.9%) 2.237 ops/s [Average]
  (min, avg, max) = (47.912, 48.862, 56.351), stdev = 2.092
  CI (99.9%): [46.625, 51.098] (assumes normal distribution)

Redis、每次写入 fsync、NVMe(三星 960 PRO 1tb)

Benchmark              (address)   Mode  Cnt    Score   Error  Units
LettuceThreads.shared     remote  thrpt   15  449.248 ± 6.475  ops/s

  449.248 ±(99.9%) 6.475 ops/s [Average]
  (min, avg, max) = (441.206, 449.248, 462.817), stdev = 6.057
  CI (99.9%): [442.773, 455.724] (assumes normal distribution)

Cassandra,每秒 fsync,HDD

Benchmark                  Mode  Cnt      Score     Error  Units
CassandraBenchMain.write  thrpt   15  12016.250 ± 601.811  ops/s

  12016.250 ±(99.9%) 601.811 ops/s [Average]
  (min, avg, max) = (10237.077, 12016.250, 12496.275), stdev = 562.935
  CI (99.9%): [11414.439, 12618.062] (assumes normal distribution)

Cassandra,每批 fsync,但至少等待 1ms,HDD

Benchmark                  Mode  Cnt    Score   Error  Units
CassandraBenchMain.write  thrpt   15  195.331 ± 3.695  ops/s

  195.331 ±(99.9%) 3.695 ops/s [Average]
  (min, avg, max) = (186.963, 195.331, 199.312), stdev = 3.456
  CI (99.9%): [191.637, 199.026] (assumes normal distribution)

关于cassandra - Redis AOF fsync(始终)与 LSM 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478674/

相关文章:

Cassandra where IN 子句限制

python - 从python连接到Cassandra集群超时

amazon-web-services - 如何使 ElastiCache 上的 Redis 事件触发 Lambda 函数?

caching - Redis缓存中如何定义 “regions”?

laravel - 无法获取工匠队列:work to process jobs with Supervisor on Elastic Beanstalk (Laravel/Redis)

postgresql - 预写日志记录如何提高 Postgres 中的 IO 性能?

kubernetes - 普罗米修斯吃掉巨大的内存

Cassandra 2.1 系统架构缺失

java - 如何找到 Cassandra 导致 Spark 作业中止的根本原因(导致 ClassCastException - ShuffleMapTask 到 Task)?

WAL模式下的Java SQLite : the database is locked