Docker 컨테이너 환경에서 ARCUS 캐시 사용하기

잼투인·2024년 3월 4일
1

image

들어가며

ARCUS 캐시를 직접 장비에 설치하여 사용하기 위해서는 의존성을 설치하고 컴파일한 후 실행해야 하는 복잡함이 존재합니다. 이번 포스팅에서는 ARCUS를 간편하게 Docker 환경에서 사용하는 방법을 살펴봅니다. Docker에 대한 개념을 먼저 간단히 설명 드리고, 단일 캐시 노드를 구동하는 방법부터 Docker Compose를 활용해 캐시 클러스터를 구동하는 방법까지 차근차근 나아가 보겠습니다.

Docker란?

Docker는 컨테이너 기술을 이용해 리눅스 프로세스를 격리된 환경에서 실행하는 가상화 플랫폼입니다. 여러 개의 프로세스를 동일한 환경에서 실행할 수 있다는 점에서 가상머신과 비슷하지만, Guest OS를 요구하지 않아 가상머신보다 성능 상 이점이 큽니다. 또한 Docker Hub를 통해 이미지를 공유하면 누구나 접근할 수 있고, Docker가 설치되어 있다면 바로 로컬 환경에서 사용해 볼 수 있습니다. Docker Compose 기능을 활용하면 여러 Docker 컨테이너를 하나의 어플리케이션으로 동작할 수 있도록 묶어 한 번에 띄울 수 있기 때문에 클러스터링에 용이합니다.

이번 포스팅에서는 Docker Hub에서 잼투인이 제공하는 arcus-memcached 이미지를 사용해 ARCUS 캐시 서버를 간편하게 구동하고 동작을 확인해보겠습니다. 그리고 Docker Compose를 사용하여 캐시 서버 3개로 구성된 ARCUS 캐시 클러스터를 구동해 보겠습니다.

단일 ARCUS 캐시 서버 실행

먼저 arcus-memcached 이미지를 사용해 하나의 ARCUS 캐시 서버를 실행해보겠습니다. 사용한 Docker 버전은 24.0.5 입니다.

1) Docker 이미지 가져오기

docker pull 명령어를 사용하면 Docker Hub로부터 arcus-memcached 이미지를 pull 할 수 있습니다. 참고로 Docker 이미지를 가져오지 않은 상태여도 다음 단계의 컨테이너 실행 명령어를 수행할 때 자동으로 pull을 하기 때문에 이 과정은 생략해도 됩니다.

docker pull jam2in/arcus-memcached

2) Docker container 실행하기

docker run 명령어를 이용해 arcus-memcached 이미지를 기반으로 컨테이너를 생성하고 실행합니다. 아래 명령어를 실행하면 11211번 포트를 listen하는 ARCUS 캐시 서버 한 개가 컨테이너 상에서 실행됩니다.

docker run --name arcus_memcached -p 11211:11211 -d jam2in/arcus-memcached

컨테이너를 실행할 때 docker run 명령의 실행 옵션과 ARCUS 캐시 구동 옵션을 사용할 수 있습니다. docker run 명령에 사용된 옵션을 간단히 설명드리겠습니다.

  • name: 실행할 컨테이너의 이름을 지정합니다. 값을 주지 않을 경우 무작위로 이름이 부여됩니다.

  • p: host와 컨테이너의 port를 매핑하는 옵션입니다. host-port:container-port 형식으로 작성합니다.

  • d: 옵션을 부여하면 백그라운드에서 실행합니다.

  • 자세한 docker run 옵션은 링크를 참고 바랍니다.

ARCUS 캐시의 구동 옵션은 아래와 같이 이미지 이름 다음에 지정해야 하며, 별도로 지정하지 않으면 기본값이 사용됩니다.

docker run --name arcus_memcached -p 11212:11212 -d jam2in/arcus-memcached -p 11212 -m 100 -c 100 -v

ARCUS 캐시의 구동 옵션을 간단히 설명드리겠습니다.

  • p: listen할 port를 지정합니다. 이 옵션을 지정한 후, 앞서 docker run 옵션에서 명시한 container port도 동일하게 설정해주어야 합니다.

  • m: 캐시에서 사용할 최대 메모리(MB)를 지정합니다.

  • c: 캐시 서버에 연결 가능한 최대 커넥션 개수를 지정할 수 있습니다.

  • v: 캐시 서버 로그를 확인하기 위한 옵션입니다. 이 옵션을 지정하지 않으면 WARN 레벨의 로그만 볼 수 있으며, -v 지정 시 INFO 레벨의 로그를, -vv 지정 시 DEBUG 레벨의 로그를, -vvv 지정 시 DETAIL 레벨의 로그를 확인할 수 있습니다.

  • z: 캐시 클러스터로 구동 시 필요한 옵션으로, 캐시 서버에서 연결할 zookeeper 앙상블의 주소를 입력합니다.

  • 자세한 ARCUS 캐시 구동 옵션 설명과 기본값은 링크를 참고바랍니다.

