Como Analisar Estatísticas de Banco de Dados Redis Gerenciado Usando o Elastic Stack no Ubuntu 18.04

O autor selecionou o Fundo Livre e de Código Aberto para receber uma doação como parte do programa Write for DOnations.

Introdução

O monitoramento de banco de dados é o processo contínuo de acompanhar sistematicamente várias métricas que mostram como o banco de dados está se comportando. Observando dados de desempenho, você pode obter insights valiosos e identificar possíveis gargalos, bem como encontrar maneiras adicionais de melhorar o desempenho do banco de dados. Tais sistemas frequentemente implementam alertas que notificam os administradores quando as coisas saem erradas. As estatísticas coletadas podem ser usadas não apenas para melhorar a configuração e o fluxo de trabalho do banco de dados, mas também os das aplicações cliente.

O benefício de usar o Elastic Stack (ELK stack) para monitorar seu banco de dados gerenciado é o excelente suporte para busca e a capacidade de ingestão de novos dados muito rapidamente. Ele não se destaca na atualização dos dados, mas esse compromisso é aceitável para fins de monitoramento e registro, onde os dados passados quase nunca são alterados. O Elasticsearch oferece um meio poderoso de consultar os dados, que você pode usar através do Kibana para obter uma melhor compreensão de como o banco de dados se comporta em diferentes períodos de tempo. Isso permitirá que você correlacione a carga do banco de dados com eventos da vida real para obter insights sobre como o banco de dados está sendo utilizado.

Neste tutorial, você importará métricas do banco de dados, geradas pelo comando INFO do Redis, no Elasticsearch via Logstash. Isso envolve configurar o Logstash para executar periodicamente o comando, analisar sua saída e enviá-lo para o Elasticsearch para indexação imediatamente após. Os dados importados podem ser posteriormente analisados e visualizados no Kibana. No final do tutorial, você terá um sistema automatizado trazendo estatísticas do Redis para análise posterior.

Pré-requisitos

Passo 1 — Instalação e Configuração do Logstash

Nesta seção, você irá instalar o Logstash e configurá-lo para extrair estatísticas do seu cluster de banco de dados Redis e, em seguida, analisá-las para enviar ao Elasticsearch para indexação.

Comece instalando o Logstash com o seguinte comando:

  1. sudo apt install logstash -y

Depois que o Logstash estiver instalado, habilite o serviço para iniciar automaticamente na inicialização:

  1. sudo systemctl enable logstash

Antes de configurar o Logstash para extrair as estatísticas, vamos ver como os dados em si se parecem. Para se conectar ao seu banco de dados Redis, acesse o Painel de Controle do seu Banco de Dados Gerenciado e, na área de Detalhes da Conexão, selecione Flags no menu suspenso:

Você verá um comando pré-configurado para o cliente Redli, que você usará para se conectar ao seu banco de dados. Clique em Copiar e execute o seguinte comando no seu servidor, substituindo redli_flags_command pelo comando que acabou de copiar:

  1. redli_flags_command info

Como a saída deste comando é longa, vamos explicar isso dividido em suas diferentes seções.

Na saída do comando info do Redis, as seções são marcadas com #, o que significa um comentário. Os valores são preenchidos no formato chave:valor, o que os torna relativamente fáceis de analisar.

A seção Server contém informações técnicas sobre a construção do Redis, como sua versão e o commit do Git no qual se baseia, enquanto a seção Clients fornece o número de conexões atualmente abertas.

Output
# Server redis_version:6.2.6 redis_git_sha1:4f4e829a redis_git_dirty:1 redis_build_id:5861572cb79aebf3 redis_mode:standalone os:Linux 5.11.12-300.fc34.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:11.2.1 process_id:79 process_supervised:systemd run_id:b8a0aa25d8f49a879112a04a817ac2acd92e0c75 tcp_port:25060 server_time_usec:1640878632737564 uptime_in_seconds:1679 uptime_in_days:0 hz:10 configured_hz:10 lru_clock:13488680 executable:/usr/bin/redis-server config_file:/etc/redis.conf io_threads_active:0 # Clients connected_clients:4 cluster_connections:0 maxclients:10032 client_recent_max_input_buffer:24 client_recent_max_output_buffer:0 ...

Memory confirma quanto de RAM o Redis alocou para si, bem como a quantidade máxima de memória que pode utilizar. Se começar a ficar sem memória, ele liberará chaves usando a estratégia especificada no Painel de Controle (mostrado no campo maxmemory_policy neste output).

