Implantando Apache Zookeeper com Docker Compose

O Zookeeper pode ser executado em diferentes topologias utilizando Docker: modo independente (standalone), cluster distribuído e cluster pseudo-distribuído (todos os nós na mesma máquina).

Modo Independente

Nesta configuração, um único contêiner é executado localmente.

version: '3.8'

services:
  zk_single:
    image: zookeeper:latest
    restart: unless-stopped
    container_name: zk_standalone
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888

Cluster Distribuído

Para um ambiente de produção real, você precisa de múltiplas máquinas físicas ou virtuais. Vamos considerar três servidores com IPs 10.0.0.10, 10.0.0.11 e 10.0.0.12. O modo de rede host é utilizado para simplificar a comunicação direta entre os nós.

Servidor 1 (10.0.0.10)

version: '3.8'
services:
  zk_node:
    image: zookeeper:latest
    restart: unless-stopped
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=10.0.0.10:2888:3888 server.2=10.0.0.11:2888:3888 server.3=10.0.0.12:2888:3888
    network_mode: host

Servidor 2 (10.0.0.11)

version: '3.8'
services:
  zk_node:
    image: zookeeper:latest
    restart: unless-stopped
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=10.0.0.10:2888:3888 server.2=10.0.0.11:2888:3888 server.3=10.0.0.12:2888:3888
    network_mode: host

Servidor 3 (10.0.0.12)

version: '3.8'
services:
  zk_node:
    image: zookeeper:latest
    restart: unless-stopped
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=10.0.0.10:2888:3888 server.2=10.0.0.11:2888:3888 server.3=10.0.0.12:2888:3888
    network_mode: host

Cluster Pseudo-Distribuído

Para fins de teste, é possível simular um cluster executando três instâncias na mesma máquina host, mapeando portas distintas para o cliente.

version: '3.8'
services:
  zk_1:
    image: zookeeper:latest
    restart: unless-stopped
    hostname: zk_1
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zk_1:2888:3888 server.2=zk_2:2888:3888 server.3=zk_3:2888:3888

  zk_2:
    image: zookeeper:latest
    restart: unless-stopped
    hostname: zk_2
    ports:
      - "2182:2181"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zk_1:2888:3888 server.2=zk_2:2888:3888 server.3=zk_3:2888:3888

  zk_3:
    image: zookeeper:latest
    restart: unless-stopped
    hostname: zk_3
    ports:
      - "2183:2181"
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zk_1:2888:3888 server.2=zk_2:2888:3888 server.3=zk_3:2888:3888

Detalhes de Configuração do Zookeeper

  • initLimit: Define o tempo máximo em "ticks" que um seguidor (Follower) pode levar para se conectar e sincronizar com o líder (Leader). Se exceder esse tempo (ex: 10 ticks * 2 segundos = 20 segundos), a conexão falha.
  • syncLimit: Determina o limite de tempo em "ticks" para a comunicação entre o Líder e o Seguidor (requisição e resposta). Um valor de 2 com tickTime de 2 segundos resulta em 4 segundos de limite.
  • autopurge.purgeInterval: Intervalo em horas para a limpeza automática de logs e snapshots. O padrão é 0 (desativado). Valores maiores que 0 ativam a limpeza.
  • autopurge.snapRetainCount: Quantidade de snapshots a serem mantidos durante a limpeza. O padrão é 3.
  • maxClientCnxns: Limita o número de conexões simultâneas de um único endereço IP, ajudando a prevenir ataques DoS. O valor 0 remove o limite.
  • server.id=host:port1:port2: Formato da lista de servidores. id é o número do nó (corresponde ao ZOO_MY_ID). host é o endereço IP. port1 (ex: 2888) é usado para comunicação entre os nós e o líder. port2 (ex: 3888) é usado para o processo de eleição de um novo líder. Em clusters pseudo-distribuídos, os IPs são os mesmos, portanto, portas distintas devem ser atribuídas para cada instância.

Nota: A versão especificada no arquivo docker-compose.yml (ex: '3.8') deve ser compatível com a versão do seu mecanismo Docker instalado.

Tags: zookeeper Docker docker-compose Distributed-Systems

Publicado em 8-21 19:52