Ниже конфиг для docker-compose, который позволяет запустить keydb в режиме кластера.
services:
keydb1:
image: eqalpha/keydb:x86_64_v6.2.2
command: [ "keydb-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--active-replica", "yes", "--protected-mode", "no" ]
volumes:
- keydb1-data:/data
ports:
- "6379:6379"
networks:
keydb-cluster-net:
ipv4_address: 172.30.0.2
keydb2:
image: eqalpha/keydb:x86_64_v6.2.2
command: [ "keydb-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--active-replica", "yes", "--protected-mode", "no" ]
volumes:
- keydb2-data:/data
ports:
- "6380:6379"
networks:
keydb-cluster-net:
ipv4_address: 172.30.0.3
keydb3:
image: eqalpha/keydb:x86_64_v6.2.2
command: [ "keydb-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--active-replica", "yes", "--protected-mode", "no" ]
volumes:
- keydb3-data:/data
ports:
- "6381:6379"
networks:
keydb-cluster-net:
ipv4_address: 172.30.0.4
networks:
keydb-cluster-net:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/24
volumes:
keydb1-data:
keydb2-data:
keydb3-data:
Используем отдельную подсеть и статические адреса, это нужно для анонса создания кластера в следующем шаге. Также добавляем volume, чтобы сохранить состояние и не перезапускать скрипт инициализации кластера каждый раз.
Скрипт для создания кластера, выполнять нужно после того, как запустили keydb из docker-compose:
#!/bin/bash
declare -a keydb_ips
port=6379
keydb_container_ids=($(docker ps | grep keydb | awk '{print $1}'))
for id in ${keydb_container_ids[*]};do
ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $id)
keydb_ips+=("$ip:$port")
done
docker exec -it ${keydb_container_ids[0]} keydb-cli --cluster create ${keydb_ips[*]} --cluster-replicas 0
Тут просто получаем список id контейнеров с keydb, по нему получаем их ip адреса, а далее в любом контейнере (в данном случае в первом из массива) выполняем создание кластера.
После можно подключиться к кластеру так:
keydb-cli -h localhost
И проверить его статус:
cluster info
Должны увидеть cluster_state: ok.
При перезапуске, запускать скрипт инициализации не нужно.
#docker
#keydb