비동기 B2C 서버 구축하기 - monit

2019. 11. 5. 23:22 개발 이야기/오픈소스

 

안녕하세요 ~! 

음성인식에 이어 새로운 시리즈를 게시할 생각인데요!

 

신규 프로젝트로 B2C 프로젝트를 참여하고 있는데

B2B와는 다르게 수많은 트래픽을 견뎌내야 하는 이슈가 있습니다!

 

때문에 스트레스 테스트와 같은 성능 테스트가 필수라고 할 수 있는데요!

 

엄청나게 큰 리소스를 소모하는 음성인식을 B2C 서비스화 하기 위해서는

 

어떤 서버 구조를 가져야하며, 저는 어떻게 구현을 했고 어떻게 운영을 할 생각인지

 

그 계획을 쭉 시리즈로 게시할 생각입니다!

 

우선은 사용하는 데몬에 대해서 쭉 설명을 하고 이 데몬들이 하는 일은 무엇이며, 

 

서비스에 어떤 영향을 미치는지 그리고

 

결과적으로 이 데몬들이 어떻게 연결되고 수많은 트래픽을 견디도록 구성을 했는지!

데몬부터 AWS까지 모두 게시해보겠습니다!

 

먼저, 서비스하는 데몬들이

 

리소스가 풀이 나거나 에러가 발생해서 죽는 현상이 발생하곤 하는데요!

 

데몬이 죽었을 때! 

 

너.... 죽었니? 내가 살려줄게

 

하면서 살려주는 그런 착한 오픈소스가 있습니다!

 

바로 monit!!!

monit 아이콘

 

저는 원래 supervisord를 썼었는데요!

현재 프로젝트에서는 monit를 사용하기 때문에!

monit에 대해서 알아보도록 하겠습니다!

 

monit란 무엇인가!


Monit 은 Unix 및 Linux를 위한 무료 오픈 소스 프로세스 감독 도구입니다. Monit를 사용하면 시스템 상태를 명령 줄 또는 기본 HTTP (S) 웹 서버를 통해 직접 볼 수 있습니다. Monit은 오류 상황에서 자동 유지 보수, 수리 및 의미 있는 인과 관계 조치를 수행할 수 있습니다. MONIT은 인기 상승 루비 온 레일즈 와 잡종 웹 서버 도구가 레일 사이트에서 확장 루비를 지원하기 위해 실행하는 데 필요한 많은 동일한 잡종 프로세스를 관리할 수 있는 필요했기 때문에, 그리고 MONIT 상당히 유일하게 적합했다 Ruby on Rails 커뮤니티의 요구에 부응합니다. Twitter 및 scribd를 포함하여 많은 유명한 Rails 사이트에서 Monit을 사용했습니다. 

프로세스가 종료되거나 메모리 또는 CPU주기와 같은 프로세스 특성을 모니터링하고 이메일로 경고하거나 실행 및 조치하면 Monit은 프로세스를 자동으로 다시 시작할 수 있습니다. 

또한 M / Monit은 분산 컴퓨터 시스템을 모니터링하고 관리할 수 ​​있으며 M / Monit은 Monit를 에이전트로 사용하며 관리 및 모니터링할 수 있습니다. M / Monit는 라이선스 소프트웨어입니다.    - 위키디피아


위키디피아에 나와있는 데로

 

프로세스가 종료되거나 CPU 주기, 프로세스 특성을 모니터링하고!

이메일로 경고를 보내거나

 

프로세스를 자동으로 다시 실행할 수 있도록 해준다!

 

우리의 서비스의 가장 중요한 항목 중하나 죠!

 

가용성을 높여준다!

 

아마 이런 툴이 없다면 우리는 자다가도 한 번씩!

일하다가도 한 번씩! , 공부하다가도 한번씩!

프로세스들이 잘 돌아가고 있는지 확인을 해야 하는 그런 지옥 같은 삶을 살게 될 수도 있었을 겁니다!

 

(물론 현명한 IT인들이 그랬을리 없지만요~ ; )  )

 

자, 일단 설치 방법을 알아보도록 하겠습니다!

 

저는 debian 계열 리눅스를 좋아하고 사용하기 때문에 debian 계열 명령어를 기준으로 작성해보겠습니다!

 

데비안 계열은
sudo apt-get install monit

레드헷 계열은
yum install monit

자 이렇게 간단하게 설치를 할 수 있는데요!

 

사용법도 아주아주 간단합니다!

 

먼저 설정 파일을 한번 훑어보겠습니다!

 

vi /etc/monit/monitrc

 

