首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Redis AOF fsync (总是) vs. LSM树

Redis AOF fsync (总是) vs. LSM树
EN

Stack Overflow用户
提问于 2018-05-23 09:43:07
回答 1查看 1.2K关注 0票数 2

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

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

代码语言:javascript
复制
AOF + fsync always: this is very slow, you should use it only if you know what you are doing.

我搞不懂为什么这会很慢,因为原则上每次更新时仍然只追加一个文件,就像Cassandra这样的LSM树数据库所做的那样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-23 15:54:09

LSM是你有时想要真正阅读的AOF。你做了一些额外的工作,这样你以后可以更快地阅读它。Redis是专门设计的,所以你永远不会阅读它,或者只在特殊情况下阅读它。另一方面,Cassandra经常读取它来服务于请求。

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

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

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

数字:

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

Cassandra命令:execute("insert into test.test (id,data) values (?,?)", state.i++, TEXT)

Where TEXT = "Wake up, Neo. We have updated our privacy policy."

每秒Redis fsync,HDD

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

代码语言:javascript
复制
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,硬盘

代码语言:javascript
复制
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,硬盘

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50478674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档