Output
... # Memory used_memory:977696 used_memory_human:954.78K used_memory_rss:9977856 used_memory_rss_human:9.52M used_memory_peak:977696 used_memory_peak_human:954.78K used_memory_peak_perc:100.00% used_memory_overhead:871632 used_memory_startup:810128 used_memory_dataset:106064 used_memory_dataset_perc:63.30% allocator_allocated:947216 allocator_active:1273856 allocator_resident:3510272 total_system_memory:1017667584 total_system_memory_human:970.52M used_memory_lua:37888 used_memory_lua_human:37.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:455081984 maxmemory_human:434.00M maxmemory_policy:noeviction allocator_frag_ratio:1.34 allocator_frag_bytes:326640 allocator_rss_ratio:2.76 allocator_rss_bytes:2236416 rss_overhead_ratio:2.84 rss_overhead_bytes:6467584 mem_fragmentation_ratio:11.43 mem_fragmentation_bytes:9104832 mem_not_counted_for_evict:0 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:61504 mem_aof_buffer:0 mem_allocator:jemalloc-5.1.0 active_defrag_running:0 lazyfree_pending_objects:0 ...

Na seção Persistence, você pode ver a última vez que o Redis salvou as chaves que armazena no disco, e se foi bem-sucedido. A seção Stats fornece números relacionados a conexões de cliente e em cluster, o número de vezes que a chave solicitada foi (ou não foi) encontrada, e assim por diante.

Output
... # Persistence loading:0 current_cow_size:0 current_cow_size_age:0 current_fork_perc:0.00 current_save_keys_processed:0 current_save_keys_total:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1640876954 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:1 rdb_current_bgsave_time_sec:-1 rdb_last_cow_size:217088 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_last_cow_size:0 module_fork_in_progress:0 module_fork_last_cow_size:0 # Stats total_connections_received:202 total_commands_processed:2290 instantaneous_ops_per_sec:0 total_net_input_bytes:38034 total_net_output_bytes:1103968 instantaneous_input_kbps:0.01 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 expired_stale_perc:0.00 expired_time_cap_reached_count:0 expire_cycle_cpu_milliseconds:29 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:452 total_forks:1 migrate_cached_sockets:0 slave_expires_tracked_keys:0 active_defrag_hits:0 active_defrag_misses:0 active_defrag_key_hits:0 active_defrag_key_misses:0 tracking_total_keys:0 tracking_total_items:0 tracking_total_prefixes:0 unexpected_error_replies:0 total_error_replies:0 dump_payload_sanitizations:0 total_reads_processed:2489 total_writes_processed:2290 io_threaded_reads_processed:0 io_threaded_writes_processed:0 ...

Ao observar o role sob Replication, você saberá se está conectado a um nó primário ou de réplica. O restante da seção fornece o número de réplicas atualmente conectadas e a quantidade de dados que a réplica está faltando em relação ao primário. Pode haver campos adicionais se a instância à qual você está conectado for uma réplica.

Nota: O projeto Redis usa os termos “mestre” e “escravo” em sua documentação e em vários comandos. A DigitalOcean geralmente prefere os termos alternativos “primário” e “réplica”. Este guia utilizará os termos “primário” e “réplica” sempre que possível, mas observe que há algumas instâncias em que os termos “mestre” e “escravo” inevitavelmente surgem.

Output
... # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:f727fad3691f2a8d8e593b087c468bbb83703af3 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:45088768 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 ...

Sob CPU, você verá a quantidade de energia do sistema (used_cpu_sys) e do usuário (used_cpu_user) que o Redis está consumindo no momento. A seção Cluster contém apenas um campo único, cluster_enabled, que serve para indicar que o cluster Redis está em execução.

Output
... # CPU used_cpu_sys:1.617986 used_cpu_user:1.248422 used_cpu_sys_children:0.000000 used_cpu_user_children:0.001459 used_cpu_sys_main_thread:1.567638 used_cpu_user_main_thread:1.218768 # Modules # Estatísticas de Erro # Cluster cluster_enabled:0 # Keyspace

O Logstash será encarregado de executar periodicamente o comando info em seu banco de dados Redis (similar ao que você acabou de fazer), analisar os resultados e enviá-los para o Elasticsearch. Você poderá acessá-los posteriormente no Kibana.

