Budowanie klastra Redis za pomocą docker-compose

Redis jest bardzo znanym sklepem typu klucz-wartość, bardzo szybkim i stabilnym. Są jednak sytuacje, w których potrzebujemy aplikacji czasu rzeczywistego i skalujemy naszą aplikację w niektórych momentach dużego ruchu.

Poniżej wklejam mój ostateczny plik docker-compose i wyjaśniam kilka ważnych części. W takim przypadku moja aplikacja jest zbudowana na NodeJS z 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

Statyczny adres IP jest wymagany, ponieważ klaster redis nie działa z domenami. W takim przypadku muszę utworzyć sieć podsieci dockera, aby wszystkie węzły redis znalazły się w tej samej sieci

Ponadto muszę ustawić port dla każdego węzła redis, aby uniknąć kolizji portów w sieci dockera.

Co więcej, ten sam port określony w portsargumencie docker-compose musi być tym samym portem określonym w redis.confpliku

Rzućmy okiem na redis.confplik

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

Jedyną różnicą między wszystkimi redis.confplikami jest numer portu. Zwróć uwagę, aby numer portu był taki sam w redis.confpliku wewnętrznym i portsargumentach wdocker-compose.yml

2 — Zamontuj wolumen danych Redis

Udostępnia dane całemu klastrowi i aplikacji, gdy kontenery zaczynają się od nowa

3 — Kontener Dockera do tworzenia klastra

Kiedy wszystkie węzły redis działają, muszę połączyć je w klaster. Aby to osiągnąć, tworzę redis-clusterusługę do uruchamiania redis-cli clusterpolecenia.

Pamiętaj, jak powiedziałem wcześniej, redis-cli clusterdziała tylko ze statycznym IP, więc kiedy muszę zwracać uwagę na wartości IP i portów.

Celem usługi jest wyłącznie uruchomienie klastra redis-cli. Nie ma problemu, że usługa umiera po zakończeniu polecenia has

Końcowe przemyślenia

Mój artykuł koncentruje się na klastrze Redis, więc nie wyjaśniam nic na temat usług NodeJs i Mariadb.

Możesz jednak poprosić mnie o informacje na ten temat. Z przyjemnością Ci pomożemy :)

Bibliografia:

  • 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 Wywiad Pytania (od podstawowego do zaawansowanego) Część 5

Node JS Wywiad Pytania (od podstawowego do zaawansowanego) Część 5

Dzisiaj kontynuuję serię pytań do wywiadów w Node JS. Ta seria będzie oparta na 5 częściach obejmujących ważne pytania zadawane podczas wywiadów od podstawowego do zaawansowanego przed rozpoczęciem.

DevOps-1: Dokeruj swoją aplikację Golang z bazą danych PostgreSQL.

DevOps-1: Dokeruj swoją aplikację Golang z bazą danych PostgreSQL.

W tym artykule postaramy się zadokować prostą aplikację golang CRUD z bazą danych PostgreSQL. Najpierw stwórzmy naszą aplikację.

Related posts

Finansowanie usuwania dwutlenku węgla w RO24

Podział wniosków o środki Carbon180 na różne ścieżki

Finansowanie usuwania dwutlenku węgla w RO24

Autor: Alyson Lee, doradca zarządzający ds. spraw rządowych Coroczny proces przyznawania środków przez rząd federalny ma kluczowe znaczenie dla naszych wysiłków na rzecz sfinansowania usuwania dwutlenku węgla (CDR). Każdego roku Carbon180 przesyła prośby do różnych biur kongresowych, aby pomóc wskazać, gdzie będą płynąć dolary w przyszłym roku.

Zabójstwo Jordana Neely'ego i problem „patriotycznego” rasizmu

Czy Stany Zjednoczone mogą zrobić zasadniczy krok, by nie utożsamiać zachowania rasistowskiego z byciem dobrym Amerykaninem?

Zabójstwo Jordana Neely'ego i problem „patriotycznego” rasizmu

[Ostrzeżenie: ten esej zawiera zrzuty ekranowe ludzi wychwalających mordercę Jordana Neely'ego.] Funkcjonariusze organów ścigania w końcu - i być może niechętnie - oskarżyli Daniela Penny'ego, człowieka, który dusił Jordana Neely'ego aż do śmierci, o to zabójstwo.

Zbieranie OSINT na potrzeby polowania na zagrożenia

Zbieranie OSINT na potrzeby polowania na zagrożenia

Hej, cyberentuzjaści! Witamy ponownie w serii OSINT poświęconej polowaniu na zagrożenia. W pierwszym artykule przedstawiłem przegląd OSINT i jego znaczenie w polowaniu na zagrożenia.

Powolna erozja: ujawnianie sposobów, w jakie ludzie marnują swoje kariery

Powolna erozja: ujawnianie sposobów, w jakie ludzie marnują swoje kariery

W dzisiejszym dynamicznym i konkurencyjnym świecie kariera odgrywa znaczącą rolę w rozwoju osobistym, stabilności finansowej i ogólnej satysfakcji z życia. Jednak wiele osób wpada w nieustający cykl stagnacji i niezadowolenia, stopniowo marnując swoje życie zawodowe.