Redis-Cluster erstellen mit docker-compose

Redis ist ein sehr bekannter Key-Value-Store, sehr schnell und stabil. Es gibt jedoch einige Situationen, in denen wir Echtzeitanwendungen benötigen und unsere Anwendung in Momenten mit hohem Datenverkehr skalieren.

Unten füge ich meine letzte Docker-Compose-Datei ein und erkläre einige wichtige Teile. In diesem Fall basiert meine Anwendung auf NodeJS mit 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

Statische IP ist erforderlich, da Redis-Cluster nicht mit Domänen funktioniert. In diesem Fall muss ich ein Docker-Subnetz-Netzwerk erstellen, um alle Redis-Knoten im selben Netzwerk zusammenzufassen

Darüber hinaus muss ich den Port für jeden Redis-Knoten festlegen, um eine Portkollision im Docker-Netzwerk zu vermeiden.

Darüber hinaus muss derselbe Port, der im docker-compose- portsArgument angegeben ist, derselbe Port sein, der in der redis.confDatei angegeben ist

Schauen wir uns die redis.confDatei an

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

Der einzige Unterschied zwischen allen redis.confDateien ist die Portnummer. Achten Sie darauf, dass die Portnummer in der redis.confDatei und in den portsArgumenten gleich istdocker-compose.yml

2 —Redis-Datenvolumen einbinden

Es macht Daten für den gesamten Cluster und die Anwendung verfügbar, wenn Container wieder von vorne beginnen

3 – Docker-Container zum Erstellen des Clusters

Wenn alle Redis-Knoten aktiv sind, muss ich alle in einem Cluster zusammenführen. Um dies zu erreichen, erstelle ich einen redis-clusterDienst zum Ausführen des redis-cli clusterBefehls.

Denken Sie daran, wie ich bereits sagte, redis-cli clusterfunktioniert nur mit statischer IP, also wenn ich auf IP- und Port-Werte achten muss.

Der Zweck des Dienstes besteht nur darin, redis-cli-Cluster auszuführen. Es gibt kein Problem Service stirbt, wenn der Befehl beendet wurde

Abschließende Gedanken

Mein Artikel konzentriert sich auf Redis-Cluster, daher erkläre ich nichts über NodeJs und Mariadb-Dienste.

Sie können mich jedoch gerne um Informationen bitten. Es wird eine Freude sein, Ihnen zu helfen :)

Verweise:

  • 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

Node JS Interviewfragen (Grundlegend bis Fortgeschritten) Teil 5

Node JS Interviewfragen (Grundlegend bis Fortgeschritten) Teil 5

Heute setze ich die Node JS Interview Question Series fort. Diese Serie basiert auf 5 Teilen, die die wichtigen Fragen abdecken, die in Interviews von Basic bis Advanced Before Start gestellt werden.

DevOps-1: Dockerisieren Sie Ihre Golang-Anwendung mit der PostgreSQL-Datenbank.

DevOps-1: Dockerisieren Sie Ihre Golang-Anwendung mit der PostgreSQL-Datenbank.

In diesem Artikel werden wir versuchen, eine einfache Golang-CRUD-Anwendung mit einer PostgreSQL-Datenbank anzudocken. Lassen Sie uns zuerst unsere Anwendung erstellen.

Related posts

Ist Kunst jemals unpolitisch?

Ist Kunst jemals unpolitisch?

Gestern haben wir die Tür zum diesjährigen Eurovision Song Contest mit einem glitzernden, chaotischen großen Finale geschlossen, bei dem die schwedische Sängerin Loreen die Trophäe mit nach Hause nahm. Sie war damit die erste Frau, die zweimal gewann, und holte die Krone 50 Jahre nach dem Gewinn des Wettbewerbs durch ABBA zurück nach Schweden mit „Waterloo“. Sie entwickelten sich zu einem der größten Acts im Kanon der Popmusik.

Medien neu denken: McChesneys fünf Wahrheiten und die Zukunft der Kommunikation

In der heutigen hypervernetzten Welt spielen Mediensysteme eine entscheidende Rolle bei der Bildung der öffentlichen Meinung und damit bei der demokratischen Entscheidungsfindung. In seiner tiefgreifenden Analyse der politischen Ökonomie der Kommunikation stellt der Wissenschaftler Robert McChesney die herkömmliche Meinung in Frage und präsentiert die „fünf Wahrheiten“ über die Medien, wie er sie nennt.

Zwei Jahre im Design – Das Gute, das Schlechte und das Hässliche…

Zwei Jahre im Design – Das Gute, das Schlechte und das Hässliche…

„Hey Siri, spiel Me Dive von Olivia Dean.“ Es war Mai 2021, als ich mein Praktikum bei der Future Academy Africa in Akure, Nigeria, begann.

Schaffung einer sicheren Arbeitsumgebung

Schaffung einer sicheren Arbeitsumgebung

„Er wird mich beschützen, wenn ich in Gefahr bin. Er wird mich in seinem Zelt verstecken.