docker - docker swarm 中的 Redis 哨兵故障转移配置

标签 docker redis docker-swarm redis-sentinel

说明


我正在尝试在 docker swarm 中创建一个 Redis 集群。我正在使用 bitnami-redis-docker用于创建我的容器的图像。浏览 bitnami 文档,他们总是建议使用 1 个主节点,而不是阅读 Redis 文档,该文档指出应该至少有 3 个主节点,这就是为什么我不知道哪个是正确的。鉴于所有 bitnami 从属默认情况下都是只读的,如果我在其中一个 swarm 领导节点中仅设置一个主节点,并且如果失败,我相信哨兵会尝试将不同的从 redis 实例提升为主节点,但鉴于它是只读的,所有的写操作都会失败。如果我将其更改为使主 redis 实例为 global 意味着它将在 swarm 中的所有可用节点中创建,在这种情况下我是否需要哨兵?此外,如果以下设置很好,是否有理由引入负载均衡器?

设置


+------------------+ +------------------+ +------------------+ +------------------+
| 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

最佳答案

bitnami 解决方案是一种故障转移解决方案,因此它有一个主节点

Sentinel 是一种 HA 解决方案,即自动故障转移。但它不提供跨多个节点的数据分布方面的可扩展性。如果除了“HA”之外还想要“分片”,则需要设置集群。

关于docker - docker swarm 中的 Redis 哨兵故障转移配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257006/

相关文章:

powershell - Windows Server 2016 Dockerfile安装服务

mongodb - 寻找 1 x 100 万个交叉点的最佳解决方案? Redis、Mongo、其他

docker - 如何在与集群管理器相同的机器上运行 docker swarm 节点?

docker - Hyperledger-部署到多个主机时Docker群集失败

docker - 在具有自己的Apache服务器的主机上运行Apache Docker容器有意义吗?

php - 如何在 php-fpm-alpine docker 容器内运行 cron 作业?

http - keepalived健康检查无法连接到127.0.0.1

java - Docker、Dockerfile 和在我开始下一个服务之前使用等待

node.js - Redis + Node.js - 我如何检索值

负载均衡器后面的 Redis 集群?