2014-12-10 2 views
3

표준 ELK 설정에서 ElasticSearch 클러스터에 기록되는 로그 메시지의 급증을 처리하는 가장 좋은 방법은 무엇입니까?ElasticSearch/Logstash/Kibana 로그 트래픽의 스파이크를 처리하는 방법

Google은 웹 사이트 로깅 요구 사항에 대해 AWS에서 표준 ELK (ElasticSearch/Logstash/Kibana) 설정을 사용합니다.

다른로드 밸런서 뒤에있는 자동 확장 그룹의 자동 확장 그룹에 로그하는 Logstash 인스턴스의 자동 확장 그룹이로드 밸런서 뒤에 있습니다. 그런 다음 Kibana를 제공하는 단일 인스턴스가 있습니다.

우리는 매일 2 개의 Logstash 인스턴스와 2 개의 ElasticSearch 인스턴스를 실행합니다.

당사 웹 사이트는 이벤트 중 단기간에 높은 수준의 트래픽을 경험합니다. 이러한 이벤트 중에 트래픽은 약 2000 % 증가합니다. 우리는 이러한 사건이 발생했을 때 사전에 잘 알고 있습니다.

현재 우리는 이벤트 중에 일시적으로 ElasticSearch 인스턴스의 수를 늘립니다. 그러나 우리는 우리가 너무 빨리 축소되어서 우리가 파편을 잃었고 우리의 색인을 손상 시켰음을 의미하는 문제를 가지고 있습니다.

auto_expand_replicas 설정을 "1-all"으로 설정하여 각 노드에 모든 데이터의 복사본이 있는지 확인하려고 했으므로 크기를 얼마나 빠르게 확대 또는 축소 할 것인지 걱정할 필요가 없습니다. 모든 데이터를 새 노드로 전송하는 데 얼마나 많은 오버 헤드가 발생합니까? 우리는 현재 약 2 주간의 로그 데이터 만 보관합니다. 이는 약 50GB의 데이터를 처리합니다.

나는 데이터 노드의 수를 동일하게 유지하면서 검색 트래픽의 증가를 처리하기 위해 데이터 노드가 아닌 별도의 자동 크기 조정 그룹을 사용한다고 언급했습니다. 이전에 언급 한 사건과 같은 어려운 상황에서 도움이 될까요?

+0

ES의 임시 자동 확장을 사용하는 특별한 이유는 무엇입니까? 클러스터에 필요한 노드의 수는 주로 인바운드 메시지 속도가 아니라 저장하려는 데이터의 양과 데이터를 쿼리하는 방법에 따라 달라집니다. –

+0

ES 클러스터에서 노드 수를 늘리면 처리되는 인바운드 메시지 수를 늘릴 수 있다는 인상을 받았습니다. – bScutt

+0

그건 사실 일지 모르지만 그다지 실용적이지 않다는 것을 스스로 발견했습니다. Logstash가 메시지를 가져올 수있는 중간 버퍼 (예 : 메시지 브로커)가있는 것처럼 스파이크를 다루는 더 나은 방법이 있다고 생각합니다. 이것은 분명히 로그 메시지의 가용성에 대한 까다로운 요구 사항을 요구하지 않습니다. –

답변

5

내 조언 Logstash와 Elasticsearch 사이에 깨진로 가장 좋은 방법은 레디 스를 사용

: 이것은 오래된 Logstash docs에 설명하지만 여전히 꽤 관련이있다

enter image description here

.

예. 생성되는 로그와 결국 Elasticsearch에 도착하는 로그 사이에 최소 지연이 표시되지만 Redis와 Logstash 간의 대기 시간이 상대적으로 적기 때문에 최소화해야합니다. 제 경험상 Logstash는 Redis의 백 로그를 꽤 빨리 처리하는 경향이 있습니다.

이러한 종류의 설정은 Logstash가 작동하지 않아도 Redis를 통해 이벤트를 수락하는보다 강력한 설정을 제공합니다.

그냥 추가 비 데이터 노드가 쓰기 무거운 기간에 도움이되는지 여부에 대한 질문에 관해서는

Elasticsearch 스케일링 : 나는 아니, 그렇게 생각하지 않는다. 비 데이터 노드는 많은 검색 (읽기)이 수행되는 것을 볼 때, 모든 데이터 노드에 검색을 위임 한 다음 클라이언트에 다시 보내기 전에 결과를 집계 할 때 유용합니다. 데이터 노드에서 결과를 집계하는 부담을 덜어줍니다.

쓰기에는 항상 데이터 노드가 관련됩니다.

노드 추가 및 제거가이 문제를 해결하는 좋은 방법이라고 생각하지 않습니다.

피크 시간대에 thread pools and queues을 조정할 수 있습니다. 일반적으로 다음과 같다고 가정 해 보겠습니다.

threadpool: 
    index: 
    type: fixed 
    size: 30 
    queue_size: 1000 
    search 
    type: fixed 
    size: 30 
    queue_size: 1000 

따라서 검색 및 인덱스 스레드를 균일하게 사용할 수 있습니다. 그냥 피크 시간 전에, 다음에 설정 (on the run)를 변경할 수 있습니다 : 검색은 백 버너에 넣어 동안

threadpool: 
    index: 
    type: fixed 
    size: 50 
    queue_size: 2000 
    search 
    type: fixed 
    size: 10 
    queue_size: 500 

지금 당신이 더 많은 스레드가 빠른 색인 처리량을 허용, 인덱싱을하고 있습니다. 좋은 측정을 위해 queue_size를 늘려 더 많은 수의 백 로그를 구축 할 수있었습니다. 그러나 예상대로 작동하지 않을 수 있으며 실험 및 조정이 권장됩니다.

관련 문제