3) ARCUS 동작 확인

ARCUS 캐시 서버를 컨테이너를 실행한 후에는 nc 명령어를 이용해 정상적으로 구동되었는지 확인할 수 있습니다.

echo stats | nc localhost 11211

컨테이너가 정상적으로 실행되었다면 다음과 같은 응답을 받을 수 있습니다.

STAT pid 1
STAT uptime 606
STAT time 1701941770
STAT version 1.13.4
STAT libevent 2.1.12-stable
STAT pointer_size 64
STAT hb_count 201
STAT hb_latency 339
....

Mac Sonoma OS 등 nc 명령어가 동작하지 않는 환경이 있다면, telnet 명령어를 사용해 확인해주세요.

4) ARCUS 캐시 중지

구동중인 ARCUS 캐시 서버를 중지하고자 한다면, 아래와 같이 docker stop container-name명령어를 사용해 컨테이너를 중지해야 합니다.

docker stop arcus_memcached

ARCUS 캐시 클러스터 구성 및 실행

ARCUS는 ZooKeeper를 이용한 클러스터링 방식을 지원합니다. 이번에는 아래와 같이 ZooKeeper 서버 3개로 구성된 앙상블과 ARCUS 캐시 서버 3개로 구성된 클러스터를 Docker Compose를 이용하여 단일 장비에서 구동해보겠습니다.

service code: test
+--------------------+   +--------------------+   +--------------------+
| zoo1               |   | zoo2               |   | zoo3               |
+--------------------+   +--------------------+   +--------------------+
|                    |   |                    |   |                    |
|container-port:2181 |   |container-port:2181 |   |container-port:2181 |
|host-port:2181      |   |host-port:2182      |   |host-port:2183      |
|                    |   |                    |   |                    |
+--------------------+   +--------------------+   +--------------------+
+--------------------+   +--------------------+   +--------------------+
| cache1             |   | cache2             |   | cache3             |
+--------------------+   +--------------------+   +--------------------+
|                    |   |                    |   |                    |
|container-port:11211|   |container-port:11211|   |container-port:11211|
|host-port:11211     |   |host-port:11212     |   |host-port:11213     |
|                    |   |                    |   |                    |
+--------------------+   +--------------------+   +--------------------+

1) docker-compose.yml 파일 작성

아래와 같은 과정을 거쳐 Docker Compose로 ARCUS 캐시 클러스터를 구동할 수 있습니다.

  • 3개의 host로 구성된 Zookeeper 컨테이너를 띄워 앙상블을 구성합니다.

  • ZkCli 컨테이너를 구동하여 ARCUS 캐시 서버가 Zookeeper에 등록될 수 있도록 ZNode를 생성합니다. 생성이 완료되면 컨테이너는 종료됩니다.

  • 3개의 ARCUS 캐시 컨테이너를 띄워 캐시 서버가 클러스터 형태로 실행되도록 합니다.

다음은 위 컨테이너들을 구동하는 docker-compose.yml 파일입니다.

version: "3.1"

services:
  zoo1:
    image: zookeeper:3.5.9
    hostname: zoo1
    ports:
    - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    restart: always

  zoo2:
    image: zookeeper:3.5.9
    hostname: zoo2
    ports:
    - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    restart: always

  zoo3:
    image: zookeeper:3.5.9
    hostname: zoo3
    ports:
    - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    restart: always

  register:
    depends_on:
    - zoo1
    - zoo2
    - zoo3
    image: jam2in/zkcli:3.5.9
    environment:
      ZK_ENSEMBLE: zoo1:2181,zoo2:2181,zoo3:2181
      SERVICE_CODE: test
      CACHENODES: cache1:11211,cache2:11212,cache3:11213
    restart: on-failure

  cache1:
    depends_on:
      register:
        condition: service_completed_successfully
    image: jam2in/arcus-memcached
    command: -m 100 -p 11211 -z zoo1:2181,zoo2:2181,zoo3:2181
    hostname: cache1
    ports:
    - 11211:11211
    environment:
      ARCUS_CACHE_PUBLIC_IP: 127.0.0.1
    restart: always

  cache2:
    depends_on:
      register:
        condition: service_completed_successfully
    image: jam2in/arcus-memcached
    command: -m 100 -p 11212 -z zoo1:2181,zoo2:2181,zoo3:2181
    hostname: cache2
    ports:
    - 11212:11212
    environment:
      ARCUS_CACHE_PUBLIC_IP: 127.0.0.1
    restart: always

  cache3:
    depends_on:
      register:
        condition: service_completed_successfully
    image: jam2in/arcus-memcached
    command: -m 100 -p 11213 -z zoo1:2181,zoo2:2181,zoo3:2181
    hostname: cache3
    ports:
    - 11213:11213
    environment:
      ARCUS_CACHE_PUBLIC_IP: 127.0.0.1
    restart: always

