Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

AWS 모니터링

AWS에 있는 시스템과 서비스 모니터링에 zabbix를 사용하기로 했다. 뭐 zabbix agent 설치한 다음에, 모니터링 데이터 수집하고 분석해서 모니터링 정책을 세우고 문제를 해결해 나가는 전형적인 과정이겠으나 이번 시스템은 좀 복잡하다.

글로벌 서비스이다 보니 여러 지역에 AWS 자원이 분산돼 있다. 게다가 VPC 영역과 일반 EC2 영역에 있는 자원들이 있다. VPC의 경우 보안성과 관리성, 가용성을 고려해야 했기 때문에 복잡한 구성을 가지게 됐다. 대략 아래그림과 같다.

자세한 내용은 AWS VPC 구성을 참고한다.

VPC 자원 모니터링

VPC 자원은 기본적으로 인터넷으로 부터 격리됨을 목적으로 한다. 하지만 인터넷(퍼블릭 네트워크)와 격리됨과 동시에 프라이빗 네트워크와는 통합이 되어야 한다. 레거시 자원과의 통합은 VPN을 이용한다.

모델 1 - 중앙 집중형 모니터링

모니터링 시스템은 레거시 영역에 둔다. 레거시 시스템은 VPC와 VPN으로 연결돼 있기 때문에, 자유롭게(그리고 안전하게) 자원에 접근할 수 있다.

가장 단순한 모델은 레거시 영역에 하나의 zabbix-server를 두고 모든 데이터를 수집하는 방식이다.

그냥 인스턴스에 zabbix agent를 설치하고 zabbix server에서 데이터를 긁어오는 일반적인 방식이기 때문에, 모니터링 환경을 구축하는 데에는 큰 어려움이 없다. 이 경우 작업의 90%는 VPC + VPN 환경 구축에 달려있다고 봐야 한다.

간단한 방식이긴 하지만 다음과 같은 문제를 고려해야 한다.
  • 관리해야 하는 자원이 지역별로 떨어져 있다. 레이턴시에 문제가 있을 수 있다.
  • 관리해야 하는 자원이 늘어날 경우, 중앙 집중형의 방식자체가 부담이 될 수 있다.
자원이 분산돼 있는 만큼, 모니터링도 분산해야 하는 것도 고려해야 한다.

모델 2 - 분산 모니터링

분산 모니터링 환경을 구축한다. Zabbix는 proxynode 두 가지 타입의 분산 모니터링 방식을 지원한다.

Proxy 방식은 말 그대로 데이터수집을 중계하는 역할만 한다. Proxy server는 Zabbix server로 부터 모니터링 해야할 호스트 정보와 모니터링 아이템에 대한 설정 정보를 받은 다음, zabbix server 대신 모니터링 정보를 수집한다. 하지만 수집한 정보를 저장하고 처리하지 않고 그대로 zabbix server로 보낸다.

이 방식으로 얻을 수 있는 이점은 다음과 같다.
  • NATVPN등으로 네트워크가 구성될 경우 원격으로 데이터를 가져오기가 힘들 수 있다. 데이터를 수집할 네트워크에 proxy server를 설치하면 네트워크 구성과 상관없이 데이터 수집이 가능하다.
  • Proxy server가 버퍼의 역할을 한다. 원격으로 멀리 떨어져 있을 경우 네트워크 환경이 불안정할 수 있다. Proxy server가 버퍼 역할을 함으로써, 안정적으로 모니터링 정보를 수집할 수 있다.
  • Proxy server는 데이터를 중계하는 역할만 하기 대문에, (뒤에 설명할 node 방식에 비해서) 유지보수가 쉽다.
  • Zabbix server만으로 구성될 경우, server의 poller 가 모든 호스트에 연결해서 데이터를 가져와야해야 한다. Poller는 zabbix server에서 가장 많은 자원을 소모하는 놈이다. 이 역할을 proxy server에 맡김으로서 zabbix server의 부담을 크게 덜 수 있다.
Node 방식은 각 로컬에 proxy가 아닌 완전한 zabbix server를 설치하는 방식이다. 완전히 독립되긴 하지만 각 node에 설치되는 zabbix server의 설정이 필요하다. 이들 각각을 관리하는 것도 피곤하지만 이들의 설정을 다시 통합하는 것도 여간 피곤한 일이 아니다.

그냥 proxy방식으로 운영하자.

일반 EC2 인스턴스 모니터링

내부 서비스를 위한 EC2 인스턴스인 경우 EIP를 가지지 않을 수 있다. 이 경우 인스턴스 모니터링에 애로사항이 꽃피게 된다. EIP가 없을 경우 EC2 인스턴스가 재기동할 때 public ip와 private ip 모두 변해버리기 때문이다.

Instance ID를 키로 인스턴스의 public ip 혹은 private ip를 가져오는 방법을 사용해야겠다. 이 방법을 사용하려면, AWS API를 이용하는 zabbix agent를 하나하나 만들어야 한다. python boto library 혹은 ruby right aws library를 이용하면 쉽게 개발할 수 있긴 하겠다. 하지만 이런 간단한 애플리케이션의 개발에는 AWS API를 이용해서 개발하는 것도 괜찮지 싶다.

