개요

 

다수의 서버에서 많은 서비스를 운영하다 보니 다음과 같은 필요가 계속 있었습니다.

  1. app에서 남기는 로그를 보려면 직접 서버에 ssh 로 연결하여 tail -f 로 로그를 봐야 하므로 불편하고 원하는 내용을 찾기가 어려움
  2. app를 여러 대의 서버에서 운영할 때 로그가 분산되므로 각 서버에 연결하여 tail 을 사용해야 함
  3. 로그를 롤링하므로 예전 로그 내용을 보기가 힘들고 추세 분석등 다양한 분석을 하기가 어려움
  4. 특정한 조건이 발생할 경우(특정 로그 레벨, 특정 문구등) 다양한 채널로 통보를 받고 싶음

 

로그 취합 및 인덱싱용으로 스플렁크(Splunk)란 제품을 사용하고 있지만 시스템에 별도의 agent를 설치해야 하고 처리할 데이타의 크기에 따라 라이선스가 책정되므로 추가 비용이 발생하는 문제가 있습니다.

별도의 모니터링 솔루션을 사용하고 있고 로그에 특정 패턴이 나타날 경우 통보하는 기능이 있지만 불편하고 기능이 떨어져서 다른 대안을 찾고 있었습니다.

 

이를 위해 다음 원칙을 세우고 여러 솔루션을 찾아 보았습니다.

  • 서비스 서버는 운영 정책상 외부로 연결이 불가하므로 클라우드가 아닌 온 프레미스 방식으로 동작할 것
  • 다양한 언어와 플랫폼을 지원
  • 지금은 예산이 없지만 제품은 당장 필요하므로 커뮤니티와 커머셜 두 가지 라이선스 모델을 제공해야 함. 먼저 커뮤니티 버전을 도입하고 사용하다가 예산 확보후 상용 버전으로 전환 예정
  • 검증되고 레퍼런스가 많을 것

 

이 원칙에 따라 검색한 결과 Sentry 와 Rollbar 라는 두 개의 제품이 최종 후보에 올랐고 Rollbar 는 온프레미스 평가판을 사용해 보려면 절차가 복잡하다는 이유때문에 Sentry 로 선택했습니다.

 

Sentry 는 python 으로 작성된 로그 취합 및 분석 시스템으로 github에 오픈 소스로 공개되어 있으며 동작 방식에 따라 클라우드 버전과 온-프레미스 방식이 있습니다.

 

Sentry is a modern error logging and aggregation platform.

 

클라우드는 상용만 제공되며 온-프레미스 방식은 커뮤니티와 상용 두 가지가 지원되며 잘 정비된 매뉴얼을 제공하고 있습니다.

사전 준비