먼저 아 로그가 /var/log/monit.log에 쌓이는구나~! 를 알 수 있죠

 

해당 부분은 웹상으로 monit 관리자 페이지에 접속할 수 있는 부분인데요!

 

주석을 해제하고 monit 데몬 재실행을 하면 아래와 같이 프로세스를 확인할 수가 있는데요!

 

프로세스의 상태를 웹상으로 볼 수 있다는 장점이 있지만!

보안설정을 잘해주지 않는다면 외부 침입자에게 서비스를 쥐락펴락할 수 있는

 

기회를 주기도 합니다! 이 때문에 관리자 페이지를 사용하시는 것을 완전 비추~~!!!

 

해당 부분은 config 파일을 인클루드 시키는 부분이죠!

 

자그럼 어떻게 실행하는지 한번 볼까요!

 

먼저 저의 테스트 서버에는 nginx와 postgresql 이 깔려있기 때문에

 

이 두 가지를 가지고 monit가 관리할 수 있도록 적용시켜 보겠습니다!

 

자! 적용시키기 전에 리눅스와 유닉스의 상식을 하나 알고 가야 하는데요!

 

이 두 OS는 프로세스가 생성되면 어떻게 프로세스가 생성됐다고 알 수 있을까요!?

 

물론 ps -ef 명령어를 통해서도 알 수 있지만!!

 

/var/run/ 하위에 데몬.pid

 

파일이 생성되는 것으로 프로세스가 돌고 있는 것을 확인할 수 있습니다!

 

예를 들어보겠습니다

자 먼저 nginx 데몬을 stop 한 상태!

ls -l | grep nginx를 확인해도 아무것도 나오지 않는 것을 확인할 수 있는데요!

 

nginx 데몬을 start 해보겠습니다!

/var/run/nginx.pid가 있는 것을 볼 수 있습니다!

 

자 그럼 이것을 통해서 monit가 프로세스를 확인 할 수 있도록 할 건데요!

 

설정하는 방법을 보겠습니다!

/etc/monit/conf.d/ 하위에 관리할 데몬들의 컨피그를 만들 건데요!

nginx 컨피그를 만들어 보겠습니다!

# 데비안 계열 기준

vi /etc/monit/conf.d/nginx

check process nginx with pidfile /var/run/nginx.pid
 start program = "/etc/init.d/nginx start"
 stop program = "/etc/init.d/nginx stop"
 
 ========================================================
 # 레드햇 계열 기준

vi /etc/monit.d/nginx

check process nginx with pidfile /var/run/nginx.pid
 start program = "/usr/bin/systemctl start nginx"
 stop program = "/usr/bin/systemctl stop nginx"

 

 

이렇게 적용을 해준 뒤 monit 데몬 재실행을 해주면 바로 적용이 되는데요!

 

해석하자면 이렇습니다 nginx의 process 확인을 하는데 pidfile로 해라!

 

그리고 monit의 로그를 확인해주면 바로 적용되는 것을 볼 수 있습니다!

tail -f /var/log/monit.log

일부러 monit와 nginx를 끄고 monit를 켜게 되면

 

monit가 nginx의 프로세스를 확인하고 켜주는 것을 볼 수 있습니다!

 

 

마지막으로 postgresql 입니다!

/var/run/postgresql 하위에 9.5-main.pid로 pidfile이 생성되는 것을 볼 수 있는데요!

 

딱 봐도 버전별로 다를 것 같습니다!

 

꼭 확인하시고 해당 부분만 수정해서 넣으시면 될 것 같습니다!!

check process postgresql with pidfile /var/run/postgresql/9.5-main.pid
    group database
    start program = "/etc/init.d/postgresql start"
    stop  program = "/etc/init.d/postgresql stop"
    if failed unixsocket /var/run/postgresql/.s.PGSQL.5432 protocol pgsql then restart
    if failed unixsocket /var/run/postgresql/.s.PGSQL.5432 protocol pgsql then alert
    if failed host localhost port 5432 protocol pgsql then restart
    if failed host localhost port 5432 protocol pgsql then alert
    if 2 restarts within 2 cycles then alert
    if 5 restarts within 5 cycles then timeout

 

 

이상으로 monit 데몬의 순기능과 각종 설정 부분에 대해서 알아보았는데요!

 

조금만 공부하면 아주 쉽고 유익하게 사용할 수 있다는 것을 알 수 있었습니다!

 

다음에는 실제 서비스에 사용되는 데몬들을 소개해보겠습니다!

 

감사합니다

파이썬 비동기 서비스 Celery, rabbitMQ