Migración de cubos a colecciones y ámbitos mediante eventos: Parte 2
Una vez más (como ya hice en la primera parte) quiero destacar un excelente blog escrito por Shivani Gupta, Cómo migrar a ámbitos y colecciones en Couchbase 7.0que cubre en gran detalle otros métodos para migrar documentos basados en buckets a Scopes y Collections en Couchbase. Te animo a leer también sobre los múltiples métodos no-Eventing que Shivani toca.
Tanto si eres nuevo en Couchbase o veterinario experimentado, es probable que haya oído hablar de los Scopes y Collections. Si estás listo para probarlos, este artículo te ayuda a hacerlo realidad.
Los ámbitos y las colecciones son una nueva función introducida en Servidor Couchbase 7.0 que te permite organizar lógicamente los datos dentro de Couchbase. Para saber más, lea esta introducción a Ámbitos y colecciones.
Deberías aprovechar Scopes y Collections si quieres mapear tu RDBMS heredado a una base de datos de documentos o si estás intentando consolidar cientos de microservicios y/o tenants en un único Couchbase (lo que se traduce en un coste total de propiedad mucho menor).
Uso de eventos para la migración de ámbitos y colecciones
En el artículo anterior (Parte 1), discutí la mecánica de un método de alto rendimiento para migrar desde una versión anterior de Couchbase a Scopes y Collections en Couchbase 7.0 basado en Eventos.
Sólo se necesita el Servicio de Datos (o KV) y el Servicio de Eventos para migrar de buckets a colecciones. En un cluster de Couchbase grande y bien ajustado, puedes migrar más de 1 millón de documentos por segundo. Sí, sin N1QL, y sin necesidad de índices.
En este artículo de seguimiento, proporcionaré una metodología sencilla totalmente automatizada para realizar grandes migraciones con docenas (o incluso cientos) de tipos de datos a través de un simple Perl guión.
Recapitulación de la función final de Eventing: ConvertBucketToCollections
En la Parte 1 teníamos los siguientes ajustes para la Función de Eventos. Nota para cada tipo único, "cerveza" y "cervecería"tuvimos que añadir un alias de Bucket binding a la colección destino en modo "lectura+escritura". Además tuvimos que crear las colecciones de destino, en este caso "datos.masivos.cerveza" y "datos.masivos.cervecería“
En la Parte 1 teníamos el siguiente código JavaScript en nuestra Función Eventing. Nota a cada tipo único, "cerveza" y "cervecería"Tuvimos que replicar un bloque de código JavaScript y actualizar la referencia del alias de enlace correspondiente o la colección de destino en el servicio de datos de Couchbase.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
función OnUpdate(doc, meta) { si (!doc.tipo) devolver; var tipo = doc.tipo; si (DROP_TYPE) borrar doc.tipo; si (tipo === cerveza) { si (DO_COPY) cerveza_col[meta.id] = doc; si (DO_DELETE) { si(!cerveza_col[meta.id]) { // control de seguridad registro("skip delete copy not found type=" + doc.tipo + ", meta.id=" + meta.id); } si no { borrar src_col[meta.id]; } } } si (tipo === cervecería) { si (DO_COPY) cerveceria_col[meta.id] = doc; si (DO_DELETE) { si(!cerveceria_col[meta.id]) { // control de seguridad registro("skip delete copy not found type=" + doc.tipo + ", meta.id=" + meta.id); } si no { borrar src_col[meta.id]; } } } } |
La técnica de la Parte 1 funciona, pero ¿y si tengo muchos tipos?
Usando Eventing se pueden hacer migraciones como se muestra en la Parte 1, pero parece un poco de trabajo para configurar las cosas.
Si tiene 80 tipos diferentes, utilizar esta técnica (tanto para crear la función de eventos como para crear los espacios clave necesarios) supondría una cantidad increíble de esfuerzo propenso a errores. Si tuviera 80 tipos en un cubo para migrar y dividir, no me gustaría hacer todo el trabajo descrito anteriormente a mano para cada tipo.
Automatizar mediante CustomConvertBucketToCollections.pl
Para resolver este problema, escribí un pequeño Perl guión, CustomConvertBucketToCollections.plque genera dos archivos:
- CustomConvertBucketToCollections.json, es una función completa de Eventing que realiza todo el trabajo descrito en este post.
- MakeCustomKeyspaces.sh, es un archivo shell para construir todos los espacios de claves necesarios e importar la función Eventing generada.
Puede encontrar este script en GitHub en https://github.com/jon-strabala/cb-buckets-to-collections.
Nota, el script CustomConvertBucketToCollections.pl requiere que ambos Perl (lenguaje práctico de extracción e informe) y también jq (un procesador JSON de línea de comandos ligero y flexible).
Ejemplo: Migración de 250 millones de registros con 80 tipos diferentes
Tenemos 250 millones de documentos en keyspace "input._default._default" con 80 tipos diferentes y desea reorganizar los datos por tipo en colecciones bajo el alcance "salida.reorg” por el tipo de propiedad. Tenemos un clúster de AWS de tres instancias r5.2xlarge, todas ellas ejecutando el servicio de datos y el servicio nocturno.
El cubo de entrada "entrada" en este ejemplo está configurado con una cuota de memoria de 16000 MB.
A continuación utilizo el CustomConvertBucketToCollections.pl Perl de GitHub en https://github.com/jon-strabala/cb-buckets-to-collections. Como puedes ver puede ser trivial hacer migraciones usando un script automatizado.
Paso 1: Configuración única
1 2 3 4 5 6 |
git clonar https://github.com/jon-strabala/cb-buckets-to-collections cd cb-cubos-a-colecciones SENDERO=${SENDERO}:/op/couchbase/papelera cd cb-cubos-a-colecciones/ chmod +x CustomConvertBucketToCollections.pl big_data_test_gen.pl big_data_test_load.sh |
Paso 2: Crear documentos de prueba 250M
Ejecutar el interactivo big_data_test_load.sh mando:
1 |
./big_data_test_load.sh |
Parámetros de configuración de entrada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Este script bash, 'big_data_test_load.sh', cargará millones de pruebas # documentos en un ._default._default en 1 millón de trozos como # creado por el script perl 'big_data_test_gen.pl'. Los datos # tienen 80 valores de tipo de documento diferentes distribuidos uniformemente. Entre en el número de prueba docs a crear en el millones 250 Entre en el cubo (o objetivo) a carga prueba docs en entrada Entre en el nombre de usuario:contraseña a su grupo admin:jtester Entre en el nombre de host o ip dirección de su grupo localhost Entre en el número de hilos para cbimport 8 Will carga 2 millones prueba docs en espacio clave entrada.Por defecto.Por defecto (el por defecto para cubo entrada) tipo ^C a abortar, corriendo en 5 sec. Ejecutar .... gen/cbimport bloque: 1 de 2, iniciar en Lun 01 Nov 2021 11:06:01 AM PDT JSON `archivo://./data.json` importado a `couchbase://localhost` con éxito Documentos importado: 1000000 Documentos fallido: 0 ** eliminado 23 líneas ** gen/cbimport bloque: 250 de 250, iniciar en Lun 01 Nov 2021 11:24:05 AM PDT JSON `archivo://./data.json` importado a `couchbase://localhost` con éxito Documentos importado: 1000000 Documentos fallido: 0 |
Ahora debería haber 250 millones de documentos de prueba en el espacio de claves. input._default._default.
Paso 3: Generar la función Eventing y el script Keyspace
Ejecutar el interactivo CustomConvertBucketToCollections.pl mando:
1 |
./CustomConvertBucketToCollections.pl |
Parámetros de configuración de entrada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Entre en el cubo (o fuente) a convertir a colecciones [viaje-muestra]: entrada Entre en el nombre de usuario:contraseña a su grupo [admin:jtester]: Entre en el nombre de host o ip dirección de su grupo [localhost]: Entre en el destino cubo.alcance [mybucket.myscope]: salida.reorg Entre en el Eventos almacenamiento espacio clave cubo.alcance.colección [rr100.concurso.metadatos]: Entre en el número de trabajadores (LTE # más núcleos es más rápido) [8]: Sonda el cubo (o fuente) a determine el configure de tipos [Y]: muestras a través de el cubo (o fuente) a encontrar tipos [20000]: 100000 máximo estimado # de tipos en el cubo (o fuente) [30]: 100 Escaneado entrada para tipo propiedad este mayo toma a algunos segundos rizo -s -u Administrador:contraseña http://localhost:8093/query/service -d \ 'statement=INFERIR `input`._default._default WITH {"tamaño_muestra": 100000, "num_sample_values": 100, "similarity_metric": 0.1}' \ | jq '.resultados[][].propiedades.tipo.muestras | .[]' | ordenar -u TIPOS ENCONTRADO: t01 t02 t03 t04 t05 t06 t07 t08 t09 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43 t44 t45 t46 t47 t48 t49 t50 t51 t52 t53 t54 t55 t56 t57 t58 t59 t60 t61 t62 t63 t64 t65 t66 t67 t68 t69 t70 t71 t72 t73 t74 t75 t76 t77 t78 t79 t80 Generar Eventos Función: CustomConvertBucketToCollections.json Generar Espacio clave comandos: MakeCustomKeyspaces.sh |
En el interactivo Perl guión anterior, se modificaron cuatro de las opciones predeterminadas anteriores.
Paso 3: Actualice MakeCustomKeyspaces.sh (según sea necesario)
Puedes simplemente "vi MakeCustomKeyspaces.sh"y modifique los valores necesarios. Opto por utilizar el método Unix sed para aumentar el tamaño de la RAM del cubo "salida" de 100 a 1600
1 2 |
cat MakeCustomKeyspaces.sh | sed -e 's/\(^.*cubo=salida.*ramsize=\)100 \(\.*\)/\116000 \2/' > tmp mv tmp MakeCustomKeyspaces.sh |
Paso 4: Ejecute el script MakeCustomKeyspaces.sh
1 |
sh ./MakeCustomKeyspaces.sh |
a continuación:
1 2 3 4 5 6 7 8 9 10 |
ÉXITO: Cubo creado ÉXITO: Alcance creado ÉXITO: Colección creado ÉXITO: Cubo creado ÉXITO: Alcance creado ÉXITO: Colección creado ÉXITO: Colección creado ** eliminado 77 líneas ** ÉXITO: Colección creado ÉXITO: Eventos importado |
Paso 5: Actualizar la interfaz de usuario de Couchbase en la página de eventos
Para encontrar la nueva función de eventos (o función actualizada) en la interfaz de usuario de Couchbase, vaya a la página de eventos y actualice su navegador web.
Paso 6: Implantar CustomConvertBucketToCollections
En la interfaz de usuario de Couchbase, vaya a la página de eventos y despliegue la función de eventos "CustomConvertBucketToCollections“.
En unos 45 minutos la reorganización debería estar completamente hecha.
En efecto, todos los documentos están reorganizados por tipo como colecciones. En este modesto clúster, se procesaron a 93K docs/seg.
Reflexiones finales
Si le ha resultado útil esta serie de artículos y está interesado en seguir aprendiendo sobre el concurso completo, haga clic aquí. el servicio de eventos Couchbase.
Espero que encuentre el CustomConvertBucketToCollections.pl Perl de GitHub en https://github.com/jon-strabala/cb-buckets-to-collections una herramienta valiosa en su arsenal cuando necesite migrar un cubo con muchos tipos a un paradigma de colecciones.
Siéntase libre de mejorar el script CustomConvertBucketToCollections.pl para utilizar un archivo de configuración intermedio al Eventing Perl donde se pueden ajustar todos los parámetros. A continuación, utilice el archivo de configuración intermedio para crear la función de eventos y el script de shell de configuración.
Ejemplo de archivo de configuración intermedio:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[ { "src_ks": "input._default._default", "dst_ks": "salida.myscope.t01", "create_dst_ks": verdadero, "dst_copy": verdadero, "src_del": verdadero, "dst_remove_type": verdadero }, { "src_ks": "input._default._default", "dst_ks": "salida.myscope.t02", "create_dst_ks": verdadero, "dst_copy": verdadero, "src_del": verdadero, "dst_remove_type": verdadero }, { "src_ks": "input._default._default", "dst_ks": "salida.myscope.t03", "create_dst_ks": verdadero, "dst_copy": verdadero, "src_del": verdadero, "dst_remove_type": verdadero } ] |
Recursos
- Descargar: Descargar Couchbase Server 7.0
- Scriptlet de Eventing: Función: ConvertBucketToCollections
- GitHub: Herramienta Perl: cb-buckets-to-collections.pl
Referencias
- Documentación sobre eventos de Couchbase
- Novedades: Couchbase Server 7.0
- Cómo migrar a ámbitos y colecciones en Couchbase 7.0
- Otros blogs de Couchbase sobre Eventing
Me encantaría que me contaras qué te han parecido las capacidades de Couchbase y el servicio Eventing, y cómo benefician a tu negocio de cara al futuro. Por favor, comparte tu opinión a través de los comentarios de abajo o en los foros de Couchbase.