웹사이트 검색

Graphite, StatsD 및 CollectD를 사용한 통계 추적 소개


소개

서버, 애플리케이션 및 트래픽에 대한 통계를 수집하는 것이 좋은 생각인 이유는 많습니다. 데이터를 수집하고 구성하면 확장, 문제 해결 및 구성의 문제점 추적에 대한 결정에 확신을 가질 수 있습니다.

기계에서 지표를 추적하는 데 사용할 수 있는 다양한 도구가 있으며 종종 프로세스의 특정 작은 부분에 위임됩니다. 이러한 도구를 함께 연결하여 결과를 수집, 기록 및 표시하는 시스템을 만들 수 있습니다.

이 가이드에서는 서버 및 애플리케이션에서 생성된 데이터를 수집, 저장 및 시각화할 수 있는 몇 가지 기술에 대해 설명합니다.

시간이 지남에 따라 데이터의 시각적 표현을 렌더링하는 데 사용할 수 있는 여러 구성 요소로 구성된 그래프 라이브러리인 Graphite에 대해 설명합니다. 또한 실행 중인 서버에 대한 거의 실시간 정보를 수집할 수 있는 시스템 통계 데몬인 collectd에 대해서도 살펴보겠습니다. 목록의 마지막은 임의의 데이터를 수집하고 구성하는 데 사용할 수 있는 유연한 통계 집계기인 StatsD입니다.

이후 가이드에서는 Ubuntu 14.04 서버에서 이러한 구성 요소를 설치 및 구성하여 시작하고 실행하는 방법을 살펴보겠습니다.

데이터를 추적하는 이유는 무엇입니까?

가장 먼저 설정해야 하는 것은 서버 또는 애플리케이션 환경에서 데이터를 추적하는 이유입니다.

가장 중요한 이유는 실제로 매우 간단합니다. 데이터가 많을수록 주어진 순간에 무슨 일이 일어나고 있는지 더 잘 이해할 수 있습니다. 이를 통해 하드 데이터로 의사 결정을 뒷받침하고 변경 사항이 올바른 구성 요소를 대상으로 하는지 미리 확인할 수 있는 놀라운 기능을 제공합니다. 추적 통계는 애플리케이션 로그에 없을 수 있는 추가 정보 소스를 제공합니다.

대부분의(전부는 아님) 로깅 시스템은 기본적으로 자체 포함된 애플리케이션 출력을 나타내기 때문에 다양한 애플리케이션의 데이터를 연관시키거나 이벤트를 특정 시스템 상태에 연결할 수 없습니다. 이로 인해 이벤트를 둘러싼 상황에 대한 전체적인 관점을 구축하기가 까다로울 수 있습니다.

데이터베이스 서버가 다운되는 사건이 있다고 잠시 상상할 수 있습니다. 로그를 읽는 동안 15:35:28 UTC에 MySQL 서비스가 OOM(메모리 부족) 오류로 종료되었음을 알 수 있습니다. 이제 우리는 메모리 사용량이 문제라는 것을 알고 있지만 이전에 안정적이었던 서버에서 메모리 사용량 급증의 원인이 무엇인지 전혀 알지 못할 수 있습니다.

서버와 응용 프로그램에 대한 데이터를 추적하는 경우 분명히 이질적인 시스템 데이터 조각을 모아서 문제가 발생한 시점의 환경이 정확히 어떤 모습이었는지 이해하는 데 도움을 줄 수 있습니다. 메모리 누수로 인해 메모리 사용량이 꾸준히 증가했음을 알 수 있습니다. 응용 프로그램 수준 메모리 사용에 대한 정보가 있으면 정확히 어떤 프로그램이 원인인지 알 수 있습니다. 우리는 또한 완전히 다른 것을 의미할 수 있는 비정상적인 스파이크가 있음을 볼 수 있습니다.

다른 시나리오에서는 배포 전후의 시스템 모습을 볼 수 있습니다. 새 코드가 이상한 조건을 생성하면 다른 구성 요소에 미치는 영향을 확인하고 성능을 이전 코드와 비교할 수 있습니다. 새 코드가 개선되는 지점과 실수를 저질렀을 수 있는 지점을 식별할 수 있습니다.

스마트 데이터 수집을 통해 시스템을 관련 없는 구성 요소의 느슨한 세트가 아닌 하나의 시스템으로 볼 수 있습니다.

