Redis는 매우 빠르고 안정적인 매우 악명 높은 키-값 저장소입니다. 그러나 실시간 애플리케이션이 필요하고 트래픽이 많은 순간에 애플리케이션을 확장해야하는 상황이 있습니다.
Bellow 최종 도커 작성 파일을 붙여넣고 중요한 부분을 설명합니다. 이 경우 내 애플리케이션은 MariaDb를 사용하여 NodeJS에 빌드됩니다.
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는 도메인에서 작동하지 않기 때문에 고정 IP가 필요합니다. 이 경우 모든 redis 노드를 동일한 네트워크에 함께 만들기 위해 docker 서브넷 네트워크를 만들어야합니다.
또한 도커 네트워크 내부의 포트 충돌을 피하기 위해 각 redis 노드에 대한 포트를 설정해야합니다.
또한 docker-compose ports인수에 지정된 동일한 포트는 redis.conf파일에 지정된 동일한 포트 여야 합니다.
redis.conf파일을 살펴 보자
port 6373
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
모든 redis.conf파일 의 유일한 차이점 은 포트 번호입니다. 포트 번호가 redis.conf파일 내부 와 ports인수가 동일한 지 확인 하십시오 .docker-compose.yml
컨테이너가 다시 시작될 때 전체 클러스터 및 애플리케이션에서 데이터를 사용할 수 있도록합니다.
모든 redis 노드가 가동되면 클러스터에 모두 가입해야합니다. 이를 달성하기 위해 명령 redis-cluster을 실행하는 서비스를 만듭니다 redis-cli cluster.
앞서 말했듯 redis-cli cluster이 고정 IP에서만 작동하므로 IP 및 포트 값에주의해야 할 때를 기억하십시오 .
서비스의 목적은 redis-cli 클러스터를 실행하는 것입니다. 명령이 완료되면 서비스가 죽는 데 문제가 없습니다.
내 기사는 Redis 클러스터에 초점을 맞추고 있으므로 NodeJ 및 Mariadb 서비스에 대해서는 설명하지 않습니다.
그러나 그것에 대한 정보를 저에게 자유롭게 물어보십시오. 도와 드리겠습니다 :)
참조 :
오늘 저는 Node JS 인터뷰 질문 시리즈를 계속하고 있습니다. 이 시리즈는 시작하기 전에 기본에서 고급까지 인터뷰에서 묻는 중요한 질문을 다루는 5개의 파트를 기반으로 합니다.
이 기사에서는 postgreSQL 데이터베이스를 사용하여 간단한 golang CRUD 애플리케이션을 도커화하려고 합니다. 먼저 애플리케이션을 만들어 봅시다.
당신이 자라면 세상은 있는 그대로이고 당신의 삶은 단지 세상 안에서 당신의 삶을 사는 것이며, 결코 당신의 생명을 위험에 빠뜨리지 않고, 정해진 길을 따르고 결국 죽고, 벽을 너무 세게 치세요.하지만 그것은 매우 제한된 삶입니다.
지역 서점과 또 다른 책을 흥정하면서 손에 가려움증이 퍼졌습니다. 내가 최근에 구입한 나머지 책과 같은 이 책은 내 'To Be Read'(TBR) 더미에서 왕좌를 찾을 것입니다. 그러나 나는 그것을 샀다.
“Siri야, Olivia Dean의 Me Dive 재생해줘.” 나이지리아 아쿠레에 있는 Future Academy Africa에서 인턴십을 시작한 것은 2021년 5월이었습니다.
지난 주에 저는 PressGazette(영국 언론 뉴스 웹사이트)를 통해 발송된 보도 자료를 보았습니다. 이 기사는 Scandi 팟캐스트 호스팅 및 광고 회사인 Acast가 팟캐스팅에서 "아마도 가장 영향력 있는" 게시자 컨소시엄을 이끌 것이라고 발표했습니다.