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.