Serie de instalación e implementación (1): Docker Compose instala el clúster de redis-cluster

Redis Cluster adopta una estructura sin centro, cada nodo guarda datos y el estado completo del clúster, y cada nodo está conectado a todos los demás nodos. Redis Cluster proporciona una forma de ejecutar una instalación de Redis donde los datos se fragmentan automáticamente en varios nodos de Redis. Redis Cluster también proporciona un grado de disponibilidad durante la partición, que es efectivamente la capacidad de continuar las operaciones si algunos nodos fallan o no pueden comunicarse. Sin embargo, en caso de una falla importante (por ejemplo, cuando la mayoría de los maestros no están disponibles), el clúster dejará de funcionar. La capacidad de Redis Cluster para dividir automáticamente un conjunto de datos en varios nodos y continuar ejecutándose cuando un subconjunto de nodos falla o no puede comunicarse con el resto del clúster.

Red de puente autoconstruida, asigne manualmente IP para instalar

1. Crear manualmente la instalación

Debe crear manualmente una tarjeta de red, especificar una IP para iniciar varios contenedores y luego ingresar un contenedor para ejecutar comandos para crear un clúster.

Consulte los pasos de instalación específicos: www.stephen520.cn/blog/10271

2. Inicio con un clic de docker-compose y scripts

Según el proceso de instalación manual anterior, se han escrito algunos scripts de configuración generados. Puede usar docker-compose para crear automáticamente una tarjeta de red con un segmento de red específico y crear automáticamente varios clústeres y otras funciones.

Plantilla de archivo de configuración redis-cluster.tmpl.

port 6379
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 172.19.0.1${NO}
cluster-announce-port 6379
cluster-announce-bus-port 16379

Nota: Aquí cluster-announce-ip es el segmento de red donde se crea automáticamente la tarjeta de red. ${NO} es principalmente para generar diferentes IP de acuerdo con el siguiente script.

Generar script de archivo de configuración generar.sh

Genere 6 archivos de configuración de instancia, 3 maestros y 3 esclavos. Las IP son 172.19.0.11, 172.19.0.12, ... , 172.19.0.16

for no in `seq 1 6`; do \
  mkdir -p redis-${no}/conf \
  && NO=${no} envsubst < redis-cluster.tmpl > redis-${no}/conf/redis.conf \
  && mkdir -p redis-${no}/data;\
done

docker-compose.yaml

Nota: El segmento de red 172.19.0.0/16 ya existe y la creación falla.

Consulte docker-compose para especificar manualmente la IP www.cnblogs.com/xuanmanstei… docker network prune elimina redes inútiles y libera segmentos de red.

# 描述 Compose 文件的版本信息
version: "3.8"

# 定义服务,可以多个
services:
  redis-cluster:
    image: redis:latest
    networks:
      redis:
        ipv4_address: 172.19.0.2
    command: redis-cli --cluster create 172.19.0.11:6379 172.19.0.12:6379 172.19.0.13:6379 172.19.0.14:6379 172.19.0.15:6379 172.19.0.16:6379 --cluster-replicas 1  --cluster-yes
    depends_on:
      - redis-1
      - redis-2
      - redis-3
      - redis-4
      - redis-5
      - redis-6

  redis-1: # 服务名称
    image: redis:latest # 创建容器时所需的镜像
    container_name: redis-1 # 容器名称
    restart: "no" # 容器总是重新启动
    networks:
      redis:
        ipv4_address: 172.19.0.11
    ports:
      - "6379:6379"
      - "16379:16379"
    volumes: # 数据卷,目录挂载
      - ./etc_rc.local:/etc/rc.local
      - ./redis-1/conf/redis.conf:/etc/redis/redis.conf
      - ./redis-1/data:/data
    command: redis-server /etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
  redis-2:
    image: redis:latest
    container_name: redis-2
    networks:
      redis:
        ipv4_address: 172.19.0.12
    ports:
      - "6380:6379"
      - "16380:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./redis-2/conf/redis.conf:/etc/redis/redis.conf
      - ./redis-2/data:/data
    command: redis-server /etc/redis/redis.conf
  redis-3:
    image: redis:latest
    container_name: redis-3
    networks:
      redis:
        ipv4_address: 172.19.0.13
    ports:
      - "6381:6379"
      - "16381:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./redis-3/conf/redis.conf:/etc/redis/redis.conf
      - ./redis-3/data:/data
    command: redis-server /etc/redis/redis.conf
  redis-4:
    image: redis:latest
    container_name: redis-4
    networks:
      redis:
        ipv4_address: 172.19.0.14
    ports:
      - "6382:6379"
      - "16382:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./redis-4/conf/redis.conf:/etc/redis/redis.conf
      - ./redis-4/data:/data
    command: redis-server /etc/redis/redis.conf
  redis-5:
    image: redis:latest
    container_name: redis-5
    networks:
      redis:
        ipv4_address: 172.19.0.15
    ports:
      - "6383:6379"
      - "16383:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./redis-5/conf/redis.conf:/etc/redis/redis.conf
      - ./redis-5/data:/data
    command: redis-server /etc/redis/redis.conf
  redis-6:
    image: redis:latest
    container_name: redis-6
    networks:
      redis:
        ipv4_address: 172.19.0.16
    ports:
      - "6384:6379"
      - "16384:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./redis-6/conf/redis.conf:/etc/redis/redis.conf
      - ./redis-6/data:/data
    command: redis-server /etc/redis/redis.conf

