Réplica de datos en tiempo real desde Oracle a Couchbase con GoldenGate

English

A menudo los datos de las organizaciones se encuentran en distintos repositorios o sistemas de información. Imaginemos un Catálogo de Productos. Como ejemplo, supongamos que los datos maestros se encuentran en una base de datos Oracle, dando servicio a aplicaciones de logística, aprovisionamiento, control de existencias y otros sistemas de back-end.

Por otro lado, consideremos un portal web que actúa de frontal para nuestros clientes finales. Esta aplicación tendrá un gran número de clientes concurrentes, y para dar la mejor experiencia de usuario necesitaremos de un excelente rendimiento en el acceso al Catálogo de Productos.

Este es un caso de uso típico de Couchbase. Gracias al cache incluido en Couchbase conseguiremos un excelente rendimiento en el acceso a datos, y podremos escalar nuestro sistema con un coste y esfuerzo mucho menores. Además, es frecuente utilizar Couchbase en este tipo de escenarios para almacenar perfiles de usuarios, sesiones de aplicación o como una capa de consolidación para otras fuentes de datos.

En este punto, tenemos los datos de nuestro catálogo de productos replicados en dos almacenamientos: Oracle y Couchbase. Al hacer la carga inicial de datos, nuestro catálogo esta sincronizado con la base de datos origen, y los datos son consistentes.

Ahora se produce una escritura en la base de datos Oracle de origen. Puede ser que se añada un nuevo producto, o cambie el precio de un determinado producto. ¿Cómo aseguramos que este cambio se propague a Couchbase para seguir manteniendo la consistencia?

Esto es precisamente lo que hace Oracle GoldenGate: recoge transacciones ejecutadas sobre una base de datos Oracle y las propaga a otro almacén de datos. Aunque en estos momentos Couchbase no es una base de datos soportada de forma nativa por Oracle GoldenGate,  podemos utilizar el Adaptador Oracle GoldenGate para Java para hacer la integración entre ambos extremos.

cb_ggadapter

Algunos aspectos a considerar:

Modelado de Datos. Oracle es una base de datos relacional, con datos estructurados en tablas, filas y columnas. Por otro lado, Couchbase es una base de datos documental, que almacena documentos en formato JSON. Estos documentos no tienen un esquema o estructura predefinida. A menudo los documentos en Couchbase contienen datos referenciados en el mismo documento. Así se consigue evitar queries con joins y se mejora el rendimiento y la sencillez.

Carga de datos. El primer paso será hacer una carga inicial de datos desde Oracle a Couchbase. A partir de aquí podremos activar la propagación de cambios desde Oracle hacia Couchbase.

Es siguiente paso es desarrollar el adaptador. En este repositorio github se puede encontrar una implementación de ejemplo. En el mismo se encuentra el código del mismo, una versión compilada del adaptador lista para desplegar y una utilidad para hacer la carga inicial desde Oracle.

Las instrucciones detalladas se pueden encontrar en este repositorio. En resumen, los pasos son los siguientes:

  1. Hacer la carga inicial desde Oracle a Couchbase
  2. Instalar GoldenGate en las máquinas origen y destino
  3. Configurar la base de datos Oracle de origen
  4. Instalar el adaptador: CouchbaseGoldenGateAdapter
  5. Configurar los procesos de GoldenGate: extract, pump y replicat
  6. Arrancar los procesos de GoldenGate

En este punto, para probar la replicación podemos utilizar Oracle SQLPlus y Couchbase cbq como clientes SQL. En este ejemplo utilizamos el esquema HR, incluido como ejemplo en todas las bases de datos Oracle, y que simula un departamento de Recursos Humanos. Empecemos por un INSERT.

Vamos a insertar una fila en la tabla “regions”, con “region_id=5”. Comprobamos antes que este registro no está presente en Oracle y tampoco en Couchbase:

(Oracle SQLPlus)

before5

(Couchbase cbq)

before5_cb

Ahora hacemos el insert desde Oracle SQLPlus, seguido de un commit.

after5

Comprobamos que el documento se ha propagado a Couchbase:

after5_cb

Así que aquí lo tenemos; GoldenGate replicando transacciones Oracle a Couchbase. Se pueden comprobar también otras sentencias de escritura como DELETE y UPDATE. ¡Feliz sincronización!

Transfiriendo datos entre Oracle y Couchbase

Una pregunta frecuente en clientes es sobre cómo mover datos entre Oracle y Couchbase. Oracle es una base de datos relacional muy popular, y clientes que migran a Couchbase tienen este desafío inicial. ¿Cómo cargo mi base de datos Couchabse a partir de las tablas de datos en Oracle?

La primera consideración es que estamos hablando de distintos formatos de datos. Las tablas de bases de datos relacionales se organizan en filas. Cada tabla tiene un conjunto determinado de columnas, cada fila se determina de manera única por un conjunto de campos que forman la clave primaria. Una instancia de base de datos contiene múltiples tablas

