Scaling Logstash

http://devquixote.com/devops/2014/10/20/scaling-logstash/

 

로그 축소 비율 조정
나는 최근에 운송 집계 (shippingEasy) 에서 개발 집 (dev ops) 모자를 써야만 로그 집계와 운영 분석을 제공하는 ELK 스택을 설치해야했습니다. 즉 Elasticsearch , Logstash &키바 . 우리는 인프라 스트럭처에 상당히 의존하게되었습니다. 이는 에스컬레이션 지원을 통해 개발자가 참여하도록 지시 할 때 상황이 어떻게 진행되고 있는지 파악하고 프로덕션 문제를 파악할 수 있기 때문입니다. 다음은 평균 응답 시간, 유니콘 작업자 및 대기열 크기와 같은 측정 항목을 보여주는 제작 웹 대시 보드의보기입니다.

이것이 원래 설정되었을 때 각 어플리케이션 서버의 Logstash-Forwarder 로 로그 이벤트를 전달한 Logstash로 전달하여 Elasticsearch로 색인을 생성했습니다. 그런 다음 Kibana를 사용하여 로그 이벤트를 시각화 할 수 있습니다. 이것은 다음과 같은 전형적인 (아마도 순진) 설정입니다 :

logstash-forwarder
\
logstash-forwarder > logstash > elasticsearch < kibana
/
logstash-forwarder
Rails 스택에 대한 뷰를 얻으려면 Elasticsearch에서 사용자 정의 패턴이있는 다중 행 및 grok 필터를 사용하여 로그 파일을 구문 분석했습니다. 우리는 각각의 유니콘 프로세스가 자신의 번호가 매겨진 로그 파일에 기록되도록함으로써 서로 인터리브하는 로그 이벤트를 얻었습니다. 잠시 동안은 잘 돌아 갔지만 트래픽이 휴가를 사기 시작하면서 문제가 발생하기 시작했습니다. 잠시 동안 일할 것이지만 사건의 틈새가 키바 나에 나타나기 시작할 것이고, 물방울이 늦어지고 결국 멈출 것입니다.

고맙게도, 우리의 응용 프로그램이 죽어 가고있는 것은 아닙니다. Logstash가있었습니다.우리는 두 가지 문제로 악화되고 서로를 가려 냈습니다.

Logstash는 우리가 전송 한 모든 로그 이벤트를 처리해야한다는 요구를 따라갈 수 없었습니다.
Logstash 1.4.1-2에는 TCP 입력에 버그 가있어 연결하는 클라이언트가 이전 문제로 인해 시간 초과되기 시작하면 연결 누출이 발생합니다.
Logstash의 버전을 연결 블룸 문제를 수정하는 최신 코드로 패치하여 2 번째 문제를 수정했습니다. 이를 정리하면 Logstash 내의 병목 현상을 확인할 수 있습니다.

Logstash는 jRuby로 작성되었으며 내부는 파이프 라인 으로 설명됩니다 . 매개 변수는 구성의 입력 / 필터 / 출력 스탠자에 설정된 작업을 수행하는 입력, 필터 (작업자) 및 출력 스레드에 의해 처리됩니다. 각 영역에는 20 개의 요소를 저장할 수있는 대기열이 있습니다. 스레드는 대기열에서 당겨서 작업을하고 다음 대기열로 보내거나 반복합니다.Logstash는 각 입력에 하나의 스레드를 할당하고, 단일 작업자 스레드와 각 출력에 대해 하나의 스레드를 할당합니다. 이것은 다음과 같이 보입니다.

input source –> input thread filter thread output thread –> output destination
\ / \ /
queue queue
/ \ / \
input source –> input thread filter thread output thread –> output destination
Logstash의 이러한 영역 중 하나가 채워진 것보다 빠르게 대기열에서 가져올 수없는 경우 문제가 발생합니다. Logstash는 시스템이 백업 할 때 입력 내용에 따라 다양한 효과를 제공합니다. 우리의 경우 Logstash-Forwarder 연결 시간 초과 및 후속 연결 재 연결 시도가 누출되었습니다. Logstash가 redis 목록에서 대기열로 당겨지면 대기열이 팽창합니다.

