Docker-compose ile Redis Kümesi oluşturma

Redis, çok kötü nam salmış anahtar/değer deposudur, çok hızlı ve kararlıdır. Ancak, gerçek zamanlı uygulamalara ihtiyaç duyduğumuz ve bazı yoğun trafik anlarında uygulamamızı ölçeklendirdiğimiz bazı durumlar var.

Körük, son docker-compose dosyamı yapıştırıyorum ve bazı önemli kısımları açıklıyorum. Bu durumda, uygulamam MariaDb ile NodeJS üzerine kuruludur.

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

Redis-cluster etki alanlarıyla çalışmadığından statik IP gereklidir. Bu durumda, tüm redis düğümlerini aynı ağda bir araya getirmek için bir liman işçisi alt ağ ağı oluşturmam gerekiyor.

Ek olarak, liman işçisi ağı içinde bağlantı noktası çarpışmasını önlemek için her bir redis düğümü için bağlantı noktası ayarlamam gerekiyor.

Ayrıca, docker-compose portsbağımsız değişkeninde belirtilen aynı bağlantı noktası, redis.confdosyada belirtilen bağlantı noktasıyla aynı olmalıdır.

redis.confDosyaya bir göz atalım

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

Tüm redis.confdosyalar arasındaki tek fark port numarasıdır. Bağlantı noktası numarasının redis.confdosya içindeki ve portsargümanların içindeki aynı olmasına dikkat edin .docker-compose.yml

2 - Redis veri hacmini bağla

Kapsayıcılar yeniden başladığında verileri tüm küme ve uygulama için kullanılabilir hale getirir

3 — Kümeyi oluşturmak için Docker kapsayıcısı

Tüm redis düğümleri hazır olduğunda, hepsini bir kümede birleştirmem gerekiyor. Bunu başarmak için komutu redis-clusterçalıştırmak için hizmet oluşturuyorum redis-cli cluster.

Unutma, daha önce de söylediğim gibi redis-cli clustersadece statik IP ile çalışıyor, bu yüzden IP ve port değerlerine dikkat etmem gerektiğinde.

Hizmetin amacı yalnızca redis-cli kümesini çalıştırmaktır. Komut bittiğinde sorun yok hizmet ölür

Son düşünceler

Yazım Redis kümesine odaklanıyor, bu nedenle NodeJ'ler ve Mariadb hizmetleri hakkında hiçbir şey açıklamam.

Ancak bu konuda benden bilgi almaktan çekinmeyin. Size yardımcı olmak bir zevk olacaktır :)

Referanslar:

  • 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 Mülakat Soruları (Temelden İleriye) Bölüm 5

Node JS Mülakat Soruları (Temelden İleriye) Bölüm 5

Bugün Node JS Mülakat Soruları Serisine devam ediyorum. Bu seri, Başlamadan Önce Temel'den İleri Düzey'e kadar mülakatlarda sorulan önemli soruları kapsayan 5 bölümden oluşacaktır.

DevOps-1: Golang Uygulamanızı PostgreSQL veritabanıyla dockerize edin.

DevOps-1: Golang Uygulamanızı PostgreSQL veritabanıyla dockerize edin.

Bu yazıda basit bir golang CRUD uygulamasını postgreSQL veritabanı ile dockerize etmeye çalışacağız. Öncelikle uygulamamızı oluşturalım.

Related posts

Yazma Becerinizi Geliştirmenin Kanıtlanmış 3 Yolu

Yazmanın faydaları ve bunu yapmanıza yardımcı olacak stratejiler

Yazma Becerinizi Geliştirmenin Kanıtlanmış 3 Yolu

2022'de GPT-3'ün piyasaya sürülmesiyle yazma becerisinin önemi azalmış gibi görünüyor. AI ile, zayıf yazıya sahip kişiler de kaliteli personel oluşturabilir.

Neden bazı serbest çalışanlar hayatlarını taklit ediyorlar?

Neden bazı serbest çalışanlar hayatlarını taklit ediyorlar?

Geçenlerde dünyanın en büyük profesyonel sosyal ağı olan Linkedin'deydim ve dikkatimi çeken, takip ettiğim serbest tasarımcıların gönderilerini buldum. Hepsi uçaklardan, dizüstü bilgisayarlarıyla sahilden, yüzme havuzlarından ve muhteşem manzaralı ofislerden fotoğraflar yayınladılar.

Günlük Çıkışı

Günlük Çıkışı

Açık Günlük: Her Gün Bir Resim. Hikayeler her zaman ilgimi çekmiştir.

Güvenli Bir Çalışma Ortamı Oluşturma

Güvenli Bir Çalışma Ortamı Oluşturma

"Ben tehlikedeyken beni koruyacak. Beni çadırına saklayacak.