Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis AOF fsync (TOUJOURS) par rapport à l'arborescence LSM

LSM est AOF que vous voulez réellement lire parfois. Vous faites des travaux généraux afin de pouvoir le lire plus rapidement plus tard. Redis est conçu pour que vous ne le lisiez jamais ou seulement dans un cas particulier. D'un autre côté, Cassandra le lit souvent pour répondre aux demandes.

Et ce que Redis appelle lent est en fait très très rapide pour une base de données comme Cassandra.

===========================MISE À JOUR

Il s'avère que j'ai sauté trop tôt dans les conclusions. Du point de vue de la conception, tout ce qui précède est vrai, mais la mise en œuvre diffère tellement. Bien que Cassandra revendique une durabilité absolue, elle ne fait pas fsync sur chaque transaction et il n'y a aucun moyen de le forcer à le faire (mais chaque transaction peut être fsynced). Le mieux que je puisse faire est de "fsync en mode batch au moins 1 ms après la précédente fsync". Cela signifie que pour le benchmark à 4 threads que j'utilisais, il faisait 4 écritures par fsync et que les threads attendaient que fsync soit fait. D'un autre côté, Redis a fait fsync à chaque écriture, donc 4 fois plus souvent. Avec l'ajout de plus de threads et de plus de partitions de la table, Cassandra pourrait gagner encore plus gros. Mais notez que le cas d'utilisation que vous avez décrit n'est pas typique. Et d'autres différences architecturales (Cassandra est bonne pour le partitionnement, Redis est bonne pour les compteurs, LUA et autres) s'appliquent toujours.

Chiffres :

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

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

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

Redis fsync toutes les secondes, disque dur

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 à chaque écriture, disque dur

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 à chaque écriture, NVMe (Samsung 960 PRO 1 To)

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 toutes les secondes, disque dur

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 chaque lot, mais attendez au moins 1 ms, disque dur

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)