PM2와 Docker를 이용한 루비 데몬 관리


최근 몇개월간 가상화폐거래소와 가상화폐 ICO를 준비하고 있다. 팀의 규모가 작고, 제품을 만드는데 집중하느라 부족한 인프라 작업들을 이제서야 보완하고 있다.

나같은 경우는 레일즈 프로젝트는 처음 다루어 보기도하고, 인프라쪽을 만지는 일도 익숙하지 않아 꽤나 오랜시간을 들여서야 겨우 사용할 수 있을만한 시스템을 구축했다.

데몬 관리

기존에 우리 팀은 daemons-rails라는 오픈소스를 사용해 레일즈에서 데몬을 관리하고 있었는데 사용하다보니 문제점이 점점 발견되었다.

문제점

  • 데몬이 가끔 죽음

  • 로그 찾기가 힘듦

  • 죽으면 재시작 하기 어렵다

  • 상태, PID등의 업데이트가 느리다 : 파일베이스라서

  • 더이상 서포트 되지 않음

대안

더이상 서포트 되지 않는 라이브러리이기때문에 우리가 포크를 떠서 패치를 하거나, 대체제를 찾아야 했다. 그렇게 모니터링 시스템정도만 달면 될거라 생각하고 리서치를 하게 되었다.

대표적인 모니터링 시스템인 monitgod를 후보에 올렸다. 그리고 systemd를 이용하는 방법도 고려해보았다.

결과적으로 선택한 건 monit도, god도, systemd도 아닌 pm2가 되었다.

각각 강력한 이점들이 있었지만, 나는 자바스크립트 개발자로써 pm2라는 서비스를 써보았을 때 아주 만족했던 경험이 있었다. 그로인해 머리 속에 그려지는 모습이 뚜렷했다는 점이 가장 큰 이유였다.

설계

머릿속에 그려진 모습은 이렇다.

  • pm2에서 각각의 데몬이 개별적으로 돌아간다.
  • 도커로 pm2를 말아서 배포도 쉽게한다.

pm2에서 루비 데몬 돌리기

기본적으로 pm2는 루비파일 작동이 지원된다. 즉 아주 간단하게 실행할 수 있다.

또한 pm2를 json이나 yml으로 실행하면 여러 프로세스를 실행시킬 수 있다. 그 안에 많은 옵션들이 있으니 꼭 이곳을 확인해보면서 시도해보자.

{
  "apps" : [{
    "name"        : "worker",
    "script"      : "./worker.rb",
    "watch"       : true,
    "env": {
      "NODE_ENV": "development"
    },
    "env_production" : {
       "NODE_ENV": "production"
    }
  },{
    "name"       : "api-app",
    "script"     : "./api.rb",
    "instances"  : 4,
    "exec_mode"  : "cluster"
  }]
}

위처럼 하면 간단하게 실행할 수 있다. 루비파일도 마찬가지다.

우리팀은 모두 개발자지만 가상화폐거래소 솔루션을 판매하기도 하기때문에 고객사를 위해 GUI서비스도 붙여야한다. GUI서비스는 keymetrics를 사용해도 되고 오픈소스 라이브러리를 사용해도 되고, 직접 구현해도 된다.

도커로 pm2 말기

우리팀은 도커를 데몬에만 사용하는 것이 아니기 때문에 docker-compose로 관리한다. Dockerfile은 루비도커를 기반으로 node를 설치하고 젬파일도 설치하여 최소화해서 사용했다.

노드는 pm2를 위한 설치이고, 젬파일은 루비 데몬을 돌리기 위한 설정이다.

쉽게 이야기해 docker-compose를 올리면 Dockerfile이 돌면서 데몬을 실행할 수 있는 환경을 만든다. 그 뒤 도커에서 CMD로 pm2를 실행하면 되는 것이다.

이 때 pm2와 다른 프로세스를 돌리고 싶다면 도커는 포그라운드 잡이 없으면 종료되기 때문에 유의해서 작업해야한다. 물론 하나의 프로세스만 실행하는게 BestPractice이다.

마무리

이렇게 구현하면서 우리는 많은 장점을 얻게 되었다.

  • 영속성있는 프로세스
  • 로그도 pm2가 관리
  • 비개발자도 데몬 모니터링가능
  • 배포의 용이

아주 간단해보이지만 선례를 찾지 못했고 도커에 대해 무지한 상태였기 때문에 꽤 많은 삽질을 했다.

공부하고 나니 지금하면 몇시간이면 끝날 일이되었다. 데몬 관리를 고민한다면 이 방법을 고려해 보는 게 어떨까?




© 2017. by isme2n

Powered by aiden