Project/์‹นํ‹”์›€

[์‹นํ‹”์›€] 11/17 ๊ฐœ๋ฐœ์ผ์ง€ EC2 ์— Redis, Kafka, elasticsearch ๋„์šฐ๊ณ  ์—ฐ๊ฒฐํ•˜๊ธฐ

ํ•œ33 2024. 12. 1. 14:02

๐Ÿ’ก ๋ชฉํ‘œ

์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ์— ์“ฐ์ธ Redis, Kafka, elasticsearch ๋ฅผ EC2 ์— ๋„์›Œ์„œ ๋ฉ”์ธ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ์‹œ์ผœ์•ผํ–ˆ๋‹ค.


๊ธฐ์กด ๋ฉ”์ธ ์„œ๋ฒ„์— Docker compose ๋ฅผ ์„ค์น˜ํ•ด์„œ ๋ฉ”์ธ ์„œ๋ฒ„์™€ ํ•จ๊ป˜ Redis, Kafka, elasticsearch ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ ์ž ํ–ˆ๋‹ค.

๐ŸŒฑ Docker compose ์„ค์น˜

sudo su

๊ด€๋ฆฌ์ž ๋ชจ๋“œ ์‹คํ–‰

 

apt-get update

์ธ์Šคํ„ด์Šค ํŒจํ‚ค์ง€ ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ

 

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Docker compose ๋ฐ”์ด๋„ˆ๋ฆฌ ๋‹ค์šด๋กœ๋“œ

 

chmod +x /usr/local/bin/docker-compose

๋‹ค์šด๋กœ๋“œํ•œ Docker compose ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์‹คํ–‰ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.


๐ŸŒฑ t2.micro ์—์„œ๋Š” ๋ฌด๋ฆฌ

nano .docker-compose.yml

docker-compose ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๊ธฐ์กด์— ๋กœ์ปฌ์—์„œ ์ž‘์„ฑํ–ˆ๋˜ docker-compose ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ

docker-compose up ์„ ํ†ตํ•ด์„œ ์‹คํ–‰์‹œํ‚ค๋‹ˆ๊นŒ

 

์„œ๋ฒ„๊ฐ€ ์ฃฝ์—ˆ๋‹ค.

 

git bash ์ฐฝ์ด ๋Š๋ ค์ง€๊ณ  ์‘๋‹ต์ด ์—†๊ณ  ํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด๋ณด๋‹ˆ CPU ์‚ฌ์šฉ๋Ÿ‰์ด 100% ๋กœ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ ธ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์žฌ๋ถ€ํŒ…ํ•ด์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

์•„๋ฌด๋ž˜๋„ ๊ธฐ์กด docker-compose ํŒŒ์ผ์— ์ ์šฉ๋˜์–ด์žˆ๋˜ redis, kafka, elasticsearch ๋ฅผ ๋‚˜๋ˆ ์„œ ๊ฐ ๊ฐ์˜ EC2 ์—์„œ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด๋ณด์ธ๋‹ค.

 

๊ธฐ์กด EC2 ์—์„œ๋Š”

 

# ์ค‘์ง€๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ
sudo docker container prune -f

# ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์ด๋ฏธ์ง€ ์‚ญ์ œ
sudo docker image prune -a -f

# ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ณผ๋ฅจ ์‚ญ์ œ
sudo docker volume prune -f

# ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์‚ญ์ œ
sudo docker network prune -f

 

๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฐ„์„ ๋‹ค์‹œ ํ™•๋ณดํ•ด์คฌ๋‹ค.

 

df -h

ํ•ด๋‹น ๋ช…๋ น์–ด๋กœ ๋‚จ์€ ์šฉ๋Ÿ‰์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๐ŸŒฑ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค t2.micro ์—์„œ Elastic search ์„ค์น˜ ์‹œ๋„

์ด ์˜ค๋ฅ˜๋Š” Elasticsearch๊ฐ€ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” JVM ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์‹œ์Šคํ…œ์—์„œ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

