sql >> Base de Datos >  >> RDS >> Database

Una guía para implementar TimescaleDB con Docker

Hoy en día, Docker es la herramienta más común para crear, implementar y ejecutar aplicaciones mediante el uso de contenedores. Nos permite empaquetar una aplicación con todas las partes que necesita, como bibliotecas y otras dependencias, y enviarlo todo como un solo paquete. Podría considerarse como una máquina virtual, pero en lugar de crear un sistema operativo virtual completo, Docker permite que las aplicaciones usen el mismo kernel de Linux que el sistema en el que se están ejecutando y solo requiere que las aplicaciones se envíen con cosas que aún no se están ejecutando. la computadora anfitriona. Esto aumenta significativamente el rendimiento y reduce el tamaño de la aplicación.

En el caso de las imágenes de Docker, vienen con una versión de sistema operativo predefinida y los paquetes se instalan de la manera que decidió la persona que creó la imagen. Es posible que desee utilizar un sistema operativo diferente o tal vez desee instalar los paquetes de una manera diferente. Para estos casos, debe usar una imagen Docker de sistema operativo limpia e instalar el software desde cero.

La replicación es una característica común en un entorno de base de datos, por lo que después de implementar las imágenes de Docker de TimescaleDB, si desea configurar una configuración de replicación, deberá hacerlo manualmente desde el contenedor, utilizando un archivo de Docker o incluso un script. Esta tarea puede resultar compleja si no tienes conocimientos de Docker.

En este blog, veremos cómo podemos implementar TimescaleDB a través de Docker usando una imagen de Docker de TimescaleDB, y luego veremos cómo instalarlo desde cero usando una imagen de CentOS Docker y ClusterControl.

Cómo implementar TimescaleDB con una imagen de Docker

Primero, veamos cómo implementar TimescaleDB usando una imagen de Docker disponible en Docker Hub.

$ docker search timescaledb
NAME                                       DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
timescale/timescaledb                      An open-source time-series database optimize…   52

Tomaremos el primer resultado. Entonces, necesitamos extraer esta imagen:

$ docker pull timescale/timescaledb

Y ejecute los contenedores de nodos asignando un puerto local al puerto de la base de datos en el contenedor:

$ docker run -d --name timescaledb1 -p 7551:5432 timescale/timescaledb
$ docker run -d --name timescaledb2 -p 7552:5432 timescale/timescaledb

Después de ejecutar estos comandos, debería tener este entorno Docker creado:

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
6d3bfc75fe39        timescale/timescaledb   "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       0.0.0.0:7552->5432/tcp   timescaledb2
748d5167041f        timescale/timescaledb   "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes       0.0.0.0:7551->5432/tcp   timescaledb1

Ahora, puede acceder a cada nodo con los siguientes comandos:

$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (9.6.13)
Type "help" for help.
postgres=#

Como puede ver, esta imagen de Docker contiene una versión de TimescaleDB 9.6 de forma predeterminada y está instalada en Alpine Linux v3.9. Puede usar una versión diferente de TimescaleDB cambiando la etiqueta:

$ docker pull timescale/timescaledb:latest-pg11

Luego, puede crear un usuario de la base de datos, cambiar la configuración según sus requisitos o configurar la replicación entre los nodos manualmente.

Cómo implementar TimescaleDB con ClusterControl

Ahora, veamos cómo implementar TimescaleDB con Docker usando una imagen de Docker de CentOS (centos) y una imagen de Docker de ClusterControl (severalnines/clustercontrol).

Primero, implementaremos un contenedor Docker de ClusterControl con la última versión, por lo que debemos extraer la imagen de Docker de varios nueves/clustercontrol.

$ docker pull severalnines/clustercontrol

Luego, ejecutaremos el contenedor ClusterControl y publicaremos el puerto 5000 para acceder a él.

$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol

Ahora, podemos abrir la interfaz de usuario de ClusterControl en http://[Docker_Host]:5000/clustercontrol y crear un usuario y una contraseña de administrador predeterminados.

La imagen oficial de Docker de CentOS viene sin el servicio SSH, por lo que la instalaremos y permitiremos la conexión desde el nodo ClusterControl sin contraseña mediante una clave SSH.

$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5378                [OK]

Por lo tanto, extraeremos la imagen oficial de Docker de CentOS.

$ docker pull centos

Y luego, ejecutaremos dos contenedores de nodos, timescale1 y timescale2, vinculados con ClusterControl y asignaremos un puerto local para conectarse a la base de datos (opcional).

$ docker run -dt --privileged --name timescale1 -p 8551:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init
$ docker run -dt --privileged --name timescale2 -p 8552:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init

Como necesitamos instalar y configurar el servicio SSH, necesitamos ejecutar el contenedor con parámetros privilegiados y /usr/sbin/init para poder administrar el servicio dentro del contenedor.

Después de ejecutar estos comandos, deberíamos tener este entorno Docker creado:

$ docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                       PORTS                                                                                     NAMES
230686d8126e        centos                        "/usr/sbin/init"    4 seconds ago       Up 3 seconds                 0.0.0.0:8552->5432/tcp                                                                    timescale2
c0e7b245f7fe        centos                        "/usr/sbin/init"    23 seconds ago      Up 22 seconds                0.0.0.0:8551->5432/tcp                                                                    timescale1
7eadb6bb72fb        severalnines/clustercontrol   "/entrypoint.sh"    2 weeks ago         Up About an hour (healthy)   22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp   clustercontrol

Podemos acceder a cada nodo con el siguiente comando:

$ docker exec -ti [db-container] bash

Como mencionamos anteriormente, necesitamos instalar el servicio SSH, así que vamos a instalarlo, permitir el acceso de root y configurar la contraseña de root para cada contenedor de base de datos:

$ docker exec -ti [db-container] yum update -y
$ docker exec -ti [db-container] yum install -y openssh-server openssh-clients
$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -it [db-container] systemctl start sshd
$ docker exec -it [db-container] passwd

El último paso es configurar el SSH sin contraseña para todos los contenedores de la base de datos. Para esto, necesitamos saber la dirección IP de cada nodo de la base de datos. Para saberlo, podemos ejecutar el siguiente comando para cada nodo:

$ docker inspect [db-container] |grep IPAddress
            "IPAddress": "172.17.0.5",

Luego, adjunte a la consola interactiva del contenedor ClusterControl:

$ docker exec -it clustercontrol bash

Y copie la clave SSH en todos los contenedores de la base de datos:

$ ssh-copy-id 172.17.0.5

Ahora que tenemos los nodos del servidor en funcionamiento, necesitamos implementar nuestro clúster de base de datos. Para hacerlo de forma sencilla utilizaremos ClusterControl.

Para realizar una implementación desde ClusterControl, abra la interfaz de usuario de ClusterControl en http://[Docker_Host]:5000/clustercontrol, luego seleccione la opción "Implementar" y siga las instrucciones que aparecen.

Al seleccionar TimescaleDB, debemos especificar Usuario, Clave o Contraseña y puerto para conectarnos por SSH a nuestros servidores. También necesitamos un nombre para nuestro nuevo clúster y si queremos que ClusterControl instale el software y las configuraciones correspondientes por nosotros.

Después de configurar la información de acceso SSH, debemos definir el usuario de la base de datos, la versión y datadir (opcional). También podemos especificar qué repositorio usar.

En el siguiente paso, debemos agregar nuestros servidores al clúster que vamos a crear.

Aquí debemos usar la dirección IP que obtuvimos de cada contenedor previamente.

En el último paso, podemos elegir si nuestra replicación será Síncrona o Asíncrona.

Podemos monitorear el estado de la creación de nuestro nuevo clúster desde el monitor de actividad de ClusterControl.

Una vez finalizada la tarea, podemos ver nuestro clúster en la pantalla principal de ClusterControl.

Tenga en cuenta que, si desea agregar más nodos en espera, puede hacerlo desde la interfaz de usuario de ClusterControl en el menú Acciones del clúster.

De la misma manera, si tiene su clúster TimescaleDB ejecutándose en Docker y desea que ClusterControl lo administre para poder usar todas las funciones de este sistema, como monitoreo, respaldo, conmutación por error automática y aún más, simplemente puede ejecutar el Contenedor ClusterControl en la misma red de Docker que los contenedores de la base de datos. El único requisito es asegurarse de que los contenedores de destino tengan paquetes relacionados con SSH instalados (openssh-server, openssh-clients). Luego, permita SSH sin contraseña desde ClusterControl a los contenedores de la base de datos. Una vez hecho esto, use la función "Importar servidor/clúster existente" y el clúster debe importarse a ClusterControl.

Un posible problema al ejecutar contenedores es la dirección IP o la asignación del nombre de host. Sin una herramienta de orquestación como Kubernetes, la dirección IP o el nombre de host podrían ser diferentes si detiene los nodos y crea nuevos contenedores antes de volver a iniciarlos. Tendrá una dirección IP diferente para los nodos antiguos y ClusterControl asume que todos los nodos se ejecutan en un entorno con una dirección IP o un nombre de host dedicados, por lo que después de cambiar la dirección IP, debe volver a importar el clúster a ClusterControl. Hay muchas soluciones para este problema, puede consultar este enlace para usar Kubernetes con StatefulSet, o este para ejecutar contenedores sin la herramienta de orquestación.

Conclusión

Como pudimos ver, la implementación de TimescaleDB con Docker debería ser fácil si no desea configurar un entorno de replicación o conmutación por error y si no desea realizar ningún cambio en la versión del sistema operativo o la instalación de paquetes de base de datos.

Con ClusterControl, puede importar o implementar su clúster de TimescaleDB con Docker utilizando la imagen del sistema operativo que prefiera, así como automatizar las tareas de supervisión y administración, como la copia de seguridad y la conmutación por error/recuperación automática.