Atualmente, o Docker é a ferramenta mais comum para criar, implantar e executar aplicativos usando contêineres. Ele nos permite empacotar um aplicativo com todas as partes necessárias, como bibliotecas e outras dependências, e enviar tudo como um pacote. Pode ser considerado como uma máquina virtual, mas em vez de criar um sistema operacional virtual inteiro, o Docker permite que os aplicativos usem o mesmo kernel Linux do sistema em que estão sendo executados e requer apenas que os aplicativos sejam enviados com coisas que ainda não estão sendo executadas. o computador hospedeiro. Isso dá um aumento significativo de desempenho e reduz o tamanho do aplicativo.
No caso das Imagens Docker, elas vêm com uma versão de SO pré-definida e os pacotes são instalados da forma que foi decidida pela pessoa que criou a imagem. É possível que você queira usar um sistema operacional diferente ou talvez queira instalar os pacotes de uma maneira diferente. Para esses casos, você deve usar uma imagem do Docker do SO limpa e instalar o software do zero.
A replicação é um recurso comum em um ambiente de banco de dados, portanto, após a implantação do TimescaleDB Docker Images, se você deseja configurar uma replicação, precisará fazê-lo manualmente a partir do contêiner, usando um arquivo Docker ou até mesmo um script. Essa tarefa pode ser complexa se você não tiver conhecimento do Docker.
Neste blog, veremos como podemos implantar o TimescaleDB via Docker usando uma imagem do Docker do TimescaleDB e, em seguida, veremos como instalá-lo do zero usando uma imagem do Docker do CentOS e o ClusterControl.
Como implantar o TimescaleDB com uma imagem do Docker
Primeiro, vamos ver como implantar o TimescaleDB usando uma imagem do Docker disponível no Docker Hub.
$ docker search timescaledb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
timescale/timescaledb An open-source time-series database optimize… 52
Vamos pegar o primeiro resultado. Então, precisamos puxar esta imagem:
$ docker pull timescale/timescaledb
E execute os contêineres do nó mapeando uma porta local para a porta do banco de dados no contêiner:
$ docker run -d --name timescaledb1 -p 7551:5432 timescale/timescaledb
$ docker run -d --name timescaledb2 -p 7552:5432 timescale/timescaledb
Depois de executar esses comandos, você deve ter este ambiente do Docker criado:
$ 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
Agora, você pode acessar cada nó com os seguintes comandos:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (9.6.13)
Type "help" for help.
postgres=#
Como você pode ver, esta imagem do Docker contém uma versão do TimescaleDB 9.6 por padrão e está instalada no Alpine Linux v3.9. Você pode usar uma versão diferente do TimescaleDB alterando a tag:
$ docker pull timescale/timescaledb:latest-pg11
Em seguida, você pode criar um usuário de banco de dados, alterar a configuração de acordo com seus requisitos ou configurar a replicação entre os nós manualmente.
Como implantar o TimescaleDB com ClusterControl
Agora, vamos ver como implantar o TimescaleDB com o Docker usando uma imagem do CentOS Docker (centos) e uma imagem do Docker ClusterControl (severalnines/clustercontrol).
Primeiro, implantaremos um contêiner do Docker ClusterControl usando a versão mais recente, portanto, precisamos extrair a imagem do Docker de vários noves/clustercontrol.
$ docker pull severalnines/clustercontrol
Em seguida, executaremos o contêiner ClusterControl e publicaremos a porta 5000 para acessá-lo.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Agora, podemos abrir a interface do usuário do ClusterControl em http://[Docker_Host]:5000/clustercontrol e criar um usuário e senha de administrador padrão.
O CentOS Official Docker Image vem sem o serviço SSH, então vamos instalá-lo e permitir a conexão do nó ClusterControl sem senha usando uma chave SSH.
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5378 [OK]
Então, vamos puxar a imagem oficial do Docker do CentOS.
$ docker pull centos
E então, executaremos dois contêineres de nós, timescale1 e timescale2, vinculados ao ClusterControl e mapeamos uma porta local para conectar ao banco de dados (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 precisamos instalar e configurar o serviço SSH, precisamos executar o container com os parâmetros privilegiados e /usr/sbin/init para poder gerenciar o serviço dentro do container.
Depois de executar esses comandos, devemos ter este ambiente Docker criado:
$ 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 acessar cada nó com o seguinte comando:
$ docker exec -ti [db-container] bash
Como mencionamos anteriormente, precisamos instalar o serviço SSH, então vamos instalá-lo, permitir o acesso root e definir a senha root para cada container de banco de dados:
$ 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
A última etapa é configurar o SSH sem senha para todos os contêineres de banco de dados. Para isso, precisamos saber o endereço IP de cada nó do banco de dados. Para conhecê-lo, podemos executar o seguinte comando para cada nó:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.5",
Em seguida, anexe ao console interativo do contêiner ClusterControl:
$ docker exec -it clustercontrol bash
E copie a chave SSH para todos os contêineres de banco de dados:
$ ssh-copy-id 172.17.0.5
Agora que temos os nós do servidor funcionando, precisamos implantar nosso cluster de banco de dados. Para fazer isso de maneira fácil, usaremos o ClusterControl.
Para realizar uma implantação do ClusterControl, abra a interface do usuário do ClusterControl em http://[Docker_Host]:5000/clustercontrol, selecione a opção “Deploy” e siga as instruções que aparecem.
Ao selecionar TimescaleDB, devemos especificar Usuário, Chave ou Senha e porta para conectar por SSH aos nossos servidores. Também precisamos de um nome para nosso novo cluster e se queremos que o ClusterControl instale o software e as configurações correspondentes para nós.
Após configurar as informações de acesso SSH, devemos definir o usuário do banco de dados, versão e datadir (opcional). Também podemos especificar qual repositório usar.
Na próxima etapa, precisamos adicionar nossos servidores ao cluster que vamos criar.
Aqui devemos usar o endereço IP que obtivemos de cada contêiner anteriormente.
Na última etapa, podemos escolher se nossa replicação será síncrona ou assíncrona.
Podemos monitorar o status da criação do nosso novo cluster a partir do monitor de atividades do ClusterControl.
Quando a tarefa estiver concluída, podemos ver nosso cluster na tela principal do ClusterControl.
Observe que, se você quiser adicionar mais nós em espera, poderá fazê-lo na interface do usuário do ClusterControl no menu Ações do cluster.
Da mesma forma, se você tem seu cluster TimescaleDB rodando no Docker e deseja que o ClusterControl o gerencie para poder usar todos os recursos deste sistema como monitoramento, backup, failover automático e muito mais, você pode simplesmente executar o Contêiner ClusterControl na mesma rede Docker que os contêineres de banco de dados. O único requisito é garantir que os contêineres de destino tenham pacotes relacionados ao SSH instalados (openssh-server, openssh-clients). Em seguida, permita o SSH sem senha do ClusterControl para os contêineres do banco de dados. Uma vez feito, use o recurso “Import Existing Server/Cluster” e o cluster deve ser importado para o ClusterControl.
Um possível problema na execução de contêineres é a atribuição de endereço IP ou nome de host. Sem uma ferramenta de orquestração como o Kubernetes, o endereço IP ou o nome do host pode ser diferente se você interromper os nós e criar novos contêineres antes de iniciá-lo novamente. Você terá um endereço IP diferente para os nós antigos e o ClusterControl está assumindo que todos os nós estão sendo executados em um ambiente com um endereço IP ou nome de host dedicado, portanto, após a alteração do endereço IP, você deve reimportar o cluster para o ClusterControl. Existem muitas soluções alternativas para esse problema, você pode verificar este link para usar o Kubernetes com StatefulSet ou este para executar contêineres sem ferramenta de orquestração.
Conclusão
Como pudemos ver, a implantação do TimescaleDB com Docker deve ser fácil se você não quiser configurar um ambiente de replicação ou failover e se não quiser fazer nenhuma alteração na versão do SO ou na instalação dos pacotes de banco de dados.
Com o ClusterControl, você pode importar ou implantar seu cluster TimescaleDB com o Docker usando a imagem do sistema operacional de sua preferência, bem como automatizar as tarefas de monitoramento e gerenciamento, como backup e failover/recuperação automáticos.