MongoDB publicó un referencia comparando el rendimiento de MongoDB, Apache Cassandra y Couchbase Server en despliegues de un solo nodo para contrarrestar la un publicamos comparando el rendimiento de MongoDB y Couchbase Server en despliegues de 9 nodos. MongoDB rinde bien cuando 1) se limita a un único nodo, 2) no almacena muchos datos y 3) no soporta muchos usuarios. Este es un punto dulce para MongoDB.
MongoDB dio a conocer las bases de datos NoSQL al facilitar a los desarrolladores la creación de pruebas de concepto o pequeñas aplicaciones. Sin embargo, MongoDB no puede satisfacer las rigurosas demandas de los despliegues de producción. Couchbase Server, por otro lado, brilla cuando se despliega como base de datos distribuida. Se escala con facilidad para almacenar más datos, dar soporte a más usuarios y proporcionar un mayor rendimiento y un acceso de menor latencia a los datos.
1) La prueba comparativa de nodo único no responde a los requisitos de escalabilidad
Si desea comprobar el rendimiento de una base de datos con un conjunto de datos pequeño y unos pocos usuarios, realice una evaluación comparativa con una implantación de un único nodo. Si desea comprobar su rendimiento en un entorno de producción con un gran conjunto de datos y muchos usuarios, realice una prueba de rendimiento con una implementación en clúster.
Es importante no sólo medir el rendimiento a escala, sino medir el rendimiento cumpliendo los requisitos de la empresa. Por ejemplo, la alta disponibilidad.
¿Por qué MongoDB no comparó el rendimiento de los despliegues distribuidos? Bueno, es difícil para MongoDB escalar más allá de un único nodo.
Como señala InformationWeek (enlace), el escalado no es lineal. Añadir nodos a un conjunto de réplicas MongoDB no aumentará el rendimiento de escritura porque cada escritura seguirá siendo ejecutada por un único nodo - el nodo primario. Lo mismo ocurre con los fragmentos de MongoDB: cada escritura seguirá siendo ejecutada por los nodos primarios. Si hay tres shards con tres nodos por shard, las escrituras serán ejecutadas por los tres nodos primarios.
2) La prueba comparativa aplicó un escenario de escritura diferente para Couchbase Server - No es una comparación de manzanas con manzanas.
MongoDB realizaba una operación por escritura - la actualización. Sin embargo, MongoDB inadvertidamente hizo que Couchbase Server realizara dos operaciones por escritura: una lectura, una actualización. Esto limitaba el rendimiento de escritura de Couchbase Server.
MongoDB (con WiredTiger) y Couchbase Server aprovechan el bloqueo a nivel de documento. Si dos clientes actualizan el mismo documento al mismo tiempo, uno de ellos fallará y tendrá que reintentar la actualización. Este es el caso tanto para MongoDB como para Couchbase Server. Fue el escenario de escritura para MongoDB en este benchmark, pero no para Couchbase Server.
Otro escenario de escritura es cuando necesitas asegurarte de que un cliente no puede actualizar un documento si ha sido actualizado antes por otro cliente. En este escenario de escritura, Couchbase Server soporta compare-and-swap mientras que MongoDB recomienda "Update Document if Current". patrón. Este era el escenario de escritura para Couchbase Server, pero no para MongoDB.
¿Por qué MongoDB hace que Couchbase Server realice la comparación y el intercambio, pero no implementa su propio patrón "Actualizar documento si es actual"?
3) La comparativa utilizó un cliente Couchbase obsoleto en lugar del actual
MongoDB eligió usar una librería cliente obsoleta lanzada en 2013 para Couchbase Server, que limitaba el rendimiento de Couchbase Server. El pasado mes de septiembre lanzamos una nueva biblioteca de clientes basada en Netty y RxJava, a la que siguieron versiones menores en febrero y marzo.
¿Por qué MongoDB haría un benchmark de Couchbase Server con una librería cliente obsoleta pero se haría un benchmark a sí mismo con su última librería cliente?
4) Durabilidad de un único nodo frente a durabilidad de una base de datos distribuida
El objetivo de la durabilidad es garantizar que los datos no se pierdan cuando falla un servidor. En este benchmark, como se realizó con despliegues de un solo nodo, los datos sólo pueden ser duraderos cuando se escriben en el disco. Es la misma limitación de las bases de datos relacionales tradicionales.
Hoy en día, las bases de datos distribuidas se basan en un enfoque moderno de la durabilidad que distribuye el riesgo de pérdida de datos: replican los datos en múltiples nodos. Couchbase Server es único en el sentido de que, aunque escribe en disco como una base de datos convencional, también aprovecha la replicación más rápida de memoria a memoria entre nodos. Los datos no sólo son duraderos, sino que están altamente disponibles. Se puede replicar a nodos en diferentes servidores, diferentes bastidores o diferentes centros de datos.
Dicho esto, si MongoDB hubiera usado la última librería cliente, el rendimiento de escritura de Couchbase Server habría sido al menos 10 veces mayor. La librería cliente de hace dos años (1.1.8) esperaba un mínimo de 100ms antes de comprobar si la escritura se había escrito en disco. En una versión posterior (1.4.x), 10ms. En la última versión (2.x), 10µs. Esta es la razón por la que siempre debes comparar las bases de datos con sus últimas librerías cliente, no con las de hace dos años.
Reglas MongoDB Despliegues de nodo único
MongoDB es adecuado para una prueba de concepto o una pequeña aplicación que tiene un pequeño conjunto de datos y un puñado de usuarios. Couchbase Server es más adecuado para aplicaciones con más datos, más usuarios y mayores requisitos de rendimiento / menor latencia, aquellas que se benefician de un despliegue distribuido. De hecho, Couchbase Server es a menudo seleccionado para alimentar aplicaciones de misión crítica - pequeñas o grandes, de consumo o empresariales, sociales o de juegos - donde las bases de datos relacionales tradicionales no pueden proporcionar la escalabilidad o el rendimiento requerido.
Debatir sobre Noticias Hacker
Para su información referencia MongoDB y Couchbase Server con despliegues de 9 nodos.
Es marketing hacer una prueba de rendimiento en la que el oponente siempre perderá, pero responder sin una prueba de rendimiento es un poco como gritar "¡No, somos mejores! Lo prometemos. No te fíes de ellos".
No estoy seguro de entender. ¿Qué quería decir con responder sin una prueba de rendimiento?
Para que conste, el benchmark que MongoDB promocionó (al que esta entrada de blog es una respuesta) se ejecutó para contrarrestar un benchmark anterior con clusters más grandes (9 nodos). La prueba está disponible aquí: http://news.avalonconsult.com/…
El TLDR es que para cargas de trabajo altamente concurrentes en un cluster de nueve nodos, Couchbase Server maneja mucho más tráfico que MongoDB sin que los tiempos de respuesta se ralenticen. Esto es más representativo de las cargas de trabajo de producción que preocupan a nuestros clientes que una carrera de arrastre de un solo nodo.
Buenos puntos Shane, pero me recuerda algo que Mike Stonebraker dijo hace muchos años: \"... cualquier persona que diseña un punto de referencia se encuentra en una situación \ 'no win\', es decir, sólo puede ser criticado. Los observadores externos encontrarán fallos en el punto de referencia por considerarlo artificial o incompleto de un modo u otro. Los vendedores que obtengan malos resultados en el punto de referencia lo criticarán sin piedad". En mi opinión, lo que estaría muy bien es ver puntos de referencia de clientes reales en lugar de más cifras de YCSB. Pero como he trabajado en el pasado en evaluaciones comparativas del rendimiento de bases de datos, conozco las dificultades que entraña.
Ralph, ¿cómo fue engañoso?
Bud Light sigue siendo la cerveza más popular del país. Sin embargo, no es una buena cerveza.
Ralph, no trabajo para Couchbase. No puedo comentar sobre el reciente informe de referencia de Avalon, ya que no lo he leído todavía. Ten cuidado con DB-engines.com - es un índice de popularidad que incluye menciones/búsquedas en la web y no dice nada sobre el número de instalaciones.
YCSB actualiza un campo aleatorio de cada diez durante las actualizaciones.
MongoDB tiene una actualización que actualiza selectivamente un solo campo (al igual que la sentencia UPDATE de SQL), Couchbase no tiene eso.
Así que si no lees primero el documento, sobrescribirías los diez campos existentes con uno nuevo (que es lo que hizo el benchmark de Thumbtack que publicaste el año pasado). Su propio punto de referencia Avalon leer el documento con el fin de sustituir a uno de los campos con el nuevo valor, pero luego reemplazan documento existente - por lo tanto, sobrescribir las actualizaciones que se produjeron en el ínterin. El uso de CAS es correcto para preservar realmente todas las actualizaciones que se produzcan. CAS en MongoDB debe ser utilizado igual que en RDBMS sólo cuando se necesita estar actualizando un documento durante mucho tiempo (edición humana de un documento, por ejemplo).
Para ser honesto, creo que el comando $set es útil cuando el escenario de escritura incluye actualizaciones a diferentes campos en el mismo documento por múltiples clientes en la misma ventana que no leen el documento primero.
Por lo visto, no está familiarizado con YCSB. La actualización sólo proporciona un campo con un nuevo valor. Si no lees el documento completo, ¿cómo lo actualizas en Couchbase?
¿Cuál es el equivalente en Couchbase de UPDATE ycsbtable SET field6=newvalue WHERE primarykey=9999?
Tienes razón. Como dije, creo que la operación $set es útil para aplicaciones que actualizan campos específicos sin leer el documento primero. Para otras aplicaciones, ese puede o no ser el caso. Por ejemplo, los perfiles de usuario. Si un usuario quiere actualizar su perfil, la aplicación lo lee primero. Se muestra, y el usuario lo edita. Con Couchbase Server, la aplicación podría modificar el documento que leyó basándose en las ediciones del usuario y luego actualizarlo. Con MongoDB, la aplicación podría utilizar el comando $set. En este contexto, la aplicación leería el documento primero ya sea de MongoDB o de Couchbase Server.
tu propio benchmark hizo dos operaciones, leyó el documento y luego lo sobreescribió - porque no hay otra forma de actualizar un campo. y tu propio benchmark ignoró los conflictos con otros hilos.
tu código está mal.
https://github.com/kruthar/YCS…
No tienes que leer el documento primero.
El objetivo de YCSB es medir el rendimiento de una operación de actualización. En una aplicación real, el documento ya se habría leído. Por ejemplo, para rellenar un formulario de edición. Se mide el rendimiento de la lectura para estimar cuánto tardará en mostrarse el formulario. Cuando se envía el formulario, se modifica el documento y se actualiza. Se mide el rendimiento de la actualización para estimar el tiempo que se tardará en mostrar la confirmación. Puede crear un documento, generar los datos para sus campos con YCSB y realizar una actualización con él. Problema resuelto.
El benchmark Avalon no realiza operaciones de comparación e intercambio para MongoDB o Couchbase Server. Una actualización parcial no proporciona la misma garantía que una operación CAS. Es una forma opcional de control de concurrencia optimista que evita que un cliente actualice un documento si no es consciente de actualizaciones previas.
Por ejemplo, la cuenta del titular de una tarjeta de crédito. En primer lugar, un cliente comprueba el campo de pago para ver si se ha efectuado alguno. No lo ha hecho. A continuación, mientras el primer cliente comprueba el campo de pago, un segundo cliente actualiza el campo de pago a "recibido" porque se acaba de procesar uno. Por último, el primer cliente actualiza el campo de estado a "retrasado" porque no está al tanto de la actualización realizada por el segundo cliente. Aunque es bueno tener actualizaciones parciales, no resolverían este problema. Permitirían a estos dos clientes actualizar diferentes campos al mismo tiempo, pero el resultado no sería válido. Por eso tenemos CAS.
Por cierto, para Couchbase Server 4.0 es esto:
http://docs.couchbase.com/deve…
UPDATE ycsbtable USE KEYS \"9999" SET field6 = \"newvalue\"
Por lo menos, su prueba comparativa incluía el código utilizado para que todo el mundo lo viera. Si has ejecutado tu propio benchmark, muestra tu código.
Debería haber incluido la URL del repositorio de GitHub. Aquí la tiene:
https://github.com/kruthar/cou…