Meta
Armazenamento central e forma de analisar números de desempenho:
- carga da CPU
- uso de ram
- ...
estratégia atual
Eu gostaria de implementar uma configuração como esta:
- coletado
- logstash
- elasticsearch
- kibana
Como explicado aqui: https://mtalavera.wordpress.com/2015/02/16/monitoring-with-collectd-and-kibana/
Problema: o host remoto não pode enviar dados
Restrições:
- Temos apenas
ssh
do servidor central para o host remoto. ssh
de hosts remotos para servidor central não funciona por causa da configuração de rede (algo que infelizmente não posso mudar).- o tráfego de rede atravessa várias redes não públicas. Duas vezes por mês, um host não pode ser alcançado porque um administrador joga com as regras do firewall. Não quero perder uma única linha. É por isso que quero armazenar os logs no host remoto e buscar os dados (compactados).
Solução?
Como posso buscar os dados a cada hora?
Com os problemas listados acima, você precisará armazenar em buffer as estatísticas na extremidade remota para que nada seja perdido.
Há várias maneiras de fazer isso, mas nenhuma é excessivamente simples e exigirá muitos testes para garantir que sejam viáveis. Todos eles envolvem a gravação
collectd
da saída localmente e, em seguida, o uso de algum método para obtê-la no servidor central.Eu não testei nenhum dos abaixo, então alguns podem não funcionar.
Em nenhuma ordem particular de facilidade ou complicação:
Socket/Network Output to Script
Write
Collectd
's output to a socket or IP/port, where a PHP/Perl/Python/Bash script is listen to write the commands to a file.Esses arquivos podem então ser enviados/puxados pelo servidor central e ingeridos pelo Logstash.
Prós : Script simples para capturar a saída; comandos padrão do Linux usados
Contras : Não escalável se você estiver obtendo muitas estatísticas; necessidade de manter o roteiro; não tenho certeza se LS lidará com protocolo simples
Redis/AMQP/Kafka/MongoDB Grava a
Collectd
saída em um dos possíveis "buffers". Cada um deles funciona de maneira um pouco diferente e tem diferentes opções de implantação, então deixarei para você descobrir qual é o melhor, já que está fora do escopo desta pergunta. Dito isto, qualquer um deles deve funcionar.You'd then need a method to get the data from your buffer solution back to the Central Server. Application native Replication/Mirroring/Clustering or a script that runs every X interval to ship the data (run at either end) are two possibilities.
Pros: Very flexible deployment options; should scale very well; uses well known tools/programs
Cons: Buffer progam might need lots of resources, or many packages installed
Socket/Network Output to Logstash This is almost the same as option 1, but instead of having
collectd
output to a script/progarm, you have it write to a local Logstash instance on each Remote-Host.Logstash would then write to CSV/JSON locally, and you can use any means to get those files back to the Central Server, including LS itself.
Pros: Single set of tools for whole solution; provides a way to transform data at the edge, then just ingest centrally; very few moving parts Cons: need Java/LS on all remote hosts
In addition to each options pros/cons, the single common downside to all of them is that you'd need to find a way to maintain consistent configs on all the servers. If you have lots of remote nodes (or just lots of nodes in general) you might already have a Configuration Management System in place and this will be trivial.
editar: Achtung! Aviso!
Por favor, use isso
docker-compose
em vez do que eu vinculei (requerdocker
ecompose
talvezmachine
, mas tenha feito mais por você e você terá que lutar menos.Também
Portanto, comece aqui para obter uma boa visão geral de um sistema em funcionamento. Eles fizeram parte do trabalho para você, então você precisa se preocupar apenas com sua pergunta, que diz respeito à configuração e implantação.
Mesmo que você acabe não usando o Docker, isso ainda o colocará no caminho do sucesso e terá o benefício adicional de mostrar como ele se encaixa.
Obtenha o Vagrant primeiro e construa a imagem Vagrant w/ vagrant up
Se você não sabe o que é Vagrant, é maravilhoso. É um programa que permite que as pessoas compartilhem todo o conjunto de máquinas virtuais e provisionadores para que você possa definir apenas uma VM e sua configuração, em vez de compartilhar toda a VM, e "simplesmente funciona". Parece mágico, mas na verdade é apenas um trabalho sólido de sistemas.
Você precisará instalar o Vagrant para usá-lo. Apenas faça! Então, você não precisa instalar
docker
porque ele será executado em uma VM Vagrant.Você tem quatro opções de como deseja usá-lo, mas primeiro prepare o Vagrant com o comando em negrito....
vagrant up
Decida quais programas você precisa executar
Suas opções são:
Existem outras configurações disponíveis, mas apenas para teste.
Altura de começar
Agora é hora de configurar o Logstash, que é realmente a única parte que possui comportamento complexo.
Os arquivos de configuração Logstash são arquivos de texto simples que terminam em
conf
e, opcionalmente, podem ser agrupados usando umtar
ou gunzipgz
.Você obtém os arquivos de configuração de duas maneiras:
LOGSTASH_CONFIG_URL
para apontar para o url de sua configuração e **se você errar o url ou houver algum problema e não conseguir obter uma configuração do url, ele voltará para um conhecido url ou entãoAqui está o que parece quando você executa usando uma configuração da Internet:
O autor do
docker
adverte :Nota: Qual é o logstash conf padrão ?
Lembre-se de que é o arquivo que você obtém quando não coloca um URL correto para a variável de ambiente necessária
LOGSTASH_CONFIG_URL
Esta é a seção de entrada:
além do padrão
Leia mais sobre
logstash
no site.Agora
logstash
tem plug-ins que enviam dados para arquivosinput
. Os plugins variam exatamente como você esperaria; aqui estão alguns:s3
da amazon (eventos do sistema de arquivos)stdin
fromlogstash
(padrão, lê ostdin
buffer)http
delogstash
(seu palpite)Exemplo: soquetes UDP
UDP
é um protocolo sem conexão e rápido que opera na parte inferior doL4
(transporte) e oferece suporte à multiplexação, lida com falhas e geralmente é uma boa escolha para registrar a transmissão de dados.Você escolhe a porta que deseja; outras opções dependem do que você está fazendo.
O TCP funciona da mesma maneira.
udp { porta => 9999 codec => json buffer_size => 1452 }
Exemplo 2: soquetes UDP
collectd
filtrados e de saídaE a filtragem é um ótimo exemplo: Ou seja, é muito longo e acho que faz coisas
editar 3: Eu provavelmente não deveria estar fazendo o seu trabalho para você, mas tudo bem.
collectd
como qualquer bom software ENCAPSULTAES certos aspectos que são feios ou difíceis para os usuários lidarem, e tenta facilitar para você parecer que você está enviando dados (uma tupla neste caso) em vez de brincar com a serialização.Seu exemplo:
Não vou gastar meu tempo tentando descobrir como você está formando isso. Se você conseguir obter esses dados usando o plug-in da CPU, ótimo. Vou copiar e colar um que encontrei online para facilitar.
Dito isso, pense bem... só um pouquinho, não vai doer.
Você vê que o plug-in da CPU está carregado abaixo.
Você vê que a interface
collectd
doconf
arquivo é muito pequena para especificar campos.Portanto, se você apenas fizer isso, funcionará, mas obterá muito mais dados do que apenas a carga da CPU.
É aí que você pode usar um filtro. Mas você também pode fazer isso em Kibana, eu acho. Portanto, prefiro não perder tempo escrevendo um filtro que você a) não precisa e b) poderia escrever facilmente se gastasse algum tempo.
Sua configuração de logstash
uma atualização de aaron em collectd