2010-06-17 9 views
6

Todavía estamos evaluando a Cassandra para nuestra tienda de datos. Como una prueba simple de muy, inserté un valor para 4 columnas en la familia de columnas Keyspace1/Standard1 en mi máquina local que asciende a aproximadamente 100 bytes de datos. Luego lo leí tan rápido como pude por la tecla de la fila. Puedo leerlo a 160,000/segundo. Estupendo.Velocidad de lectura aleatoria de Cassandra

Luego puse un millón de registros similares, todos con claves en forma de X.Y donde X en (1..10) y Y en (1..100,000) y solicité un registro aleatorio. El rendimiento cayó a 26,000 consultas por segundo. Esto todavía está muy por encima del número de consultas que necesitamos admitir (alrededor de 1.500/seg)

Finalmente coloqué diez millones de registros desde 1.1 hasta 10.1000000 y consulté aleatoriamente uno de los 10 millones de registros. El rendimiento es abismal a 60 consultas por segundo y mi disco se agita como loco.

También verifiqué que si pido un subconjunto de los datos, digamos los 1,000 registros entre 3,000,000 y 3,001,000, regresa lentamente al principio y luego cuando caché, acelera hasta 20,000 consultas por segundo y mi disco deja de volverte loco

He leído que las personas están almacenando miles de millones de registros en Cassandra y llevándolos a 5-6k por segundo, pero no puedo llegar a nada con solo 10mil registros. ¿Alguna idea de lo que estoy haciendo mal? ¿Hay alguna configuración que deba cambiar de los valores predeterminados? Estoy en una caja Core i7 overclocked con 6gigs de ram, así que no creo que sea la máquina.

Aquí está mi código en busca de registros, que estoy de desove en 8 hilos de pedir un valor de una columna a través de una fila de clave:

ColumnPath cp = new ColumnPath(); cp.Column_family = "Standard1"; cp.Column = utf8Encoding.GetBytes ("sitio"); string clave = (1 + sRand.Next (9)) + "." + (1 + sRand.Next (1000000)); ColumnOrSuperColumn logline = client.get ("Keyspace1", clave, cp, ConsistencyLevel.ONE);

Gracias por cualquier idea

Respuesta

-1

Parece que usted no tiene suficiente memoria RAM para almacenar todos los registros en la memoria.

Si cambia al disco, entonces tiene problemas y se espera que el rendimiento disminuya significativamente, especialmente si es de lectura aleatoria.

También podría intentar comparar otras alternativas populares, como Redis o VoltDB.

+0

Definitivamente no podemos incluirlos a todos en la memoria, pero 10mil registros no parece mucho. ¿Cómo se enfrentan las personas con miles de millones de registros? –

+0

La clave es mantener tanto como sea posible en la memoria RAM, no en el disco. Para gestionar miles de millones de registros, los distribuirá en varias máquinas y los utilizará en su conjunto. Aquí hay un artículo muy bueno [1] sobre cómo se logra esto en Riak, otra popular solución NoSQL. Muchos de los aspectos discutidos en el artículo también se aplican a Cassandra, ya que están basados ​​en las mismas ideas fundamentales. [1]: https://wiki.basho.com/display/RIAK/An+Introduction+to+Riak –

4

lecturas puramente aleatorias se trata del comportamiento de peor caso para el almacenamiento en caché que su sistema operativo (y Cassandra si configura la clave o el caché de filas) intenta hacer.

si mira contrib/py_stress en la distribución fuente de Cassandra, tiene un stdev configurable para realizar lecturas aleatorias pero con algunas teclas más calientes que otras. esto será más representativo de la mayoría de las cargas de trabajo del mundo real.

+0

Desafortunadamente, tendremos visitantes aleatorios que lleguen a nuestro sitio a intervalos aleatorios - no hay distribución que podamos saber de antemano para obtener más éxitos de caché. ¿Estamos simplemente limitados a la velocidad del disco en este caso? –

+0

Nada es realmente aleatorio. Su desempeño en la vida real es muy probable que sea mejor que sus pruebas. Dicho eso, ¿Cassandra está usando realmente toda la memoria de la caja? 60 lecturas/segundo es tan horrible en su hardware que es probable que tenga un problema de instalación (bueno, dependiendo de qué tan horribles sean sus discos). Además, asegúrese de que Cassandra no esté utilizando el intercambio como si se tratara de memoria física, lo que crea un problema de rendimiento patológico tanto en Cassandra como en el sistema operativo que trata de optimizar las páginas en memoria de manera competitiva. –

3

Agregue más nodos Cassandra y deles mucha memoria (-Xms/-Xmx). Cuantas más instancias de Cassandra tenga, los datos se dividirán entre los nodos y será mucho más probable que estén en la memoria o se acceda más fácilmente desde el disco. Serás muy limitado al tratar de escalar una sola CPU de clase de estación de trabajo. Además, verifique la configuración predeterminada -Xms/-Xmx. Creo que el valor predeterminado es 1GB.

-6

VoltDB sin duda puede manejar este nivel de rendimiento de lectura, así como escribe y funciona con un clúster de servidores. Como solución en la memoria, necesita construir un clúster lo suficientemente grande para contener todos sus datos en la RAM.