Описание
Я пытаюсь создать кластер Redis в Docker Swarm. Я использую изображение bitnami-redis-docker для создания своих контейнеров. Просматривая документацию bitnami, они всегда предлагают использовать 1 мастер-узел, а не читать документацию Redis, в которой говорится, что должно быть как минимум 3 мастер-узла, поэтому я не совсем понимаю, какой из них правильный. Учитывая, что все подчиненные устройства bitnami по умолчанию доступны только для чтения, если я настрою только одного мастера в одном из узлов-лидеров роя, и если это не удастся, я думаю, что sentinel попытается выдвинуть другой экземпляр подчиненного redis как master, но, учитывая, что он только для чтения все операции записи завершатся ошибкой. Если я изменю это, чтобы сделать мастер-экземпляр redis как global
, что означает, что он будет создан во всех узлах, доступных в рое, в этом случае мне вообще нужен часовой? Кроме того, если приведенная ниже настройка является хорошей, есть ли причина ввести балансировщик нагрузки?
Настройка
+------------------+ +------------------+ +------------------+ +------------------+
| Node-1 | | Node-2 | | Node-3 | | Node-4 |
| Leader | | Worker | | Leader | | Worker |
+------------------+ +------------------+ +------------------+ +------------------+
| M1 | | M2 | | M3 | | M4 |
| R1 | | R2 | | R3 | | R4 |
| S1 | | S2 | | S3 | | S4 |
| | | | | | | |
+------------------+ +------------------+ +------------------+ +------------------+
Легенды -
- Мастера называются M1, M2, M3, ..., Mn
- Рабы называются R1, R2, R3, ..., Rn (R обозначает реплику).
- Стражи называются S1, S2, S3, ..., Sn
Docker
version: '3'
services:
redis-master:
image: 'bitnami/redis:latest'
ports:
- '6379:6379'
environment:
- REDIS_REPLICATION_MODE=master
- REDIS_PASSWORD=laSQL2019
- REDIS_EXTRA_FLAGS=--maxmemory 100mb
volumes:
- 'redis-master-volume:/bitnami'
deploy:
mode: global
redis-slave:
image: 'bitnami/redis:latest'
ports:
- '6379'
depends_on:
- redis-master
volumes:
- 'redis-slave-volume:/bitnami'
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_PASSWORD=laSQL2019
- REDIS_PASSWORD=laSQL2019
- REDIS_EXTRA_FLAGS=--maxmemory 100mb
deploy:
mode: replicated
replicas: 4
redis-sentinel:
image: 'bitnami/redis:latest'
ports:
- '16379'
depends_on:
- redis-master
- redis-slave
volumes:
- 'redis-sentinel-volume:/bitnami'
entrypoint: |
bash -c 'bash -s <<EOF
"/bin/bash" -c "cat <<EOF > /opt/bitnami/redis/etc/sentinel.conf
port 16379
dir /tmp
sentinel monitor master-node redis-master 6379 2
sentinel down-after-milliseconds master-node 5000
sentinel parallel-syncs master-node 1
sentinel failover-timeout master-node 5000
sentinel auth-pass master-node laSQL2019
sentinel announce-ip redis-sentinel
sentinel announce-port 16379
EOF"
"/bin/bash" -c "redis-sentinel /opt/bitnami/redis/etc/sentinel.conf"
EOF'
deploy:
mode: global
volumes:
redis-master-volume:
driver: local
redis-slave-volume:
driver: local
redis-sentinel-volume:
driver: local