Construindo Redis Cluster com docker-compose

Redis é um armazenamento de valor-chave muito conhecido, muito rápido e estável. No entanto, existem algumas situações em que precisamos de aplicativos em tempo real e aumentamos nosso aplicativo em alguns momentos de alto tráfego.

Abaixo colo meu arquivo docker-compose final e explico algumas partes importantes. Nesse caso, meu aplicativo é construído em NodeJS com 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

O IP estático é necessário porque o redis-cluster não funciona com domínios. Nesse caso, tenho que criar uma rede de sub-rede docker para tornar todos os nós de redis juntos na mesma rede

Além disso, preciso definir a porta para cada nó do redis para evitar a colisão de portas dentro da rede docker.

Além disso, a mesma porta especificada no portsargumento docker-compose deve ser a mesma porta especificada no redis.confarquivo

Vamos dar uma olhada no redis.confarquivo

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

A única diferença entre todos os redis.confarquivos é o número da porta. Preste atenção para garantir que o número da porta seja o mesmo dentro do redis.confarquivo e portsargumentos emdocker-compose.yml

2 - Montar volume de dados Redis

É disponibilizar dados para todo o cluster e aplicativo quando os contêineres são reiniciados

3 - Contêiner Docker para criar o cluster

Quando todos os nós do redis estiverem ativos, tenho que juntar todos eles em um cluster. Para isso, crio um redis-clusterserviço para executar o redis-cli clustercomando.

Lembre-se, como falei antes, redis-cli clustersó funciona com IP estático, então quando tenho que prestar atenção nos valores de IP e portas.

O objetivo do serviço é apenas executar o cluster redis-cli. Não há nenhum problema, o serviço morre quando o comando termina

Pensamentos finais

Meu artigo é focado no cluster Redis, portanto, não explico nada sobre os serviços NodeJs e Mariadb.

No entanto, sinta-se à vontade para me pedir informações a respeito. Será um prazer atendê-lo :)

Referências:

  • 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

Perguntas da entrevista do Node JS (Básico ao Avançado) Parte 5

Perguntas da entrevista do Node JS (Básico ao Avançado) Parte 5

Hoje estou continuando a série de perguntas de entrevista do Node JS. Esta série será baseada em 5 partes que cobrem as questões importantes feitas em entrevistas do Básico ao Avançado Antes de começar.

DevOps-1: dockerize seu aplicativo Golang com banco de dados PostgreSQL.

DevOps-1: dockerize seu aplicativo Golang com banco de dados PostgreSQL.

Neste artigo, tentaremos dockerizar um aplicativo simples golang CRUD com banco de dados postgreSQL. Vamos criar nosso aplicativo primeiro.

Related posts

O assassinato de Jordan Neely e o problema do racismo “patriótico”

Os EUA podem dar o passo essencial de não igualar comportamento racista a ser um bom americano?

O assassinato de Jordan Neely e o problema do racismo “patriótico”

[Alerta de gatilho: este ensaio inclui capturas de tela de pessoas elogiando o assassino de Jordan Neely.] Os policiais finalmente - e talvez com relutância - acusaram Daniel Penny, o homem que sufocou Jordan Neely até a morte, por aquele homicídio.

pronomes são super assustadores

Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..

Journal Ouvert

Journal Ouvert

Diário aberto: uma foto por dia. Sempre fui fascinado por histórias.

O que torna um podcast influente?

O que torna um podcast influente?

Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.