Você irá armazenar a configuração para indexar estatísticas do Redis no Elasticsearch em um arquivo chamado redis.conf no diretório /etc/logstash/conf.d, onde o Logstash armazena os arquivos de configuração. Quando iniciado como serviço, ele os executará automaticamente em segundo plano.

Crie o redis.conf usando seu editor favorito (por exemplo, nano):

  1. sudo nano /etc/logstash/conf.d/redis.conf

Adicione as seguintes linhas:

/etc/logstash/conf.d/redis.conf
input {
	exec {
		command => "redis_flags_command info"
		interval => 10
		type => "redis_info"
	}
}

filter {
	kv {
		value_split => ":"
		field_split => "\r\n"
		remove_field => [ "command", "message" ]
	}

	ruby {
		code =>
		"
		event.to_hash.keys.each { |k|
			if event.get(k).to_i.to_s == event.get(k) # is integer?
				event.set(k, event.get(k).to_i) # convert to integer
			end
			if event.get(k).to_f.to_s == event.get(k) # is float?
				event.set(k, event.get(k).to_f) # convert to float
			end
		}
		puts 'Ruby filter finished'
		"
	}
}

output {
    elasticsearch {
        hosts => "http://localhost:9200"
        index => "%{type}"
    }
}

Lembre-se de substituir redis_flags_command pelo comando mostrado no painel de controle que você usou anteriormente no passo.

Você define um input, que é um conjunto de filtros que serão executados nos dados coletados, e uma saída que enviará os dados filtrados para o Elasticsearch. A entrada consiste no comando exec, que irá executar um comando no servidor periodicamente, após um tempo definido intervalo (expresso em segundos). Também especifica um parâmetro tipo que define o tipo de documento quando indexado no Elasticsearch. O bloco exec passa um objeto contendo dois campos, comando e mensagem de string. O campo comando conterá o comando que foi executado, e a mensagem conterá sua saída.

Há dois filtros que serão executados sequencialmente nos dados coletados da entrada. O filtro kv representa o filtro de chave-valor e é integrado ao Logstash. É usado para analisar dados no formato geral de chaveseparador_de_valorvalor e fornece parâmetros para especificar o que é considerado separadores de valor e de campo. O separador de campo se refere a strings que separam os dados formatados no formato geral uns dos outros. No caso da saída do comando Redis INFO, o separador de campo (campo_split) é uma nova linha, e o separador de valor (valor_split) é :. Linhas que não seguem a forma definida serão descartadas, incluindo comentários.

Para configurar o filtro kv, você passa : para o parâmetro value_split, e \r\n (indicando uma nova linha) para o parâmetro field_split. Você também ordena a remoção dos campos command e message do objeto de dados atual, passando-os para remove_field como elementos de um array, porque eles contêm dados que agora são inúteis.

O filtro kv representa o valor que analisou como um tipo de string (texto) por design. Isso levanta um problema porque o Kibana não pode processar facilmente tipos de string, mesmo que seja realmente um número. Para resolver isso, você usará código Ruby personalizado para converter as strings contendo apenas números em números, quando possível. O segundo filtro é um bloco ruby que fornece um parâmetro code aceitando uma string contendo o código a ser executado.

event é uma variável que o Logstash fornece para o seu código, e contém os dados atuais no pipeline de filtro. Como foi observado antes, os filtros são executados um após o outro, o que significa que o filtro Ruby receberá os dados analisados do filtro kv. O próprio código Ruby converte o event para um Hash e percorre as chaves, depois verifica se o valor associado à chave pode ser representado como um inteiro ou como um float (um número com decimais). Se puder, o valor da string é substituído pelo número analisado. Quando o loop termina, ele imprime uma mensagem (Filtro Ruby concluído) para relatar o progresso.

A saída envia os dados processados para o Elasticsearch para indexação. O documento resultante será armazenado no índice redis_info, definido na entrada e passado como parâmetro para o bloco de saída. Salve e feche o arquivo.

Você instalou o Logstash usando apt e o configurou para solicitar periodicamente estatísticas do Redis, processá-las e enviá-las para sua instância do Elasticsearch.

Passo 2 — Testando a Configuração do Logstash

Agora você testará a configuração executando o Logstash para verificar se ele puxará os dados corretamente.

O Logstash suporta a execução de uma configuração específica passando o caminho do arquivo para o parâmetro -f. Execute o seguinte comando para testar sua nova configuração do último passo:

  1. sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis.conf