상단 및 java 스레드 덤프 조합을 사용하여 병목 현상이 필터 작업자 스레드에 있음을 알 수있었습니다. 입력 스레드와 출력 스레드는 CPU 사용량이 거의 없었으며 빈 대기열에서 항상 차단되는 것으로 보입니다. 그러나 필터 작업자 스레드는 CPU 코어를 페깅하고있었습니다. Logstash 배포에서 작업자 스레드의 수를 늘릴 수 있습니다.

잘못된. 이전에 언급 한 여러 줄 바꿈 필터링을 기억하십니까? Logstash의 다중 라인 필터는 쓰레드에 안전하지 않으며 사용시에는 오직 하나의 작업자 쓰레드로만 제한됩니다.이제 다중 라인 코덱을 사용하여 다중 라인 이벤트 콜렉션을 Logstash의 입력 영역으로 이동하기 만하면됩니다. 아니, 그 중 하나를 작동하지 않습니다. 다중 선 필터를 사용하면 파일 이름별로 이벤트를 구분하는 데 사용할 수있는 stream_identity 속성을 지정할 수 있습니다. 다중 라인 입력 코덱은 그런 것을 제공하지 않습니다. 이는 레일을 서로 분리 된 여러 줄의 로그 메시지를 유지하는 모든 노력이 창 밖으로 나올 수 있음을 의미합니다.

이제 우리는 뒤로 물러나서 인프라를 재평가해야했습니다. 궁극적으로 다음을 수행하기로 결정했습니다.

다중 회선 이벤트가 응용 프로그램 서버 측에서 롤업됩니까? 이것은 로그를 꼬리로 묶어서 Logstash로 보내야하는 책임입니다. 그런 다음 Logstash에서 다중 라인 필터를 척킹하고 단일 Logstash 프로세스 내에서 필터 작업자를 확장 할 수 있습니다.
테일링 데몬 app-server 측과 Logstash 사이의 중개인으로 재발행 목록을 사용하면 몇 가지 이벤트 내구성을 가질 수 있고 로그 데이터를 통해 여러 대의 시스템에서 여러 개의 Logstash 프로세스로 확장 할 수 있습니다.
Logstash 전달자는 다중 회선 이벤트 롤업이나 redis와의 통신을 지원하지 않으므로 다른 꼬리표 디먼을 찾아야하거나 Logstash 자체를 각 응용 프로그램 서버에 배포해야했습니다. 우리는 자바 의존성을 도입하고 완료해야 할 일에 매우 무거워 보였으므로 후자를하고 싶지 않았습니다.

위의 요구 사항을 모두 지원하는 파이썬으로 작성된 로그 테일링 데몬 인 Beaver를 입력하십시오 . 우리는 그것이 작동하는지 확인하기 위한 간단한 개념 증명을 수행하여 하나의 웹 서버에 배포하여 24 시간 동안 수행 한 방법을 확인한 다음 모든 서버에 적용했습니다.서비스 중단없이 며칠 동안 제대로 작동합니다. 이제 우리의 인프라는 다음과 같습니다.

beaver
\
beaver > redis < logstash > elasticsearch < kibana
/
beaver
Logstash에서 여러 스레드 / 코어를 사용하여 필터 처리를 수행 할 수있는 응용 프로그램 서버에서 Beaver에 대한 다중 라인 롤업 작업을 수행 한 후에도 Logstash 인스턴스 하나만 있으면 충분합니다. 그러나 로그 트래픽 / 크기를 다시 늘려 Logstash를 압도하기 시작하면 우리는 여러 인스턴스로 확장하여 데이터가 다시 시작되도록하는 것이 좋습니다.

beaver logstash
\ / \
beaver > redis < > elasticsearch < kibana
/ \ /
beaver logstash
그것은 Logstash-scale 땅에서 3 – 4 일을 보내었다. 그것은 우리의 응용 프로그램 사용자에게 양질의 경험을 제공하는 데 정말로 도움이되는 놀라운 도구입니다. ELK 스택의 일부로 Splunk 의 80 %가 실제로 무료입니다. 그러나 유료 라이센스가 없으면 소매를 감아 서 이와 같은 경우에 일해야합니다. 다행히도 그 뒤에 큰 커뮤니티가 있으며 웹과 #logstash의 freenode에서 많은 도움을 얻을 수 있습니다.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.