흑연 구성 요소

우리는 여기에서 조금 거꾸로 시작하여 그래프 라이브러리인 Graphite에 대해 먼저 이야기할 것입니다. 그런 다음 돌아가서 Graphite가 데이터를 가져오는 데 사용할 수 있는 일부 소프트웨어를 다룰 것입니다.

Graphite는 데이터의 시각적 표현을 저장하고 렌더링하는 그래프 라이브러리입니다. 즉, Graphite는 데이터 포인트를 수집하고 전송하기 위해 다른 애플리케이션이 필요합니다.

Graphite 프로젝트 자체는 몇 가지 다른 구성 요소로 구성되어 있으며 각 구성 요소는 특정하고 집중된 목적을 가지고 있습니다.

Graphite 웹 앱

Graphite 설치에서 가장 눈에 잘 띄고 동적인 구성 요소는 Graphite 웹 애플리케이션입니다.

여기에서 데이터를 구성하는 그래프를 디자인할 수 있습니다.

Graphite는 그래프를 디자인할 수 있는 매우 유연한 인터페이스를 제공합니다. 다양한 유형의 메트릭을 결합하고, 레이블 지정, 글꼴, 색상 및 선 속성을 제어하고, 마음대로 데이터 크기를 조정하고 조작할 수 있습니다.

여기에서 요약해야 할 핵심 아이디어는 Graphite가 수신한 데이터 포인트와 사용자가 제공한 방향을 기반으로 그래프를 렌더링한다는 것입니다. 단순히 그래프를 출력한 다음 데이터를 버리는 것이 아닙니다. 원하는 데이터로 즉시 데이터를 렌더링할 수 있습니다.

또한 웹 애플리케이션을 사용하면 그래프 속성과 레이아웃을 저장할 수 있으므로 원하는 모든 설정으로 모니터링 인터페이스를 가져올 수 있습니다. 원하는 만큼 대시보드 보기를 가질 수 있습니다. 즉, 각 시스템 또는 애플리케이션에 대해 별도의 대시보드를 가질 수 있습니다. 이들 사이에서 데이터를 연관시켜야 하는 경우 그래프를 끌어서 놓기만 하면 디스플레이가 결합됩니다.

유연성은 여기서 끝나지 않습니다. Graphite를 사용하면 다른 인터페이스에 삽입하기 위해 기본 URL에서 그래프를 렌더링할 수 있습니다. JSON 또는 CSV와 같은 비그래픽 표현으로 데이터를 내보내거나 데이터 정보가 포함된 SVG를 출력할 수도 있습니다.

이제 데이터를 얻을 때 데이터로 무엇을 할 수 있는지 알았으니 다른 Graphite 구성 요소에 대해 이야기하여 이를 가능하게 하는 프로세스를 살펴보겠습니다.

탄소

Carbon은 Graphite 구성의 스토리지 백엔드입니다. 단일 Graphite 구성에는 통계를 수집하고 전송하는 다른 프로세스에서 전송되는 데이터 처리를 담당하는 하나 이상의 Carbon 데몬이 있습니다(수집기는 Graphite의 일부가 아님).

각기 다른 방식으로 데이터를 처리하는 다양한 Carbon 데몬이 있습니다. 이들 중 가장 기본적인 것은 carbon-cache.py입니다. 이 데몬은 간단합니다. 포트에서 데이터를 수신하고 데이터가 도착하면 효율적인 방식으로 해당 데이터를 디스크에 기록합니다.

데이터가 들어오는 대로 저장하고 미리 결정된 시간이 지나면 디스크에 플러시합니다. Carbon 구성 요소가 데이터 수신 및 세척 절차를 처리한다는 것을 인식하는 것이 중요합니다. 실제 스토리지 메커니즘을 처리하지 않습니다. 그것은 우리가 잠시 이야기할 whisper 구성 요소에 남아 있습니다.

carbon-cache.py 데몬은 작업할 형식, 프로토콜 및 포트를 알립니다. 또한 데이터 저장에 사용할 데이터 보존 정책도 알려줍니다. 속삭이는 것입니다. 대부분의 기본 구성에서 단일 carbon-cache.py 인스턴스는 데이터 수신을 처리하기에 충분합니다.

