Migración de Cubos a Colecciones y Ámbitos mediante Eventos: Parte 1
En primer lugar 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 este artículo, voy a discutir la mecánica de otro método de alto rendimiento para migrar de una versión anterior de Couchbase a Scopes y Collections en Couchbase 7.0.
Sólo necesitas el Servicio de Datos (o KV) y Eventing para migrar de buckets a colecciones. En un gran cluster de Couchbase bien afinado, puedes migrar más de 1 millón de documentos por segundo. Sí, sin N1QL, y sin necesidad de índices.
En el siguiente post (Parte 2), proporcionaré una metodología sencilla totalmente automatizada para realizar grandes migraciones con docenas de (o incluso cientos) de tipos de datos mediante un simple Perl guión.
Requisitos previos: Aprendizaje del concurso completo
En este artículo, vamos a utilizar la última versión de Couchbase (7.0.2), pero las versiones anteriores 7.0 funcionan bien también.
Si no estás familiarizado con Couchbase o el servicio de Eventing, por favor revisa los siguientes recursos, incluyendo al menos un ejemplo de Eventing:
- Configurar un servidor Couchbase 7.0 en funcionamiento siguiendo las instrucciones de "¡Empieza aquí!".
- Comprender cómo desplegar una función básica de Eventing como según las instrucciones del ejemplo de enriquecimiento de datos. Observe el "Caso 2", en el que sólo utilizaremos el cubo "fuente":
- Dos cubos "a granel" y "rr100"de tamaño 100 MB.
- Un espacio clave de origen "fuente.de.datos.masivos".
- Un espacio de teclado de eventos "rr100.eventing.metadata".
- Consulte la documentación de pasos detallados para crear un cubo.
Función Eventing: ConvertBucketToCollections
Eventing le permite escribir lógica de negocio pura. El servicio Eventing se encarga de toda la infraestructura necesaria para gestionar y escalar su función (horizontal y verticalmente) a través de múltiples nodos de una manera performante y fiable.
Todas las funciones de Eventing tienen dos puntos de entrada - OnUpdate(doc, meta)
y OnDelete(meta, opciones)
. Tenga en cuenta que en este ejemplo no nos preocupa este último punto de entrada.
Cuando un documento cambia o muta (inserción, inserción ascendente, sustitución, etc.), se pasa una copia del documento y algunos metadatos sobre el documento a un pequeño punto de entrada de JavaScript OnUpdate(doc, meta)
.
Las Funciones de Eventos pueden desplegarse con dos Límites de Despliegue diferentes, "A partir de ahora" o "Todo". Este último permite acceder a cada documento actual en un Bucket en Couchbase 6.6 o un Keyspace (Bucket/Scope/Collection) en Couchbase 7.0.
El scriptlet ConvertBucketToCollections de la documentación principal de Eventing muestra cómo utilizar Eventing para llevar datos de un bucket de origen a un bucket de destino y dividir los datos en colecciones.
Paso 1: Cargar datos de muestra
En la interfaz de usuario de Couchbase, seleccione "Ajustes/Cubos de muestra". Consulte muestra de cerveza
y haga clic en el botón "Cargar datos de muestra“.
Paso 2: Crear los espacios de claves necesarios
Este ejemplo requiere tres cubos: "muestra de cerveza" (es decir, su almacén de documentos a migrar), "rr100″ (es decir, un bloc de notas para Eventing que puede compartirse con otras funciones de Eventing) y a granel (el bucket en el que se crearán las colecciones migradas). La función "rr100″ y "a granel" debe tener un tamaño mínimo de 100 MB.
En la interfaz de usuario de Couchbase, seleccione "Cubos" y pulsa el botón "AÑADIR CUBO" en la parte superior derecha.
Cree dos cubos con un tamaño de 100 MB, "rr100" (para el almacenamiento de Eventing o el bloc de notas) y "a granel"(para el objetivo de migración).
En Cubo "rr100″ crear ámbito "concurso“.
En el ámbito "rr100.concurso" crear la colección "metadatos“.
En Cubo "a granel" crear ámbito "datos“.
En el ámbito "datos.masivos" crear las colecciones "cerveza" y "cervecería“.
En este punto debe tener tres (3) cubos de la siguiente manera:
con las siguientes colecciones en el "a granel" cubo:
y las siguientes colecciones en la sección "rr100″ cubo:
Paso 3: Crear la función Eventing
En la interfaz de usuario de Couchbase, seleccione "Eventos" y pulsa el botón "AÑADIR FUNCIÓN" en la parte superior derecha.
Los ajustes para la Función de Eventos son los siguientes:
Pulsa el botón "Guardar"a continuación, pegue esta secuencia de comandos en el panel Editor de funciones:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
función OnUpdate(doc, meta) { si (doc.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 (doc.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]; } } } } |
Tu editor de código debería tener este aspecto:
Pulsa el botón "Guardar y devolver”
Qué hace ConvertBucketToCollections
En OnUpdate(doc, meta)
procesará todos los datos del muestra de cerveza
.por defecto y realizará lo siguiente en cualquier mutación pasada (histórica) y nueva (futura).
-
- En primer lugar, la propiedad del doc.tipo se comprueba en dos bloques de código casi idénticos para ver si coincide con alguno de los dos
cerveza
ocervecería
. Si hay coincidencia, continúa. - Una constante global
DO_COPY
(proporcionado a través de la configuración de funciones mediante un alias de enlace constante) para ver si el elemento debe copiarse. - Si
DO_COPY
es verdadero, el documento se escribirá en la colección de destino o en el espacio de clavescerveza_col
ocerveceria_col
(definido mediante la configuración de Funciones a través de un alias de Bucket Binding) en función del bloque de código que coincida. - Una constante global
DO_DELETE
(proporcionado a través de la configuración de funciones mediante un alias de enlace constante) para comprobar si el elemento debe eliminarse del espacio de claves de origen o de la colección (definida a través de la configuración de funciones mediante un alias de enlace de cubo). - Si
DO_DELETE
es verdadero, el documento se eliminará de la colección o del espacio de clavessrc_col
(definida a través de la configuración de Funciones mediante un alias de Bucket Binding).
- En primer lugar, la propiedad del doc.tipo se comprueba en dos bloques de código casi idénticos para ver si coincide con alguno de los dos
Podríamos aumentar los trabajadores de 1 al número de vCPUs para un mejor rendimiento, pero nuestro conjunto de datos es trivial por lo que simplemente dejamos el recuento de trabajadores en uno (1). Nota: La configuración de los trabajadores se encuentra en la sección desplegable Configuración, en el centro del cuadro de diálogo Configuración de funciones..
Despliegue de la función de eventos
Ahora es el momento de desplegar la función Eventing. Hemos revisado un poco el código y el diseño del script de migración ConvertBucketToCollections, y ahora es el momento de ver cómo funciona todo junto.
En este punto, tenemos una función en JavaScript por lo que necesitamos añadirlo a nuestro Couchbase y desplegarlo en un estado activo.
Pulsa el botón "Despliegue“.
El servicio de eventos tarda unos 18 segundos en desplegar su función de eventos, momento en el que debería ver inmediatamente 7303 elementos procesados. Dado que el conjunto de datos es estático, habrá terminado cuando se hayan procesado todos los elementos. Dado que el conjunto de datos es estático, habrá terminado cuando se hayan procesado todos los elementos.
Pulsa el botón "Despliegue“.
Ver los datos migrados
Ahora que hemos terminado de utilizar la función de eventos, podemos inspeccionar los cubos y las colecciones para ver qué ha pasado.
En la interfaz de usuario de Couchbase, seleccione "Cubos”
Ahora seleccione "Ámbitos y colecciones" para el cubo "a granel"y, a continuación, amplíe el ámbito "datos".
En la interfaz de usuario de Couchbase, seleccione "Documentos"y, a continuación, seleccione el espacio clave "datos.masivos.cerveza" y verá los documentos migrados en esa colección.
En la interfaz de usuario de Couchbase, seleccione "Documentos"y, a continuación, seleccione el espacio clave "datos.masivos.cervecería" y verá los documentos migrados en esa colección.
Mejoremos la función Eventing
Recuerde, Eventing puede enriquecer los datos sobre la marcha, y si realmente estamos dividiendo un bucket (circa Couchbase 6.x) en colecciones separadas (circa Couchbase 7.0), ya no necesitamos la función tipo propiedad. Así que vamos a modificar nuestra Función para transformar nuestros datos, también.
Por ejemplo, dado el documento con clave "abhi_brewery"en nuestros datos de origen en muestra de cerveza
.por defecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "nombre": "Cervecería Abhi", "ciudad": "", "estado": "", "código": "", "país": "India", "teléfono": "", "sitio web": "", "tipo": "cervecería", "actualizado": "2011-09-27 00:35:48", "descripción": "", "dirección": [] } |
Aquí está la modificación de nuestra Función de Eventos:
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]; } } } } |
Y como añadimos una nueva constante global DROP_TYPE
también modificamos la configuración de la siguiente manera:
Reflexiones finales
Si este artículo le ha resultado útil y está interesado en seguir aprendiendo sobre el concurso completo, haga clic aquí. el servicio de eventos Couchbase.
Ahora que entiendes la mecánica de usar Eventing para migrar tus buckets a scopes y collections, por favor explora el post de seguimiento (Parte 2), donde proporciono una metodología simple totalmente automatizada para hacer grandes migraciones con docenas de tipos de datos a través de un simple Perl guión.
Recursos
- Descargar: Descargar Couchbase Server 7.0
- Scriptlet de Eventing: Función: ConvertBucketToCollections
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.