Proxy 설정

환경

그럼 proxy 모드로 설정을 해보려 한다. 설정 환경은 다음과 같다.

모델 - 2로 구성을 하기로 했다. 특이한 점은 VPC가 아닌 일반 EC2 인스턴스에 대한 모니터링도 필요하다는 점이다. EC2 영역에 Zabbix proxy를 두면 되니, VPC로만 구성되는 것과 차이가 없다고 볼 수 있지만 해결해야 할 문제가 있다.
  • VPN으로 연결돼 있는 VPC와 달리 EC2 인스턴스들은 VPN으로 연결할 수 없다.
  • 따라서 (EC2 영역)의 zabbix proxy와 연결하기 위한 조치가 필요하다.
VPC와 VPN으로만 구성할 경우 zabbix server는 private network에 두는 것으로 public network와 분리가 가능하다. 하지만 EC2 영역의 zabbix proxy와 연결하기 위해서는 또 다른 장치를 만들어야 한다. 가장 간단한 방법은 zabbix proxy에 EIP를 주는 거다. 간단하긴 하지만 EIP를 가지는 순간 인터넷에 공개된다는 문제가 있다. VPC로 서비스를 구성한 이유 중 하나는 보안의 강화로 모든 자원을 인터넷으로 부터 격리하는 것인데, 이 장점이 사라진다.

이 문제는 NAT 인스턴스를 구성하는 걸로 해결했다. zabbix server의 위치는 변하지 않는다. 즉 여전히 private subnet에 위치한다. 대신 EC2 zabbix-proxy와의 패킷은 NAT 인스턴스를 거쳐서 흐르도록 한다. Zabbix proxy는 zabbix server로 패킷을 보낼 수 있어야 하는데, port forwarding(DNAT)으로 해결한다.

Zabbix proxy를 위한 Zabbix server 측 설정

Zabbix server의 Administration > DM 옵션에서 proxy server를 지정할 수 있다.

https://lh3.googleusercontent.com/-wT41LlDNL98/UaIeR1-t-RI/AAAAAAAADFI/WoBasqx1d_U/s640/zabbix_dm01.png

Create proxy를 클릭하면, 아래와 같은 proxy 설정 창이 뜬다.

https://lh6.googleusercontent.com/-ReXYW8iNvXc/UaIe7flqRZI/AAAAAAAADFQ/XXU9sJAy68A/s640/zabbix_dm02.png

  • Proxy name : Zabbix proxy의 이름이다. 이 이름은 zabbix proxy의 설정파일의 host name과 반드시 같아야 한다.
  • Proxy mode : Active와 passive 두가지 모드가 있다.
    • Active : Proxy 서버가 zabbix server에 접근한다. Zabbix server는 proxy 서버에게 모니터링 정보를 전송한다. 이후 proxy server가 모니터링 정보를 수집하고, 수집 정보를 zabbix server로 전송한다.
    • Passive : Zabbix 서버가 proxy로 접근한다.
Active와 passive 중 어떤 방식을 선택할 지는 네트워크 형상에 따라 선택할 수 있다. 지금처럼 zabbix server가 VPC 안에 있다면 Passive 방식을 사용하는게 더 적절할 것이다. Active 방식을 사용해도 무방하지만 이 경우 DNAT 설정을 해줘야 하기 때문에 설정이 약간 번거로워지는 단점이 있다.

만약 zabbix proxy가 방화벽 뒤에 있거나 VPC 안에 있다면 Active 방식을 사용하는게 구성이 더 용이하다.

Zabbix proxy 설치

Ubuntu 리눅스 12.10을 기준으로 한다.

Zabbix-proxy는 Sqlite3, mysql, postgresql 등의 데이터베이스를 지원한다. 나는 sqlite3 버전을 설치했다.
# apt-get install zabbix-proxy-sqlite3

Sqlite3와 zabbix-proxy를 위한 데이터베이스 스키마는 직접 설치해야 한다.
# sqlite3 zabbix.db < /usr/share/zabbix-proxy-sqlite3/schema.sql

zabbix-proxy는 zabbix 계정으로 실행된다. 따라서 zabbix 계정에 대해서 읽기/쓰기 권한을 줘야 한다.
# chown zabbix.zabbix zabbix.db

설정을 변경하자.
# cat /etc/zabbix/zabbix_proxy.conf
......
......

# Zabbix server의 주소
Server=111.111.111.111

......
......
# 호스트 이름
# zabbix의 DM 설정의 이름과 반드시 일치해야만 한다.
Hostname=Zabbix proxy server

# 데이터 베이스 이름
DBNAME=/var/lib/sqlite3/zabbix.db

마지막으로 zabbix-server를 올리고 나면, zabbix-server와 제대로 통신을 하는지와 zabbix-agent로 부터 모니터링 정보를 잘 수집하는지를 확인하면 된다.