python

  1. python 2.7 이 필요하며 설치되지 않았다면 RHEL/CentOS 에 python 2.7, 3.* 설치하기 를 참고하세요.
  2. CentOS 6 의 경우 시스템 python 이 아닌 python2.7 이 먼저 실행되도록 현재 세션의 PATH 변수를 조정하고 python2 명령어를 실행해서 버전을 확인합니다.

    export PATH=/usr/local/python2.7/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/python2.7/lib:$LD_LIBRARY_PATH
     
    python2 --version
    CODE
  3. python setuptools 와 pip를 설치합니다.(RHEL/CentOS 에 python 2.7, 3.* 설치하기#setuptools)

  4. Python virtualenv 패키지를 설치합니다.

    pip install virtualenv
    CODE

gcc 와 library

gcc와 개발 라이브러리가 필요합니다.

RHEL/CentOS

yum install gcc libxml2-devel libxslt-devel libffi-devel libtiff-devel libjpeg-devel python-devel openssl-devel
BASH

Amazon Linux

yum install gcc libxml2-devel libxslt-devel libffi-devel libtiff-devel libjpeg-devel python27-devel openssl-devel
CODE

 

 

Ubuntu

apt install gcc libxml2-devel libxslt-devel libffi-devel libtiff-devel libjpeg-devel python-devel
BASH

Redis

  1. Key/Value 저장소인 redis (2.8.19 이상 권장)가 필요하므로 epel 저장소를  설치합니다. (RHEL/CentOS 5,6,7 에 EPEL 과 Remi Repository 설치하기)

    RHEL 7

    sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    BASH

    RHEL 6

    sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    BASH
  2. redis 를 설치합니다.

    sudo yum --enablerepo=epel,remi install redis
    CODE
  3. 부팅시 자동으로 로딩되도록 설정합니다.

    sudo chkconfig redis on
    sudo service redis restart
    CODE

Postgres 설치

  1. postgres 패키지가 필요하므로 먼저 repository 를 등록합니다. (PostgreSQL 설치)

    rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-redhat95-9.5-3.noarch.rpm
    CODE
  2. 패키지를 설치합니다.

    yum install postgresql95-server postgresql95-contrib postgresql95-devel
    CODE
  3. postgres 컴파일 환경을 출력하는 pg_config 유틸이 패스에 걸려있지 않아서 pip 로 sentry 설치시 에러가 발생하니 심볼릭 링크를 생성합니다.

    ln -s /usr/pgsql-9.5/bin/pg_config /usr/bin/pg_config
    CODE
  4. 초기 db 를 생성하며  RHEL 7 과 6 의 방법이 다릅니다.

    RHEL 7

    /usr/pgsql-9.5/bin/postgresql95-setup initdb
    CODE

    RHEL 6

    service  postgresql-9.5 initdb
    CODE
  5. 서비스 구동

    service postgresql-9.5 restart
    CODE
  6. Postgres 가 부팅시 자동 구동되도록 설정합니다.

    chkconfig postgresql-9.5 on
    CODE
  7. sentry 계정을 생성하고 암호를 설정합니다.

    adduser sentry
    CODE
  8. sentry 용 계정과 DB 를 생성하기 위해 pgsql 프롬프트를 구동합니다.

    sudo -u postgres psql postgres
    CODE
  9. 프롬프트에서 사용자와 database 를 생성하고 권한을 부여합니다.

    create user sentry;
    create database sentrydb ENCODING 'UTF-8' ;
    GRANT ALL PRIVILEGES ON DATABASE sentrydb TO sentry;
    CODE
  10. 사용자의 db 암호를 설정합니다.

    \password sentry
    CODE

 

sentry 설치

설치는 일반 사용자 계정(Ex: sentry) 로 진행합니다.

  1. sentry 를 설치할 폴더를 생성합니다.

    $ mkdir /home/sentry/sentry-service
    CODE
  2. virtualenv 로 환경을 구성합니다.

    $ virtualenv sentry-service/
    
    New python executable in /home/sentry/sentry/bin/python2.7
    Also creating executable in /home/sentry/sentry-service/bin/python
    Installing setuptools, pip, wheel...done.
    CODE
  3. 초기화 파일(.bash_profile) 에 sentry 관련 shell 설정을 로딩하는 부분을 추가합니다.

    .bash_profile

    source ~/sentry-service/bin/activate 
    BASH
  4. 1에서 생성한 sentry 설치 폴더로 이동합니다.

    $ cd ~/sentry-service/ 
    CODE
  5. sentry 를 설치합니다.

    $ pip install sentry
    CODE
  6. 정상적으로 설치가 끝났으면 bin 폴더에 sentry 실행 파일이 생성되며 sentry init 명령으로 초기 설정을 생성합니다.

    $ sentry init
    CODE
  7. 설정 파일인 ~/.sentry/sentry.conf.py  을 편집합니다. 

    1. DATABASES 항목은 앞에서 생성한 postgres 계정을 설정해 주고  SENTRY_WEB_PORT  에 사용할 포트를 지정합니다. 기본 값은 9000 인데 php-fpm 포트와 중복될 경우 별도의 포트를 지정합니다.

      DATABASES = {
          'default': {
              'ENGINE': 'sentry.db.postgres',
              'NAME': 'sentry',
              'USER': 'sentry',
              'PASSWORD': 'sentryPwd',
              'HOST': '',
              'PORT': '',
          }
      }
       
      ## 웹 서비스 포트
      SENTRY_WEB_PORT = 9001
      
      ## worker
      SENTRY_WEB_OPTIONS = {
           'workers': 2,  # the number of web workers
      }
      BASH
    2. SELinux 사용시 지정한 포트를 SELinux 에 등록합니다.

      semanage port -m -p tcp -t http_port_t 9001 
      CODE
  8. 초기 스키마를 적용합니다.

    sentry upgrade
    CODE
  9. 다른 계정을 생성하려면 createuser 옵션을 주고 실행합니다.

    sentry createuser
    CODE
  10. sentry 웹 서버를 구동합니다.

    sentry start
    CODE
  11. Queue 기반의 백그라운드 워커인 celery 를 실행합니다.

    sentry run worker
    CODE
  12. cron process 를 실행합니다.

    sentry run cron
    CODE

구동 스크립트

sentry 가 제대로 동작하려면 10 - 12에서 기술한 서버를 모두 띄워야 하며 하나라도 안 뜨면 로그가 쌓이지 않습니다.

관리를 편하게 하려고 구동/관리 스크립트를 만들었으니 github gist 에서 다운 받으면 됩니다.

curl -o sentry-control.sh https://gist.githubusercontent.com/lesstif/96d2694d178e910a53f8d217c82b28e2/raw && chmod +x sentry-control.sh
CODE



구동

./sentry-control.sh start
CODE


상태 확인

$ ./sentry-control.sh status
 
Sentry master 8212 is running
celery worker (8214) and Beat (8216) is running...
CODE

 

 중지

./sentry-control.sh stop
CODE

apache httpd 연동

<VirtualHost *:443>
    ServerName sentry.example.com
	
	ErrorLog logs/sentry-ssl_error_log
    TransferLog logs/sentry-ssl_access_log
 
	## sentry 연동
	ProxyPass / http://localhost:9001/
	ProxyPassReverse / http://localhost:9001/
	ProxyPreserveHost On
	RequestHeader set X-Forwarded-Proto "https" env=HTTPS
CODE

 

nginx 연동

아래의 설정을 가상 호스트에 추가합니다.

server {
    listen 80;
#    listen 443 ssl;
    server_name sentry.example.com;
    location / {
      proxy_pass         http://localhost:9001;
      proxy_redirect     off;
      proxy_set_header   Host              $host;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
    }
}
                                                                                                                                       
CODE

 

참고