설정이 커짐에 따라 여러 인스턴스를 한 번에 실행할 수 있습니다. 앞의 carbon-relay.py 또는 carbon-aggregator.py 데몬으로 균형을 맞출 수 있습니다.

carbon-relay.py 데몬을 사용하여 일부 중복성을 위해 모든 백엔드 데몬에 요청을 보낼 수 있습니다. 또한 다양한 carbon-cache.py 인스턴스 간에 데이터를 샤딩하여 여러 스토리지 위치에 읽기 로드를 분산시키는 데 사용할 수 있습니다.

carbon-aggregator.py 데몬은 데이터를 버퍼링한 다음 일정 시간 후에 carbon-cache.py에 덤프할 수 있습니다. 이렇게 하면 세부 정보를 희생하여 통계 처리가 시스템에 미치는 영향을 줄이는 데 도움이 될 수 있습니다.

속삭임

Whisper는 Graphite가 보낸 정보를 저장하는 데 사용하는 데이터베이스 라이브러리입니다.

매우 유연하며 시계열 데이터를 매우 자세하게 저장할 수 있습니다. 서로 다른 세부 수준에서 서로 다른 아카이브를 생성하므로 실제 사용 시 정보가 구성된 특정 에이징 임계값을 통과하면 정보가 낮은 해상도로 저하됩니다.

예를 들어 특정 메트릭에 대해 초당 하나의 데이터 포인트를 저장할 수 있습니다. 이 세부 데이터는 5시간 동안 유지되어야 한다고 속삭이는 것을 알 수 있습니다. 저해상도 데이터를 저장하는 아카이브가 있을 수도 있습니다. 분당 1포인트만 저장하고 6개월 동안 유지할 수 있습니다.

저해상도 아카이브의 각 포인트는 고해상도 아카이브에 기록된 동일한 데이터에서 계산됩니다. 해상도와 보존율이 다른 아카이브를 원하는 만큼 많이 보유할 수 있습니다. 추적 중인 지표 유형에 따라 저해상도 아카이브의 데이터를 귓속말이 계산하는 방법을 구성할 수 있습니다.

예를 들어 메트릭은 짧은 시간 동안 일부 이벤트가 발생한 횟수를 집계한 것일 수 있습니다. 더 낮은 해상도에서 더 큰 시간 프레임에 대한 지점을 만들려면 더 높은 해상도 아카이브의 데이터 지점을 합산하여 더 큰 시간 범위에 대한 데이터 값을 요약합니다.

Whisper는 메트릭의 특성에 따라 다른 방식으로 저해상도 데이터를 계산할 수 있습니다. 예를 들어 일부 데이터는 평균화를 통해 일반화되고 다른 데이터는 최대값을 추적할 수 있습니다. 평균의 경우 고해상도 포인트에서 실제 평균값을 계산하여 저해상도 포인트를 만듭니다. 최대값의 경우 가장 높은 값을 유지하고 나머지는 버려야 숫자의 의미를 유지할 수 있습니다.

Whisper는 데이터를 수신할 때(필요한 값을 수집하는 데 필요한 시간 이후) 저해상도 데이터를 계산하고 기록합니다. 데이터 집계 기술(평균, 최대 등)을 수행하는 데 필요한 데이터 포인트를 수집한 다음 작성합니다.

Graphite는 그래프를 렌더링하기 위해 데이터를 쿼리할 때 요청된 시간 프레임을 포함하는 최고 해상도 아카이브를 사용합니다.

통계 수집 및 전달

위에서 언급했듯이 Graphite 자체는 데이터 수집과 관련이 없습니다. 대신 다른 서비스로부터 정보를 받는 것에 의존합니다. 이를 통해 프로젝트는 좁은 초점을 유지하고 다양한 입력 서비스와 모듈식으로 상호 작용할 수 있습니다.

아래에서는 Graphite가 이해하는 프로토콜에 대해 논의한 다음 처리를 위해 Carbon에 데이터를 전달하는 데 사용할 수 있는 두 가지 인기 있는 수집 프로그램인 collectd 및 StatsD에 대해 논의할 것입니다.

프로토콜

Graphite에 데이터를 보내는 데 사용할 수 있는 세 가지 프로토콜이 있습니다.