Pode levar algum tempo para mostrar a saída, mas logo você verá algo semelhante ao seguinte:

Output
Using bundled JDK: /usr/share/logstash/jdk OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console [INFO ] 2021-12-30 15:42:08.887 [main] runner - Starting Logstash {"logstash.version"=>"7.16.2", "jruby.version"=>"jruby 9.2.20.1 (2.5.8) 2021-11-30 2a2962fbd1 OpenJDK 64-Bit Server VM 11.0.13+8 on 11.0.13+8 +indy +jit [linux-x86_64]"} [INFO ] 2021-12-30 15:42:08.932 [main] settings - Creating directory {:setting=>"path.queue", :path=>"/usr/share/logstash/data/queue"} [INFO ] 2021-12-30 15:42:08.939 [main] settings - Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/share/logstash/data/dead_letter_queue"} [WARN ] 2021-12-30 15:42:09.406 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified [INFO ] 2021-12-30 15:42:09.449 [LogStash::Runner] agent - No persistent UUID file found. Generating new UUID {:uuid=>"acc4c891-936b-4271-95de-7d41f4a41166", :path=>"/usr/share/logstash/data/uuid"} [INFO ] 2021-12-30 15:42:10.985 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600, :ssl_enabled=>false} [INFO ] 2021-12-30 15:42:11.601 [Converge PipelineAction::Create<main>] Reflections - Reflections took 77 ms to scan 1 urls, producing 119 keys and 417 values [WARN ] 2021-12-30 15:42:12.215 [Converge PipelineAction::Create<main>] plain - Relying on default value of `pipeline.ecs_compatibility`, which may change in a future major release of Logstash. To avoid unexpected changes when upgrading Logstash, please explicitly declare your desired ECS Compatibility mode. [WARN ] 2021-12-30 15:42:12.366 [Converge PipelineAction::Create<main>] plain - Relying on default value of `pipeline.ecs_compatibility`, which may change in a future major release of Logstash. To avoid unexpected changes when upgrading Logstash, please explicitly declare your desired ECS Compatibility mode. [WARN ] 2021-12-30 15:42:12.431 [Converge PipelineAction::Create<main>] elasticsearch - Relying on default value of `pipeline.ecs_compatibility`, which may change in a future major release of Logstash. To avoid unexpected changes when upgrading Logstash, please explicitly declare your desired ECS Compatibility mode. [INFO ] 2021-12-30 15:42:12.494 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]} [INFO ] 2021-12-30 15:42:12.755 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}} [WARN ] 2021-12-30 15:42:12.955 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"} [INFO ] 2021-12-30 15:42:12.967 [[main]-pipeline-manager] elasticsearch - Elasticsearch version determined (7.16.2) {:es_version=>7} [WARN ] 2021-12-30 15:42:12.968 [[main]-pipeline-manager] elasticsearch - Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7} [WARN ] 2021-12-30 15:42:13.065 [[main]-pipeline-manager] kv - Relying on default value of `pipeline.ecs_compatibility`, which may change in a future major release of Logstash. To avoid unexpected changes when upgrading Logstash, please explicitly declare your desired ECS Compatibility mode. [INFO ] 2021-12-30 15:42:13.090 [Ruby-0-Thread-10: :1] elasticsearch - Using a default mapping template {:es_version=>7, :ecs_compatibility=>:disabled} [INFO ] 2021-12-30 15:42:13.147 [Ruby-0-Thread-10: :1] elasticsearch - Installing Elasticsearch template {:name=>"logstash"} [INFO ] 2021-12-30 15:42:13.192 [[main]-pipeline-manager] javapipeline - Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>250, "pipeline.sources"=>["/etc/logstash/conf.d/redis.conf"], :thread=>"#<Thread:0x5104e975 run>"} [INFO ] 2021-12-30 15:42:13.973 [[main]-pipeline-manager] javapipeline - Pipeline Java execution initialization time {"seconds"=>0.78} [INFO ] 2021-12-30 15:42:13.983 [[main]-pipeline-manager] exec - Registering Exec Input {:type=>"redis_info", :command=>"redli --tls -h db-redis-fra1-68603-do-user-1446234-0.b.db.ondigitalocean.com -a hnpJxAgoH3Om3UwM -p 25061 info", :interval=>10, :schedule=>nil} [INFO ] 2021-12-30 15:42:13.994 [[main]-pipeline-manager] javapipeline - Pipeline started {"pipeline.id"=>"main"} [INFO ] 2021-12-30 15:42:14.034 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]} Ruby filter finished Ruby filter finished Ruby filter finished ...