yml 파일에 작성한 옵션들 중 중요한 옵션만 간단히 살펴보겠습니다. 먼저 ZooKeeper 컨테이너 구동 시 사용한 옵션은 아래와 같습니다.

  • ZOO_MY_ID: ZooKeeper 서버의 myid 값을 지정합니다. 각 컨테이너마다 다르게 설정해주어야 하나의 앙상블을 구성할 수 있습니다. ID는 앙상블 내에서 고유해야 하며 1에서 255 사이의 값을 가져야 합니다.

  • ZOO_SERVERS: ZooKeeper 앙상블 구성을 위한 ZooKeeper 주소 목록을 server.myid=host:server-port:election-port;client-port 형태로 입력합니다.

다음으로 zkcli 컨테이너 구동 시 사용한 옵션은 아래와 같습니다. 참고로 zkcli 컨테이너는 ZooKeeper 앙상블에 접속하여 캐시 클러스터 정보를 ZNode로 저장하는 역할을 합니다. 이 정보는 클러스터 운영 시 사용됩니다.

  • depends_on: ZooKeeper 컨테이너들이 모두 구동되어 앙상블을 형성한 후에 zkcli 컨테이너가 시작되도록 합니다.

  • ZK_ENSEMBLE: 구성된 ZooKeeper 앙상블 주소를 입력하여 zkcli 컨테이너가 ZNode를 생성할 수 있도록 합니다.

  • SERVICE_CODE: ARCUS 캐시 클러스터의 서비스 코드를 지정합니다.

  • CACHENODES: ARCUS 캐시 클러스터의 모든 캐시 서버 주소를 입력하여 ZooKeeper 앙상블에서 관리되도록 합니다.

마지막으로 ARCUS 캐시 컨테이너 구동 시 사용한 옵션은 아래와 같습니다.

  • command: 단일 캐시 서버 구동 부분에서 설명드린 캐시 구동 옵션을 지정합니다. 여기서는 memory는 최대 100MB 사용하도록 하고, port는 각 서버마다 11211부터 11213까지 사용하고, -z 옵션으로 zookeeper 앙상블과 연결을 맺도록 했습니다.

  • ARCUS_CACHE_PUBLIC_IP: 도커 컨테이너 내부가 아닌 외부 환경에서 ZooKeeper 앙상블로부터 ARCUS 캐시 서버에 접근할 수 있도록 IP를 입력해줍니다.

기존에 다른 프로세스가 2181~2183 포트와 11211~11213 포트를 사용하고 있지 않는지 확인하여 만약 해당 포트를 사용중인 프로세스가 존재한다면 ZooKeeper 앙상블이나 캐시 서버가 다른 포트를 사용하도록 설정 파일을 수정해주세요.

2) docker compose 실행

docker-compose.yml 파일이 저장된 경로에서 다음 명령어를 실행하면 ZooKeeper 앙상블과 캐시 서버가 백그라운드로 실행됩니다.

docker compose up -d

3) ARCUS 동작 확인

Zookeeper 서버에 srvr 명령을 보내 서버가 정상적으로 실행되었는지 확인할 수 있습니다.

echo srvr | nc localhost 2181
echo srvr | nc localhost 2182
echo srvr | nc localhost 2183

마찬가지로 ARCUS 캐시 서버에 stats 명령을 보내 정상 실행 여부를 확인할 수 있습니다.

echo stats | nc localhost 11211
echo stats | nc localhost 11212
echo stats | nc localhost 11213

이외에도 telnet 명령어를 통해 ARCUS 캐시와 연결해 다양한 ARCUS 캐시 명령어를 사용해 볼 수 있습니다.

마치며

지금까지 Docker를 사용한 ARCUS 캐시 서버 및 캐시 클러스터 구동 방법에 대해 간단히 알아보았습니다. 컨테이너 기술은 쿠버네티스나 서버리스 기반 서비스를 개발하는데 근간이 되는 기술로, 수많은 서비스들을 빠른 시간내에 배포하는 작업이 빈번히 요구되는 운영 환경 조건들을 충족해줄 수 있어 업계에서 굉장히 많이 사용되고 있습니다.

이번 포스팅에서 다룬 Docker와 Docker Compose는 한 개의 호스트에서만 ARCUS 캐시 클러스터를 구동할 수 있기 때문에 실서비스에 적용하기 어렵다는 단점이 존재합니다. 다음 포스팅에서는 여러 호스트에서 컨테이너들을 효과적으로 관리할 수 있는 쿠버네티스를 이용해 ARCUS 캐시 클러스터를 구동하는 방법을 소개하겠습니다.

0개의 댓글