2011-07-21 19 views
7

Estoy tratando de averiguar cómo migrar datos de un clúster Cassandra a otro clúster Cassandra de un tamaño de anillo diferente. .de un clúster de 5 nodos a un clúster de 7 nodos.Cómo migrar datos del clúster Cassandra de tamaño N a un clúster de tamaño diferente N +/- M

Empecé a mirar sstable2json, ya que crea un archivo json para el SSTable en ese nodo específico de cassandra. Mi idea era hacer esto para una familia de columnas en cada nodo del ring. Entonces en un anillo de 5 nodos, esto me da 5 archivos json, un archivo para los datos almacenados en la familia de columnas que reside en cada nodo.

Luego fusionaría los archivos json en un archivo, y usar json2sstable para importar a un nuevo clúster, de tamaño, digamos 7. Esperaba que cassandra luego replicara/balanceara los datos de manera uniforme a través de los nodos en el ring, pero acabo de leer que los SSTables son inmutables una vez que se escriben. Entonces, si hiciera lo que acabo de mencionar, terminaría con un anillo con todos los datos en mi familia de columnas en un nodo.

Entonces, ¿alguien me puede ayudar a descubrir el proceso para migrar datos de un clúster a un clúster diferente de un tamaño de anillo diferente?

Respuesta

9

mejor: el uso bin/sstableloader en los sstables desde el viejo anillo, para transmitir a la nueva.

Normalmente sstableloader se utiliza en una secuencia como esto:

  1. Crear sstables utilizando localmente SSTableWriter
  2. Uso sstableloader para transmitir los datos en las sstables a los nodos derecha (bin/sstableloader ruta-a-directorio -full-of-sstables). Se supone que el nombre del directorio es el espacio de claves, que será el caso si lo señala en un directorio de datos existente de Cassandra.

Puesto que usted está buscando para transmitir datos de un clúster Un existente a un nuevo cluter B, puede saltar directamente a la ejecución de sstableloader frente a los datos en cada nodo de clúster A.

Más detalles sobre el uso sstableloader en this blog post.

+0

Si escribo directamente en el escenario, ¿Cassandra replicará los datos en los otros nodos? Además, si pongo todos los archivos de datos de todos los nodos del anillo en una sola carpeta y ejecuto sstableloader en él, ¿no terminaré con datos duplicados, ya que los datos se replicaron en 3 nodos en el clúster original? – Turbo

+1

Sí, terminará con datos duplicados. La compactación se encargará de eso, por lo que no es un problema. Además: no es necesario "poner todos los archivos de datos en una sola carpeta", simplemente hazlo en el lugar. (Editado para aclarar). – jbellis

+0

Hola, jbellis, gracias por la información. Creo que esta es la ruta a seguir. Para agregar más información sobre mi escenario, estoy usando hadoop en ec2 para generar un modelo de datos y persistirlo en cassandra, también en ec2. Luego, cuando se construya el modelo, llevaré los datos de la casandra a mi red. Crearé un anillo de cassandra bastante grande en ec2 para obtener algunos beneficios de escalabilidad al generar el modelo. Pero el anillo de destino en mi red será más pequeño, probablemente a la mitad. Así que mi plan es bajar los archivos de datos de ec2 a mi red y luego importar los datos. más próximo comentario ... – Turbo

-1

Me atrevo a decir que este no es un problema tan grande como parece.

  1. crear su nueva anillo y definen las fichas para cada nodo de forma apropiada según http://wiki.apache.org/cassandra/Operations#Token_selection
  2. Importar datos en el nuevo anillo.
  3. El anillo se equilibrará en función de las fichas que haya definido http://wiki.apache.org/cassandra/Operations#Import_.2BAC8_export
+0

Dos preguntas. Cuando dice importar datos en el nuevo anillo, específicamente ¿cómo hago eso? ¿Qué herramientas? ¿Importa si el nuevo anillo tiene un tamaño diferente al del anillo original? – Turbo

+0

Los enlaces ya no funcionan. El segundo punto es vago e inútil – ftrujillo

0

No es necesario que use sstable2json. Si usted tiene el espacio se puede:

  1. obtener todos los sstables de todos los nodos en el anillo de edad
  2. poner a todos juntos en cada uno de los nuevos servidores (cambiar el nombre de cualquier cuales tienen los mismos nombres)
  3. ejecuta nodetool cleanup en cada nodo en el nuevo anillo y descartarán los datos que no les pertenecen.
+0

¿Funcionaría esto si los dos anillos son de diferentes tamaños? Digamos que el anillo original tiene 12 nodos, y el nuevo anillo es de 5 nodos. – Turbo

+0

Sí. Pero el script sstableloader mencionado por @jbellis en su respuesta es mejor. Realice una instantánea de los nodos actuales, luego ejecute sstableloader desde cada uno de los directorios instantáneos al nuevo clúster. – Zanson

0

Puede realizar algunos pasos de la siguiente manera: 1.Une 7 nodos en 5 clústeres de nodos y configura cada nodo con su propio token de anillo. En este momento, puede tener un clúster con 12 nodos. 2. Elimine 5 nodos del nuevo clúster en el paso 1. 3. Configure el token ring para cada nodo después de mover 5 nodos por su cuenta. 4. Reparar el clúster de 7 nodos.

Cuestiones relacionadas