# 自动创建网络,并手动指定IP网段
networks:
  redis:
    ipam:
      config:
        - subnet: 172.19.0.0/16

Modo HOST, IP separada, instalación de puerto diferente

Artículo de referencia:

1. Docker-compose e inicio de secuencia de comandos con un solo clic

Similar al anterior, pero hay algunas diferencias y se han escrito algunos scripts de configuración generados.

La principal diferencia es que aquí se usa la red de puente que viene con docker, y se usan diferentes puertos para crear clústeres.

Plantilla de archivo de configuración redis-cluster.tmpl.

port 6379
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 172.17.0.1
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}

Nota: Aquí cluster-announce-ip es la IP de la tarjeta de red del puente. usar diferentescluster-announce-port ${PORT} cluster-announce-bus-port 1${PORT}

Generar script de archivo de configuración generar.sh

Genere 6 archivos de configuración de instancia, 3 maestros y 3 esclavos. Comunicación en diferentes puertos bajo 172.17.0.1:6379, 172.17.0.1:6380, ..., 172.17.0.1:6384

for port in `seq 6379 6384`; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data;\
done

docker-compose.yaml

# 描述 Compose 文件的版本信息
version: "3.8"

# 定义服务,可以多个
services:
  redis-cluster:
    image: redis:latest
    command: redis-cli --cluster create 172.17.0.1:6379 172.17.0.1:6380 172.17.0.1:6381 172.17.0.1:6382 172.17.0.1:6383 172.17.0.1:6384 --cluster-replicas 1  --cluster-yes
    depends_on:
      - redis-6379
      - redis-6380
      - redis-6381
      - redis-6382
      - redis-6383
      - redis-6384
  redis-6379: # 服务名称
    image: redis:latest # 创建容器时所需的镜像
    container_name: redis-6379 # 容器名称
    restart: "no" # 容器总是重新启动
    ports:
      - "6379:6379"
      - "16379:16379"
    volumes: # 数据卷,目录挂载
      - ./etc_rc.local:/etc/rc.local
      - ./6379/conf/redis.conf:/etc/redis/redis.conf
      - ./6379/data:/data
    command: redis-server /etc/redis/redis.conf # 覆盖容器启动后默认执行的命令

  redis-6380:
    image: redis:latest
    container_name: redis-6380
    ports:
      - "6380:6379"
      - "16380:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./6380/conf/redis.conf:/etc/redis/redis.conf
      - ./6380/data:/data
    command: redis-server /etc/redis/redis.conf

  redis-6381:
    image: redis:latest
    container_name: redis-6381
    ports:
      - "6381:6379"
      - "16381:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./6381/conf/redis.conf:/etc/redis/redis.conf
      - ./6381/data:/data
    command: redis-server /etc/redis/redis.conf

  redis-6382:
    image: redis:latest
    container_name: redis-6382
    ports:
      - "6382:6379"
      - "16382:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./6382/conf/redis.conf:/etc/redis/redis.conf
      - ./6382/data:/data
    command: redis-server /etc/redis/redis.conf

  redis-6383:
    image: redis:latest
    container_name: redis-6383
    ports:
      - "6383:6379"
      - "16383:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./6383/conf/redis.conf:/etc/redis/redis.conf
      - ./6383/data:/data
    command: redis-server /etc/redis/redis.conf

  redis-6384:
    image: redis:latest
    container_name: redis-6384
    ports:
      - "6384:6379"
      - "16384:16379"
    volumes:
      - ./etc_rc.local:/etc/rc.local
      - ./6384/conf/redis.conf:/etc/redis/redis.conf
      - ./6384/data:/data
    command: redis-server /etc/redis/redis.conf

# 使用已经存在的bridge网络,或者也可以手动创建一个 替换上面的172.17.0.1
# 创建方式:docker network create redis --subnet 172.28.0.0/16
# 当然也有另一种方式,就是用docker-compose自动创建的网络,不过需要手动进入一个容器运行 cluster 创建命令
networks:
  persist:
    external:
      name: bridge

otras referencias

Supongo que te gusta

Origin juejin.im/post/7120791867741962271
Recomendado
Clasificación