Você verá a mensagem Filtro Ruby finalizado sendo impressa em intervalos regulares (configurados para 10 segundos no passo anterior), o que significa que as estatísticas estão sendo enviadas para o Elasticsearch.

Você pode sair do Logstash clicando em CTRL + C no seu teclado. Como mencionado anteriormente, o Logstash executará automaticamente todos os arquivos de configuração encontrados em /etc/logstash/conf.d em segundo plano quando iniciado como um serviço. Execute o seguinte comando para iniciá-lo:

  1. sudo systemctl start logstash

Você executou o Logstash para verificar se ele pode se conectar ao seu cluster Redis e coletar dados. Em seguida, você explorará alguns dos dados estatísticos no Kibana.

Passo 3 — Explorando Dados Importados no Kibana

Nesta seção, você irá explorar e visualizar os dados estatísticos descrevendo o desempenho do seu banco de dados no Kibana.

No seu navegador da web, acesse seu domínio onde você expôs o Kibana como parte dos pré-requisitos. Você verá a página de boas-vindas padrão:

Antes de explorar os dados que o Logstash está enviando para o Elasticsearch, você primeiro precisará adicionar o índice redis_info ao Kibana. Para fazer isso, primeiro selecione Explorar por conta própria na página de boas-vindas e, em seguida, abra o menu hambúrguer no canto superior esquerdo. Sob Análises, clique em Descobrir.

O Kibana então irá solicitar que você crie um novo padrão de índice:

Clique em Criar padrão de índice. Você verá um formulário para criar um novo Padrão de Índice. Padrões de Índice no Kibana fornecem uma maneira de puxar dados de múltiplos índices do Elasticsearch de uma só vez e podem ser usados para explorar apenas um índice.

À direita, o Kibana lista todos os índices disponíveis, como redis_info que você configurou o Logstash para usar. Digite-o no campo de texto Nome e selecione @timestamp no menu suspenso como o Campo de data e hora. Quando terminar, pressione o botão Criar padrão de índice abaixo.

Para criar e ver visualizações existentes, abra o menu hambúrguer. Sob Análises, selecione Painel. Quando carregar, pressione Criar visualização para começar a criar uma nova:

O painel do lado esquerdo fornece uma lista de valores que o Kibana pode usar para desenhar a visualização, que será mostrada na parte central da tela. No canto superior direito da tela está o seletor de intervalo de datas. Se o campo @timestamp estiver sendo usado na visualização, o Kibana mostrará apenas os dados pertencentes ao intervalo de tempo especificado no seletor de intervalo.

No menu suspenso na parte principal da página, selecione Linha na seção Linha e área. Em seguida, encontre o campo used_memory na lista à esquerda e arraste-o para a parte central. Logo você verá uma visualização de linha da quantidade média de memória usada ao longo do tempo:

À direita, você pode configurar como os eixos horizontal e vertical são processados. Lá, você pode definir o eixo vertical para mostrar os valores médios em vez de medianos pressionando no eixo mostrado:

Você pode selecionar uma função diferente ou fornecer a sua própria:

O gráfico será imediatamente atualizado com os valores atualizados.

Neste passo, você visualizou o uso de memória do seu banco de dados Redis gerenciado usando o Kibana. Isso permitirá que você obtenha uma melhor compreensão de como seu banco de dados está sendo utilizado, o que ajudará na otimização de aplicativos clientes, bem como do próprio banco de dados.

Conclusão

Agora você tem o Elastic Stack instalado no seu servidor e configurado para extrair dados estatísticos do seu banco de dados Redis gerenciado regularmente. Você pode analisar e visualizar os dados usando o Kibana, ou outro software adequado, o que ajudará a obter insights valiosos e correlações do mundo real sobre o desempenho do seu banco de dados.

Para obter mais informações sobre o que você pode fazer com seu Banco de Dados Redis Gerenciado, visite a documentação do produto. Se desejar apresentar as estatísticas do banco de dados usando outro tipo de visualização, consulte a documentação do Kibana para obter instruções adicionais.

Source:
https://www.digitalocean.com/community/tutorials/how-to-analyze-managed-redis-database-statistics-using-the-elastic-stack-on-ubuntu-18-04