sql >> Base de Datos >  >> NoSQL >> Redis

Redis AOF fsync (SIEMPRE) frente al árbol LSM

LSM es AOF que a veces quieres leer. Haces un poco de trabajo por encima de la cabeza para poder leerlo más rápido más tarde. Redis está diseñado para que nunca o solo en un caso especial lo lea. Por otro lado, Cassandra a menudo lo lee para atender solicitudes.

Y lo que Redis llama lento es en realidad muy, muy rápido para una base de datos como Cassandra.

============================ACTUALIZAR

Resulta que saqué conclusiones demasiado pronto. Desde el punto de vista del diseño, todo lo anterior es cierto, pero la implementación difiere mucho. A pesar de que Cassandra afirma una durabilidad absoluta, no fsync en cada transacción y no hay forma de forzarlo (pero cada transacción podría sincronizarse). Lo mejor que pude hacer es 'fsync en modo por lotes al menos 1 ms después del fsync anterior'. Significa que para el punto de referencia de 4 subprocesos que estaba usando, estaba haciendo 4 escrituras por fsync y los subprocesos estaban esperando que se hiciera fsync. Por otro lado, Redis hizo fsync en cada escritura, por lo que 4 veces más a menudo. Con la adición de más subprocesos y más particiones de la tabla, Cassandra podría ganar aún más. Pero tenga en cuenta que el caso de uso que describió no es típico. Y aún se aplican otras diferencias arquitectónicas (Cassandra es buena en particiones, Redis es buena en mostradores, LUA y otras).

Números:

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

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

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

Redis fsync cada segundo, 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 cada escritura, 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 cada escritura, 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 cada segundo, 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 cada lote, pero espera al menos 1 ms, 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)