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 |
function OnUpdate(doc, meta) { if (!doc.type) return; var type = doc.type; if (DROP_TYPE) delete doc.type; if (type === 'beer') { if (DO_COPY) beer_col[meta.id] = doc; if (DO_DELETE) { if(!beer_col[meta.id]) { // safety check log("skip delete copy not found type=" + doc.type + ", meta.id=" + meta.id); } else { delete src_col[meta.id]; } } } if (type === 'brewery') { if (DO_COPY) brewery_col[meta.id] = doc; if (DO_DELETE) { if(!brewery_col[meta.id]) { // safety check log("skip delete copy not found type=" + doc.type + ", meta.id=" + meta.id); } else { delete 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 clone https://github.com/jon-strabala/cb-buckets-to-collections cd cb-buckets-to-collections PATH=${PATH}:/opt/couchbase/bin cd cb-buckets-to-collections/ 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 |
# This bash script, 'big_data_test_load.sh', will load <N> million test # documents into a <bucket>._default._default in 1 million chunks as # created by the perl script 'big_data_test_gen.pl'. The data will # have 80 different document type values evenly distributed. Enter the number of test docs to create in the millions 250 Enter the bucket (or target) to load test docs into input Enter the username:password to your cluster admin:jtester Enter the hostname or ip address of your cluster localhost Enter the number of threads for cbimport 8 Will load 2 million test docs into keyspace input._default._default (the default for bucket input) type ^C to abort, running in 5 sec. Running .... gen/cbimport block: 1 of 2, start at Mon 01 Nov 2021 11:06:01 AM PDT JSON `file://./data.json` imported to `couchbase://localhost` successfully Documents imported: 1000000 Documents failed: 0 ** removed 23 lines ** gen/cbimport block: 250 of 250, start at Mon 01 Nov 2021 11:24:05 AM PDT JSON `file://./data.json` imported to `couchbase://localhost` successfully Documents imported: 1000000 Documents failed: 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 |
Enter the bucket (or source) to convert to collections [travel-sample]: input Enter the username:password to your cluster [admin:jtester]: Enter the hostname or ip address of your cluster [localhost]: Enter the destination bucket.scope [mybucket.myscope]: output.reorg Enter the Eventing storage keyspace bucket.scope.collection [rr100.eventing.metadata]: Enter the number of workers (LTE # cores more is faster) [8]: Probe the bucket (or source) to determine the set of types [Y]: samples across the bucket (or source) to find types [20000]: 100000 maximum estimated # of types in the bucket (or source) [30]: 100 Scanning input for 'type' property this may take a few seconds curl -s -u Administrator:password https://localhost:8093/query/service -d \ 'statement=INFER `input`._default._default WITH {"sample_size": 100000, "num_sample_values": 100, "similarity_metric": 0.1}' \ | jq '.results[][].properties.type.samples | .[]' | sort -u TYPES FOUND: 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 Generating Eventing Function: CustomConvertBucketToCollections.json Generating Keyspace commands: 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/\(^.*bucket=output.*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 |
SUCCESS: Bucket created SUCCESS: Scope created SUCCESS: Collection created SUCCESS: Bucket created SUCCESS: Scope created SUCCESS: Collection created SUCCESS: Collection created ** removed 77 lines ** SUCCESS: Collection created SUCCESS: Events imported |
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": "output.myscope.t01", "create_dst_ks": true, "dst_copy": true, "src_del": true, "dst_remove_type": true }, { "src_ks": "input._default._default", "dst_ks": "output.myscope.t02", "create_dst_ks": true, "dst_copy": true, "src_del": true, "dst_remove_type": true }, { "src_ks": "input._default._default", "dst_ks": "output.myscope.t03", "create_dst_ks": true, "dst_copy": true, "src_del": true, "dst_remove_type": true } ] |
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.