Logstash / elasticsearch para de aceitar novos dados

4

Eu configurei uma nova prova de conceito do sistema logstash

CentOS 6.6 (on Vmware 5.5) - single CPU VM with 12G RAM allocated

Elasticsearch e Logstash instalados a partir de RPMs…

# rpm -q elasticsearch logstash
elasticsearch-1.7.1-1.noarch
logstash-1.5.3-1.noarch

JVM: 1.8.0_51

Os dados que estou alimentando são registros simples do formulário…

M1234 z123 2015-01-31 23:28:09.417 8.55373

(os campos são nome da máquina, ID do usuário, data, hora, hora de logon - tudo é simples US-ASCII)

Configuração do Logstash abaixo (esses dados são provenientes de um banco de dados MSSQL e, no momento, estou exportando para o arquivo de texto e transferindo o arquivo para o servidor logstash).

Isso funcionou bem para um dia inteiro de logs (registros de 11K), mas quando tento processar o backlog a partir desse ano, ele "trava".

Os sintomas disso são

  • o elasticsearch ainda é responsivo - as pesquisas e o acesso à configuração ainda são excelentes
  • o número de documentos nos índices pára de subir
  • o sistema torna-se essencial inativo - apenas a atividade do disco em segundo plano e o uso mínimo da CPU
  • se eu tentar parar o processo logstash (que ainda está em execução), ele só morrerá com kill -9 .

Isso parece acontecer em cerca de 200 mil documentos. Não é afetado pelo número de índices - comecei com índices diários e depois mudei para semanal - ele ainda para em torno de 200 mil documentos.

Como essa é uma prova de conceito em execução em uma única máquina, reduzi a contagem de réplicas para 0 e os shards para 1 - não acho que isso deva fazer alguma diferença para esse problema.

Não vejo nenhum erro nos logs logstash ou elasticsearch, apesar de ter tornado a verbosidade em ambos.

Eu não acho que o sistema esteja ficando sem memória, espaço em disco, descritores de arquivos.

Não sei mais o que ver. Isso parece um problema trivial (para a ELK) e não vejo esse problema em uma configuração existente da ELK que lida com nossos logs de e-mail (embora isso esteja executando versões anteriores e tenha vários nós de armazenamento elasticsearch)

Embora eu tenha certeza de que não há sequências de byte ímpar nos arquivos de entrada, eu declarei explicitamente a entrada como US_ASCII com charset => "US-ASCII" na sub-rotina do plugin file input. Não espero que isso faça alguma diferença (o teste ainda está em execução).

Atualização: Embora não houvesse nada de interessante nos logs quando a importação parou, as linhas registradas quando logstash foi solicitado a desligar foram interessantes…

{:timestamp=>"2015-08-03T10:17:39.104000+0100", :message=>["INFLIGHT_EVENTS_REPORT", "2015-08-03T10:17:39+01:00", {"input_to_filter"=>20, "filter_to_output"=>0, "outputs"=>[]}], :level=>:warn}

Implica em mim que o problema está no estágio de filtragem e não na saída para elasticsearch . Confirmei isso primeiro livrando-se da saída elasticsearch e tendo apenas stdout . Isso mostrou o mesmo comportamento - importou depois de um tempo.

Colocar a saída elasticsearch de volta, mas limpar tudo na seção filter me deu uma importação de dados completa e bem-sucedida.

Agora eu tenho uma correção para isso - detalhes em resposta.

input {
        file {
                path => "/var/lib/clusters/*"
                type => "clusterF"
                start_position => "beginning"
        }
}

filter {
        mutate {
                remove_field => [ "path", "host" ]
        }
        # 13COMP014   nabcteam    2015-07-29 11:09:21.353 153.493
        if [type] == "clusterF" {
                grok {
                        match => { "message" => "%{NOTSPACE:client} +%{WORD:userid} +%{TIMESTAMP_ISO8601:datestamp} +%{BASE10NUM:elapsed:float}" }
                }
        }
        if [elapsed] < 0 {
                drop {}
        }
        if [elapsed] > 1000.0 {
                drop {}
        }
        if [userid] =~ "[a-z][0-9]{7}" {
                mutate {
                        add_field => [ "userClass", "student" ]
                }
        } else if [userid] =~ "n[a-z].*" {
                mutate {
                        add_field => [ "userClass", "staff" ]
                }
        } else {
                mutate {
                        add_field => [ "userClass", "other" ]
                }
        }
        date {
                match => [ "datestamp", "ISO8601" ]
        }
        mutate {
                remove_field => [ "message" ]
        }
}

output {
        elasticsearch {
                bind_host => "clog01.ncl.ac.uk"
                protocol => "http"
                cluster => "elasticsearch"
                flush_size => 10
                index => "clusters-%{+xxxx.ww}"
        }
}
    
por Paul Haldane 02.08.2015 / 22:33

1 resposta

2

Quando soube que a barraca estava acontecendo em torno de filter , em vez de output , isso era muito mais fácil de encontrar.

Colocar a saída elasticsearch de volta, mas limpar tudo na seção filter me deu uma importação de dados completa e bem-sucedida.

Eu escrevi um script simples de perl para validar as linhas de entrada com relação à especificação grok - isso me mostrou que alguns hífens contidos no userid (que eu não esperava). Substituir +%{WORD:userid} por +%{NOTSPACE:userid} na configuração original me deu uma configuração funcional. Eu suspeito que o que eu deveria ter feito em primeiro lugar foi adicionar um campo em grok bem-sucedido e apenas aplicar as outras regras de filtro se esse campo estivesse presente.

A principal moral que considero é que é importante simplificar esse tipo de problema, caso contrário, o espaço de pesquisa para possíveis causas é muito grande.

    
por 03.08.2015 / 13:34