Compilación de Redis Cluster con docker-compose

Redis es un almacén de valores clave muy conocido, muy rápido y estable. Sin embargo, hay algunas situaciones en las que necesitamos aplicaciones en tiempo real y escalar nuestra aplicación en algunos momentos de alto tráfico.

A continuación, pego mi archivo docker-compose final y explicaré algunas partes importantes. En ese caso, mi aplicación se basa en NodeJS con MariaDb.

version: '3.5'
services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - 3000:3000
    environment:
      REDIS_NODE_1: redis-node-1:6373
      REDIS_NODE_2: redis-node-2:6374
      REDIS_NODE_3: redis-node-3:6375
      REDIS_NODE_4: redis-node-4:6376
      REDIS_NODE_5: redis-node-5:6377
      REDIS_NODE_6: redis-node-6:6378
    volumes:
      - '.:/usr/src/app'
      - nodemodules:/usr/local/app/node_modules
    networks:
      app_subnet:
        ipv4_address: 172.20.0.10
    depends_on:
      - db
      - redis-cluster
db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: feedback
      MYSQL_DATABASE: feedback
      MYSQL_USER: feedback
      MYSQL_PASSWORD: feedback
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - 3306:3306
    networks:
      app_subnet:
        ipv4_address: 172.20.0.20
redis-cluster:
    image: 'redis:6.0-alpine'
    command: redis-cli --cluster create 172.20.0.31:6373 172.20.0.32:6374 172.20.0.33:6375 172.20.0.34:6376 172.20.0.35:6377 172.20.0.36:6378 --cluster-replicas 1 --cluster-yes
    networks:
      app_subnet:
        ipv4_address: 172.20.0.30
    depends_on:
      - redis-node-1
      - redis-node-2
      - redis-node-3
      - redis-node-4
      - redis-node-5
      - redis-node-6
redis-node-1:
    image: 'redis:6.0-alpine'
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - '6373:6373'
    volumes:
      - redis-node-1-data:/var/lib/redis
      - ./docker/redis-node-1.conf:/usr/local/etc/redis/redis.conf
    networks:
      app_subnet:
        ipv4_address: 172.20.0.31
redis-node-2:
    image: 'redis:6.0-alpine'
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - '6374:6374'
    volumes:
      - redis-node-2-data:/var/lib/redis
      - ./docker/redis-node-2.conf:/usr/local/etc/redis/redis.conf
    networks:
      app_subnet:
        ipv4_address: 172.20.0.32
redis-node-3:
    image: 'redis:6.0-alpine'
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - '6375:6375'
    volumes:
      - redis-node-3-data:/var/lib/redis
      - ./docker/redis-node-3.conf:/usr/local/etc/redis/redis.conf
    networks:
      app_subnet:
        ipv4_address: 172.20.0.33
redis-node-4:
    image: 'redis:6.0-alpine'
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - '6376:6376'
    volumes:
      - redis-node-4-data:/var/lib/redis
      - ./docker/redis-node-4.conf:/usr/local/etc/redis/redis.conf
    networks:
      app_subnet:
        ipv4_address: 172.20.0.34
redis-node-5:
    image: 'redis:6.0-alpine'
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - '6377:6377'
    volumes:
      - redis-node-5-data:/var/lib/redis
      - ./docker/redis-node-5.conf:/usr/local/etc/redis/redis.conf
    networks:
      app_subnet:
        ipv4_address: 172.20.0.35
redis-node-6:
    image: 'redis:6.0-alpine'
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - '6378:6378'
    volumes:
      - redis-node-6-data:/var/lib/redis
      - ./docker/redis-node-6.conf:/usr/local/etc/redis/redis.conf
    networks:
      app_subnet:
        ipv4_address: 172.20.0.36
volumes:
  db-data:
  redis-node-1-data:
  redis-node-2-data:
  redis-node-3-data:
  redis-node-4-data:
  redis-node-5-data:
  redis-node-6-data:
  nodemodules:
networks:
  app_subnet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24

Se requiere una IP estática porque redis-cluster no funciona con dominios. En ese caso, tengo que crear una red de subred de Docker para hacer que todos los nodos de Redis estén juntos en la misma red.