Elasticsearch๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ๋‹นํ•œ ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ํฐ ์šฉ๋Ÿ‰์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ถ„์„

  • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ Native memory allocation (mmap) failed to map 2147483648 bytes๋ผ๊ณ  ๋‚˜์˜ค๋Š” ๋ถ€๋ถ„์„ ๋ณด๋ฉด, Elasticsearch๊ฐ€ 2GB์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋‚˜, ์‹œ์Šคํ…œ์—์„œ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ
  • ์ด ๋ฌธ์ œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด๊ฑฐ๋‚˜ ES_JAVA_OPTS์— ์„ค์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ–ˆ์„ ๋•Œ ๋ฐœ์ƒ

docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
    container_name: elasticsearch
    environment:
      - node.name=es01
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"  # ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ 1GB๋กœ ์„ค์ •
      - xpack.security.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es-data:/usr/share/elasticsearch/data  # Elasticsearch ๋ฐ์ดํ„ฐ ์ €์žฅ
    ports:
      - "9200:9200"  # HTTP ํฌํŠธ
      - "9300:9300"  # Transport ํฌํŠธ
    networks:
      - es_network

volumes:
  es-data:  # Elasticsearch ๋ฐ์ดํ„ฐ ์ €์žฅ์šฉ Volume

networks:
  es_network:  # ์ปค์Šคํ…€ ๋„คํŠธ์›Œํฌ ์„ค์ •
    driver: bridge

 

1. docker-compose ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ elasticsearch ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ 1GB ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

2. t2.medium ์œผ๋กœ ์ธ์Šคํ„ด์Šค ์œ ํ˜• ๋ณ€๊ฒฝํ–ˆ๋‹ค.


๐ŸŒฑ Kafka docker-compose ์„ค์ •

version: "3.8"

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_CLIENT_PORT: 2181
    ports:
      - "22181:2181"

  kafka1:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "19092:19092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:9092,EXTERNAL://172.31.40.10:19092
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL

  kafka2:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "19093:19093"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka2:9093,EXTERNAL://172.31.40.10:19093
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL

  kafka3:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "19094:19094"
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka3:9094,EXTERNAL://172.31.40.10:19094
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL

 

Kafka ์ธ์Šคํ„ด์Šค์—์„œ๋Š” ์œ„์ฒ˜๋Ÿผ docker-compose.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋Š”๋ฐ,

 

๊ธฐ์กด์— EXTERNAL ๋ถ€๋ถ„์—์„œ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ docker-compose ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™”๋‹ค ๋ณด๋‹ˆ localhost ๋กœ ๋˜์–ด์žˆ์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ฅผ kafka ์ธ์Šคํ„ด์Šค์˜ ํ”„๋ผ์ด๋น—  ip ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.


๐ŸŒฑ EC2 ๋“ค ๊ฐ„์— PORT ์—ฐ๊ฒฐ

์œ„์ฒ˜๋Ÿผ ๋‚ด ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ EC2 ๋“ค์„ ๋„์›Œ์คฌ๋‹ค.

์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šด ํฌํŠธ๋ฅผ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์—์„œ ์—ด์–ด์ค˜์•ผํ•œ๋‹ค.

 

Kafka ์ธ์Šคํ„ด์Šค ์ ์šฉ ๋ณด์•ˆ ๊ทธ๋ฃน ๊ทœ์น™

 

์œ„๋Š” Kafka ์ธ์Šคํ„ด์Šค์— ์ ์šฉ๋œ ๋ณด์•ˆ ๊ทธ๋ฃน ๊ทœ์น™์ด๋‹ค.

์œ„์ฒ˜๋Ÿผ Redis ์™€ elastic search ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ด์–ด์ฃผ๋ฉด ๋œ๋‹ค.

Notification ์€ 8082 ํฌํŠธ๋กœ ์—ด์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ์šฉ์‹œ์ผœ์ฃผ๋ฉด ๋˜์—ˆ๋‹ค.