첫째, Graphite는 일반 텍스트를 받아들이고 이해할 수 있습니다. 이것은 거의 모든 응용 프로그램이나 서비스가 텍스트 출력을 생성할 수 있고 Graphite 또는 중간 도구를 제공하는 데 사용할 수 있기 때문에 가장 유연한 형식입니다.

일반 텍스트 메시지에는 메트릭 이름, 지정된 값 및 해당 값의 타임스탬프에 대한 정보가 포함됩니다. 이러한 메시지는 추가 형식 지정 없이 일반 텍스트용으로 지정된 포트에서 Carbon으로 바로 보낼 수 있습니다.

Graphite는 Python에서 생성되기 때문에 Graphite는 "pickle\ 데이터 직렬화 형식도 허용합니다. 이 Python 표준을 사용하면 단일 트랜잭션에서 여러 시간 값을 버퍼링하고 보낼 수 있습니다.

Graphite는 AMQP 메시지를 사용하여 데이터를 수락할 수도 있습니다. 이를 통해 대량의 데이터를 보다 원활하게 처리할 수 있습니다. 이 구성으로 데이터 손실 없이 많은 통계를 입력하고 원격 호스트 간의 네트워크 연결 중단을 처리할 수 있습니다.

수집

서버에 대한 자세한 정보를 수집하는 가장 쉬운 방법 중 하나는 collectd라는 데몬을 사용하는 것입니다.

Collectd는 서버 환경의 다양한 구성 요소에 대한 통계를 수집할 수 있습니다. 이를 통해 메모리 사용량, CPU 로드, 네트워크 트래픽 등과 같은 일반적인 메트릭을 쉽게 추적할 수 있습니다. 이를 통해 이벤트를 시스템 상태와 쉽게 연관시킬 수 있습니다.

표준 시스템 정보를 수집하는 것 외에도 collectd에는 기능을 확장하는 플러그인 시스템도 있습니다. 즉, Apache, Nginx, iptables, memcache, MySQL, PostgreSQL, OpenVPN 등과 같은 일반 소프트웨어를 쉽게 추적할 수 있습니다.

Collectd는 사전 빌드된 애플리케이션과 서버의 공통 서비스에서 데이터를 가져올 수 있는 간단한 방법을 제공합니다. 이것은 인프라의 동작과 의존하는 서비스를 추적하는 데 사용해야 합니다.

통계D

StatsD는 Graphite에 다른 데이터를 보내는 데 사용할 수 있는 매우 간단한 데몬입니다. 이 접근 방식의 이점은 생성 중인 응용 프로그램 및 시스템에 대한 통계 추적 기능을 구축하는 것이 쉬워진다는 것입니다.

StatsD는 단일 데이터 포인트를 나타내는 간단한 UDP 패킷에 대한 인터페이스에서 수신 대기하여 작동합니다. 이는 비연결 방식으로 방대한 양의 정보를 수용할 수 있음을 의미합니다. 그런 다음 수신한 값을 집계하여 Graphite에 전달할 수 있습니다.

이 시스템을 사용하면 응용 프로그램 대기 시간 증가에 대한 걱정 없이 통계를 대량으로 보낼 수 있습니다. StatsD 서비스는 들어오는 모든 데이터를 수집하고 집계한 다음 예상되는 시간 프레임에 적절하고 요약된 데이터 포인트를 Graphite로 보냅니다.

이러한 장점 때문에 실제로 Graphite로 전송되는 모든 종류의 데이터에 대한 좋은 중개자입니다. 그러나 이를 활용할 수 있는 주요 방법은 우리가 만든 자체 애플리케이션과 도구를 모니터링하는 것입니다.

StatsD는 UDP 트래픽을 허용하는 범용 데몬이기 때문에 이에 적합합니다. StatsD 인스턴스에 직접 데이터를 보낼 수 있는 다양한 프로그래밍 언어의 다양한 클라이언트 측 라이브러리가 있습니다. 이는 구축 중인 애플리케이션이 추적할 데이터를 쉽게 보낼 수 있음을 의미합니다.

결론

지금쯤이면 다양한 통계 및 그래프 유틸리티 모음이 함께 작동하여 환경에 대한 완전한 그림을 제공하는 방법에 대해 상당히 잘 이해하셨을 것입니다.

다음 가이드에서는 모니터링할 통계를 제공하는 StatsD to Graphite에 대해 설명합니다.

저스틴 엘링우드