services:
  # ==================== Redis 高可用 (主从 + 哨兵) ====================
  redis-master:
    image: xxx/redis:7.2-alpine
    command: >
      sh -c "
        redis-server --port 6379 --replica-announce-ip $$(hostname -i) --requirepass 'xxx' --masterauth 'xxx'
      "
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /data/bigdata/install/redis/master-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "xxxx", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 10s
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.redis == true]
      restart_policy:
        condition: any
    networks:
      - app-net

  redis-slave:
    image: xxxx/redis:7.2-alpine
    command: >
      sh -c "
        redis-server --port 6379 --replica-announce-ip $$(hostname -i) --requirepass 'xxx' --masterauth 'xxxx' --replicaof redis-master 6379
      "
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /data/bigdata/install/redis/slave-data:/data
    deploy:
      replicas: 2
      placement:
        constraints: [node.labels.redis == true]
      restart_policy:
        condition: any
    networks:
      - app-net

  redis-sentinel:
    image: xxxx/redis:7.2-alpine
    command: >
      sh -c "
        echo 'waiting for master DNS...' &&
        for i in $$(seq 1 30); do
          MASTER_IP=\$$(getent hosts redis-master | awk '{print \$$1}') && [ -n \"$${MASTER_IP}\" ] && break || sleep 2;
        done &&
        echo \"master resolved to: $${MASTER_IP}\" &&
        echo 'port 26379' > /sentinel.conf &&
        echo 'dir /tmp' >> /sentinel.conf &&
        echo \"sentinel monitor mymaster $${MASTER_IP} 6379 2\" >> /sentinel.conf &&
        echo 'sentinel auth-pass mymaster xxxx' >> /sentinel.conf &&
        echo 'sentinel down-after-milliseconds mymaster 5000' >> /sentinel.conf &&
        echo 'sentinel failover-timeout mymaster 10000' >> /sentinel.conf &&
        echo 'sentinel parallel-syncs mymaster 1' >> /sentinel.conf &&
        redis-sentinel /sentinel.conf --sentinel announce-ip $$(hostname -i) --sentinel announce-port 26379
      "
    environment:
      TZ: Asia/Shanghai
    deploy:
      replicas: 3
      placement:
        constraints: [node.labels.redis == true]
      restart_policy:
        condition: any
    networks:
      - app-net

更多推荐