Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis AOF fsync (IMMER) vs. LSM-Baum

LSM ist AOF, das möchte man eigentlich manchmal lesen. Sie erledigen etwas Überkopfarbeit, damit Sie es später schneller lesen können. Redis ist so konzipiert, dass Sie es nie oder nur in besonderen Fällen lesen. Auf der anderen Seite liest Cassandra es oft, um Anfragen zu erfüllen.

Und was Redis als langsam bezeichnet, ist für eine Datenbank wie Cassandra eigentlich sehr, sehr schnell.

===========================AKTUALISIERUNG

Es stellt sich heraus, dass ich zu früh voreilige Schlüsse gezogen habe. Aus gestalterischer Sicht ist alles oben Genannte wahr, aber die Implementierung unterscheidet sich so sehr. Obwohl Cassandra absolute Haltbarkeit behauptet, ist es nicht fsync bei jeder Transaktion und es gibt keine Möglichkeit, dies zu erzwingen (aber jede Transaktion könnte fsynct werden). Das Beste, was ich tun könnte, ist 'fsync im Batch-Modus mindestens 1 ms nach vorherigem fsync'. Dies bedeutet, dass für den von mir verwendeten 4-Thread-Benchmark 4 Schreibvorgänge pro fsync durchgeführt wurden und die Threads darauf warteten, dass fsync ausgeführt wurde. Auf der anderen Seite führte Redis bei jedem Schreibvorgang fsync aus, also viermal häufiger. Mit dem Hinzufügen von mehr Threads und mehr Partitionen der Tabelle könnte Cassandra noch größer gewinnen. Beachten Sie jedoch, dass der von Ihnen beschriebene Anwendungsfall nicht typisch ist. Und andere architektonische Unterschiede (Cassandra ist gut bei der Partitionierung, Redis ist gut bei Zählern, LUA und anderen) gelten immer noch.

Zahlen:

Redis-Befehl:set(KEY + (tstate.i++), TEXT);

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

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

Fsync jede Sekunde neu erstellen, 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 bei jedem Schreibvorgang, 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 bei jedem Schreibvorgang, NVMe (Samsung 960 PRO 1 TB)

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 jede Sekunde, 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 jeden Batch, aber warte mindestens 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)