Además, tengo que configurar el puerto para cada nodo de redis para evitar la colisión de puertos dentro de la red de la ventana acoplable.

Además, el mismo puerto especificado en el portsargumento docker-compose debe ser el mismo puerto especificado en el redis.confarchivo

Echemos un vistazo al redis.confarchivo

port 6373
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

La única diferencia entre todos los redis.confarchivos es el número de puerto. Preste atención para asegurarse de que el número de puerto sea el mismo redis.confarchivo interno y portsargumentos endocker-compose.yml

2: volumen de datos de Mount Redis

Hace que los datos estén disponibles para todo el clúster y la aplicación cuando los contenedores comienzan de nuevo.

3 - Contenedor de Docker para crear el clúster

Cuando todos los nodos de redis están activos, tengo que unirlos a todos en un clúster. Para lograrlo, creo el redis-clusterservicio para ejecutar el redis-cli clustercomando.

Recuerda, como dije antes, redis-cli clustersolo funciona con IP estática, así que cuando tengo que prestar atención a los valores de IP y puertos.

El propósito del servicio es solo ejecutar el clúster redis-cli. No hay problema, el servicio muere cuando el comando ha finalizado

Pensamientos finales

Mi artículo se centra en el clúster de Redis, por lo que no explico nada sobre los servicios NodeJs y Mariadb.

Sin embargo, no dude en pedirme información al respecto. Será un placer ayudarte :)

Referencias:

  • https://iamvishalkhare.medium.com/create-a-redis-cluster-faa89c5a6bb4
  • https://www.dltlabs.com/blog/how-to-setup-configure-a-redis-cluster-easily-573120
  • https://serverfault.com/questions/812156/redis-cluster-error-moved

Suggested posts

Preguntas de la entrevista de Node JS (de básico a avanzado) Parte 5

Preguntas de la entrevista de Node JS (de básico a avanzado) Parte 5

Hoy continúo con la serie de preguntas de entrevistas de Node JS. Esta serie se basará en 5 partes que cubren las preguntas importantes que se hacen en las entrevistas desde Básico hasta Avanzado Antes de comenzar.

DevOps-1: Dockerize su aplicación Golang con la base de datos PostgreSQL.

DevOps-1: Dockerize su aplicación Golang con la base de datos PostgreSQL.

En este artículo, intentaremos dockerizar una aplicación CRUD simple de golang con una base de datos postgreSQL. Primero creemos nuestra aplicación.

Related posts

¿Es el arte alguna vez apolítico?

¿Es el arte alguna vez apolítico?

Ayer cerramos la puerta del Festival de la Canción de Eurovisión de este año con una gran final brillante y caótica en la que la cantante sueca Loreen se llevó a casa el trofeo, convirtiéndose en la primera mujer en ganar dos veces y devolviendo la corona a Suecia 50 años después de que ABBA ganara la competencia. con “Waterloo”. Se convirtieron en uno de los actos más grandes en el canon de la música pop.

Twitter de televisión en red

Twitter de televisión en red

Lo que es viejo ahora es nuevo otra vez y lo que solía ser algo reluciente ahora se siente aburrido. No me refiero a que los jeans JNCO regresen entre los chicos geniales del centro de la ciudad junto con otras modas de fines de la década de 1990.

La erosión lenta: revelando las formas en que las personas se desgastan en sus carreras

La erosión lenta: revelando las formas en que las personas se desgastan en sus carreras

En el mundo acelerado y competitivo de hoy, la carrera de uno juega un papel importante en el crecimiento personal, la estabilidad financiera y la satisfacción general con la vida. Sin embargo, muchas personas se encuentran atrapadas en un ciclo implacable de estancamiento e insatisfacción, y su vida profesional se desvanece gradualmente.

VIDA ILIMITADA

Cuando creces, tiendes a que te digan que el mundo es como es y que tu vida es solo vivir tu vida dentro del mundo, nunca arriesgar tu vida, solo sigue un camino establecido y muere al final, y trata de no hacerlo. golpea demasiado las paredes. Pero esa es una vida muy limitada.