Por otro lado, Couchbase es una base de datos Documental de propósito general. Couchbase sigue el patrón clave-valor, donde la clave está fomrada por un conjunto de caracteres, y el valor no tiene un formato predefinido. Normalmente utilizamos Couchbase como una base de datos Documental, donde el valor es un documento en formato JSON. De este modo, podremos utilizar funcionalidades como índices globales secundarios, vistas y N1QL, una implementación del popular lenguaje SQL para acceso a nuestros datos en JSON.

En Couchbase no hay un esquema fijo para almacenar los datos. Cada documento JSON puede tener atributos diferentes. In caso de un nuevo dato, no hace falta modificar el esquema ni crear una nueva tabla, como en el mundo relacional. Esta flexibilidad es una de las razones por la que los clientes están adoptando Couchbase.

Otra diferencia importante con las bases de datos relacionales es sobre la normalización de los datos. Una de los mantras de las bases de datos relacionales es organizar los datos de modo que se minimice la redundancia de los mismos. Esto ayuda a mantener la consistencia de los datos, pero obliga a hacer consultas complejas, con accesos a varias tablas (JOINs).

En Couchbase, por otro lado, buscamos maximizar el rendimiento en el acceso al dato, de modo que de-normalizar los datos es una práctica común.

En este ejercicio de migración usaremos las convenciones siguientes:

  • Cada documento JSON incluirá un atributo raíz igual al nombre de la tabla.
  • Todos los atributos estarán en minúsculas.
  • Couchbase es una base de datos clave-valor. El formato de la clave lo derivaremos de la clave primaria relacional de la siguiente manera:
[nombre de tabla en minúsculas]::[valor del campo1 de la PK]::[ valor del campo2 de la PK]:: ...
  • Los tipos de dato (Numeric, boolean, text …) se conservarán en la migración.
  • Los datos en Oracle de tipo Date and Timestamps se almacenarán con el formato milisegundos desde  1 de enero , 1970, 00:00:00 GMT

oracle2couchbase_1

Ahora es el momento de escribir código para hacer la magia …. No asustarse! Mientras algunos intrépidos se pongan a la tarea os ofrecemos una implementación.

Usaremos la herramienta oracle2couchbase, disponible aquí. (Atención, esta herramienta no tiene soporte oficial) Se proporciona el código fuente. Echar un vistazo al mismo para comprobar que no es muy complicado.

En el repositorio github se incluyen instrucciones de cómo usar la herramienta.

Como origen de datos en Oracle, utilizaremos el esquema HR, que contiene un conjunto de tablas que modelan un departamento de recursos humanos, y que se incluye como ejemplo en todas las distribuciones de Oracle.

Crearemos en Couchbase un repositorio llamado HR como destino de nuestros datos.

La línea de comando que utilizamos es la siguiente:

java -cp ./oracle2couchbase.jar:./lib/couchbase-java-client-2.2.2.jar:./lib/couchbase-core-io-1.2.2.jar:./lib/rxjava-1.0.15.jar:./lib/ojdbc6.jar -DcbClusterAddress=couchbaseMachine -DcbBucketName=HR -DoraAddress=oracleMachine -DoraUser=HR -DoraPassword=oracle -DoraService=XE -DoraTables=COUNTRIES,DEPARTMENTS,EMPLOYEES,JOBS,JOB_HISTORY,LOCATIONS,REGIONS com.oracle2couchbase.Loader

Ahora que hemos hecho la migración, echemos un vistazo a nuestros datos. Utilizaremos consultas SQL en Oracle y N1QL en Couchbase.

Primera consulta: busquemos las filas de “locations” cuyo campo “city_name” empiece por ‘B’.

Oracle SQLPlus

sqlplus1

Couchbase Query Workbench Developer

n1ql1

En este ejemplo hemos utilizado la misma sintaxis para la query.

Hagamos ahora algo más complejo. Contaremos el número de “locations” para cada país. Incluiremos el campo “country_name” haciendo una JOIN con el documento JSON “countries” asociado (¡o con la correspondiente tabla, en el caso relacional!). Ordenaremos por este valor, y luego por el campo nombre. En este ejemplo vemos cómo se mantienen las relaciones en la migración.

Oracle SQLPlus

sqlplus2

Couchbase Query Workbench Developer

n1ql2

En este caso la sintaxis no es idéntica, pero muy similar.

Para terminar, recalcamos que esto es sólo un ejemplo. Un primer paso para movimiento de datos entre Oracle y Couchbase. Un diseño de datos más apropiado para una base de datos Documental como Couchbase puede incluir desnormalizar algunos datos, incluyéndoles en documentos JSON “padres”.

Para profundizar en estos aspectos de diseño resultan muy interesantes las referencias siguientes: