2011-01-26 17 views
8

Tengo que elegir Cassandra o MongoDB (u otra base de datos nosql, acepto sugerencias) para un proyecto con muchas inserciones (1M/día). Así que creo una pequeña prueba para medir el rendimiento de escritura. Aquí está el código para insertar en Cassandra:Cassandra bajo rendimiento?

import time 
import os 
import random 
import string 
import pycassa 

def get_random_string(string_length): 
    return ''.join(random.choice(string.letters) for i in xrange(string_length)) 

def connect(): 
    """Connect to a test database""" 
    connection = pycassa.connect('test_keyspace', ['localhost:9160']) 
    db = pycassa.ColumnFamily(connection,'foo') 
    return db 

def random_insert(db): 
    """Insert a record into the database. The record has the following format 
    ID timestamp 
    4 random strings 
    3 random integers""" 
    record = {} 
    record['id'] = str(time.time()) 
    record['str1'] = get_random_string(64) 
    record['str2'] = get_random_string(64) 
    record['str3'] = get_random_string(64) 
    record['str4'] = get_random_string(64) 
    record['num1'] = str(random.randint(0, 100)) 
    record['num2'] = str(random.randint(0, 1000)) 
    record['num3'] = str(random.randint(0, 10000)) 
    db.insert(str(time.time()), record) 

if __name__ == "__main__": 
    db = connect() 
    start_time = time.time() 
    for i in range(1000000): 
     random_insert(db) 
    end_time = time.time() 
    print "Insert time: %lf " %(end_time - start_time) 

Y el código para insertar en Mongo es lo mismo cambiar la función de conexión:

def connect(): 
    """Connect to a test database""" 
    connection = pymongo.Connection('localhost', 27017) 
    db = connection.test_insert 
    return db.foo2 

Los resultados son ~ 1046 segundos para insertar en Cassandra, y ~ 437 para terminar en Mongo. Se supone que Cassandra es mucho más rápido que Mongo al insertar datos. Entonces, ¿Qué estoy haciendo mal?

+0

¿Se han probado de nuevo con más hilos, de ser así se puede compartir los resultados? – sirmak

Respuesta

12

No hay equivalente al modo inseguro de Mongo en Cassandra. (Solíamos tener uno, pero lo sacamos, porque es simplemente una mala idea.)

El otro problema principal es que usted está haciendo inserciones de un solo hilo. Cassandra está diseñado para alta concurrencia; necesitas usar una prueba multiproceso. Vea el gráfico en la parte inferior de http://spyced.blogspot.com/2010/01/cassandra-05.html (los números reales tienen más de un año de antigüedad, pero el principio sigue siendo cierto).

La distribución de origen de Cassandra tiene una prueba incluida en contrib/stress.

+0

Voy a hacer algunos hilos. Gracias por tu respuesta, jbellis !! – fasouto

4

Si no me equivoco, Cassandra le permite especificar si está o no haciendo una inserción de "modo seguro" equivalente a MongoDB. (Yo no recordar el nombre de esa característica en Cassandra)

En otras palabras, Cassandra se puede configurar para escribir en el disco y luego regresar a diferencia de la configuración de MongoDB por defecto que devuelve inmediatamente después de realizar una inserción sin saber si la inserción fue exitosa o no. Simplemente significa que su aplicación nunca espera un pase/falla del servidor.

Puede cambiar ese comportamiento utilizando el modo seguro en MongoDB, pero se sabe que esto tiene un gran impacto en el rendimiento. Habilite el modo seguro y puede ver diferentes resultados.

+0

Sí, su respuesta tiene todo el sentido. Ahora que la prueba se está ejecutando en modo seguro, publicaré los resultados. – fasouto

+0

¡Uy! Ejecuto la prueba 3 veces más con safe_mode y ahora el tiempo promedio es de 698 segundos. Es más pero aún mejor que Cassandra :( – fasouto

+0

Pensé que MongoDB aún sería más rápido, pero creo que ahora estás obteniendo una mejor comparación. –

1

Aprovechará el verdadero poder de Cassandra una vez que tenga varios nodos en ejecución. Cualquier nodo podrá realizar una solicitud de escritura. El subprocesamiento múltiple de un cliente solo está inundando más solicitudes a la misma instancia, lo que no ayudará después de un punto.

  • Compruebe el registro de cassandra de los eventos que ocurren durante sus pruebas. Cassandra iniciará una escritura en el disco una vez que el Memtable esté lleno (esto es configurable, lo hará lo suficientemente grande y se ocupará en RAM + grabaciones de registro de commit). Si se produce un disco de escritura para Memtable durante la prueba, se ralentizará. No sé cuándo MongoDB escribe en el disco.
1

¿Puedo sugerir que eche un vistazo a Membase aquí? Se usa exactamente de la misma manera que memcached y se distribuye completamente para que pueda escalar continuamente su tasa de entrada de escritura simplemente agregando más servidores y/o más RAM.

Para este caso, definitivamente querrá ir con un Moxi del lado del cliente para darle el mejor rendimiento. Echa un vistazo a nuestra wiki: wiki.membase.org para ver ejemplos y avísame si necesitas más instrucciones ... Me complace guiarte en esto y estoy seguro de que Membase puede manejar esta carga fácilmente.

+0

¿Por qué el plumón? -votar? El OP dice que (s) está abierto a sugerencias con respecto al DB NoSQL para usar. – user183037