Comment analyser les statistiques de la base de données Redis gérée à l’aide de la pile élastique sur Ubuntu 18.04

L'auteur a sélectionné lesFree and Open Source Fund pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

La surveillance de base de données est le processus continu de suivi systématique de diverses mesures indiquant le fonctionnement de la base de données. En observant les données de performance, vous pouvez obtenir des informations précieuses et identifier les goulots d'étranglement possibles, ainsi que trouver des moyens supplémentaires d'améliorer les performances de la base de données. De tels systèmes implémentent souvent des alertes qui avertissent les administrateurs en cas de problème. Les statistiques collectées peuvent être utilisées pour améliorer non seulement la configuration et le flux de travail de la base de données, mais également ceux des applications client.

L'avantage d'utiliser leElastic Stack (pile ELK) pour surveiller votre base de données gérée est son excellent support pour la recherche et la possibilité d'ingérer de nouvelles données très rapidement. Il n’excelle pas dans la mise à jour des données, mais ce compromis est acceptable pour la surveillance et la journalisation, où les données antérieures ne sont presque jamais modifiées. Elasticsearch offre un moyen puissant d'interroger les données, que vous pouvez utiliser viaKibana pour mieux comprendre comment la base de données se comporte à différentes périodes. Cela vous permettra de corréler la charge de la base de données avec des événements réels pour mieux comprendre comment la base de données est utilisée.

Dans ce didacticiel, vous allez importer des métriques de base de données, générées par la commande RedisINFO, dans Elasticsearch viaLogstash. Cela implique de configurer Logstash pour exécuter périodiquement la commande, analyser sa sortie et l'envoyer à Elasticsearch pour l'indexation immédiatement après. Les données importées peuvent ensuite être analysées et visualisées dans Kibana. À la fin du didacticiel, vous disposerez d’un système automatisé intégrant les statistiques Redis pour une analyse ultérieure.

Conditions préalables

[[step-1 -—- installation-et-configuration-logstash]] == Étape 1 - Installation et configuration de Logstash

Dans cette section, vous allez installer Logstash et le configurer pour extraire des statistiques de votre cluster de base de données Redis, puis les analyser pour les envoyer à Elasticsearch en vue de leur indexation.

Commencez par installer Logstash avec la commande suivante:

sudo apt install logstash -y

Une fois Logstash installé, activez le service pour qu'il démarre automatiquement au démarrage:

sudo systemctl enable logstash

Avant de configurer Logstash pour extraire les statistiques, voyons à quoi ressemblent les données. Pour vous connecter à votre base de données Redis, accédez à votre panneau de configuration de base de données gérée, et sous le panneauConnection details, sélectionnezFlags dans la liste déroulante:

Managed Database Control Panel

Une commande préconfigurée pour le clientRedli s'affichera, que vous utiliserez pour vous connecter à votre base de données. Cliquez surCopy et exécutez la commande suivante sur votre serveur, en remplaçantredli_flags_command par la commande que vous venez de copier:

redli_flags_command info

La sortie de cette commande étant longue, nous allons l'expliquer en différentes sections:

Dans la sortie de la commande Redisinfo, les sections sont marquées avec#, ce qui signifie un commentaire. Les valeurs sont renseignées sous la forme dekey:value, ce qui les rend relativement faciles à analyser.

Output# Server
redis_version:5.0.4
redis_git_sha1:ab60b2b1
redis_git_dirty:1
redis_build_id:7909f4de3561dc50
redis_mode:standalone
os:Linux 5.2.14-200.fc30.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:9.1.1
process_id:72
run_id:ddb7b96c93bbd0c369c6d06ce1c02c78902e13cc
tcp_port:25060
uptime_in_seconds:1733
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:8687593
executable:/usr/bin/redis-server
config_file:/etc/redis.conf

# Clients
connected_clients:3
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0

. . .

La sectionServer contient des informations techniques sur la version Redis, telles que sa version et le commit Git sur lequel elle est basée. Alors que la sectionClients fournit le nombre de connexions actuellement ouvertes.

Output. . .
# Memory
used_memory:941560
used_memory_human:919.49K
used_memory_rss:4931584
used_memory_rss_human:4.70M
used_memory_peak:941560
used_memory_peak_human:919.49K
used_memory_peak_perc:100.00%
used_memory_overhead:912190
used_memory_startup:795880
used_memory_dataset:29370
used_memory_dataset_perc:20.16%
allocator_allocated:949568
allocator_active:1269760
allocator_resident:3592192
total_system_memory:1030356992
total_system_memory_human:982.62M
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:463470592
maxmemory_human:442.00M
maxmemory_policy:allkeys-lru
allocator_frag_ratio:1.34
allocator_frag_bytes:320192
allocator_rss_ratio:2.83
allocator_rss_bytes:2322432
rss_overhead_ratio:1.37
rss_overhead_bytes:1339392
mem_fragmentation_ratio:5.89
mem_fragmentation_bytes:4093872
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:116310
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0
. . .

Ici,Memory confirme la quantité de RAM que Redis s'est allouée, ainsi que la quantité maximale de mémoire qu'il peut éventuellement utiliser. S'il commence à manquer de mémoire, il libérera des clés en utilisant la stratégie que vous avez spécifiée dans le panneau de configuration (indiquée dans le champmaxmemory_policy de cette sortie).

Output. . .
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1568966978
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
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

# Stats
total_connections_received:213
total_commands_processed:2340
instantaneous_ops_per_sec:1
total_net_input_bytes:39205
total_net_output_bytes:776988
instantaneous_input_kbps:0.02
instantaneous_output_kbps:2.01
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
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:353
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
. . .

Dans la sectionPersistence, vous pouvez voir la dernière fois que Redis a enregistré les clés qu'il stocke sur le disque, et si cela a réussi. La sectionStats fournit des chiffres relatifs aux connexions client et au sein du cluster, le nombre de fois où la clé demandée a été (ou n'a pas été) trouvée, et ainsi de suite.

Output. . .
# Replication
role:master
connected_slaves:0
master_replid:9c1d345a46d29d08537981c4fc44e312a21a160b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:46137344
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
. . .

[.note] #Note: Le projet Redis utilise les termes «maître» et «esclave» dans sa documentation et dans diverses commandes. DigitalOcean préfère généralement les termes alternatifs «primaire» et «réplica».
Ce guide utilisera par défaut les termes «primaire» et «réplique» chaque fois que possible, mais notez qu'il existe quelques cas où les termes «maître» et "esclave" surgissent inévitablement.
#

En regardant lesrole sousReplication, vous saurez si vous êtes connecté à un nœud principal ou de réplique. Le reste de la section indique le nombre de répliques actuellement connectées et la quantité de données manquante par rapport à la réplique par rapport au primaire. Il peut y avoir des champs supplémentaires si l'instance à laquelle vous êtes connecté est un réplica.

Output. . .
# CPU
used_cpu_sys:1.972003
used_cpu_user:1.765318
used_cpu_sys_children:0.000000
used_cpu_user_children:0.001707

# Cluster
cluster_enabled:0

# Keyspace

SousCPU, vous verrez la quantité de CPU système (used_cpu_sys) et utilisateur (used_cpu_user) que Redis consomme actuellement. La sectionCluster contient un seul champ unique,cluster_enabled, qui sert à indiquer que le cluster Redis est en cours d'exécution.

Logstash sera chargé d'exécuter périodiquement la commandeinfo sur votre base de données Redis (comme vous venez de le faire), d'analyser les résultats et de les envoyer à Elasticsearch. Vous pourrez ensuite y accéder plus tard à partir de Kibana.

Vous stockerez la configuration pour l'indexation des statistiques Redis dans Elasticsearch dans un fichier nomméredis.conf sous le répertoire/etc/logstash/conf.d, où Logstash stocke les fichiers de configuration. Lorsqu'il est démarré en tant que service, il les exécutera automatiquement en arrière-plan.

Créezredis.conf à l'aide de votre éditeur préféré (par exemple, nano):

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

Ajoutez les lignes suivantes:

/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}"
    }
}

N'oubliez pas de remplacerredis_flags_command par la commande affichée dans le panneau de configuration que vous avez utilisée plus tôt dans l'étape.

Vous définissez uninput, qui est un ensemble de filtres qui s'exécuteront sur les données collectées, et une sortie qui enverra les données filtrées à Elasticsearch. L'entrée se compose de la commandeexec, qui exécutera périodiquement uncommand sur le serveur, après un temps définiinterval (exprimé en secondes). Il spécifie également un paramètretype qui définit le type de document lorsqu'il est indexé dans Elasticsearch. Le blocexec transmet un objet contenant deux champs,command etmessage string. Le champcommand contiendra la commande qui a été exécutée et lesmessage contiendront sa sortie.

Il existe deux filtres qui s'exécutent séquentiellement sur les données collectées à partir de l'entrée. Le filtrekv représente le filtre clé-valeur et est intégré à Logstash. Il est utilisé pour analyser les données sous la forme générale dekeyvalue_separatorvalue et fournit des paramètres pour spécifier ce qui est considéré comme une valeur et des séparateurs de champ. Le séparateur de champs concerne les chaînes qui séparent les données formatées dans la forme générale les unes des autres. Dans le cas de la sortie de la commande Redis INFO, le séparateur de champ (field_split) est une nouvelle ligne et le séparateur de valeur (value_split) est:. Les lignes qui ne suivent pas le formulaire défini seront supprimées, y compris les commentaires.

Pour configurer le filtrekv, vous passez: au paramètre`value_split` et (signifiant une nouvelle ligne) au paramètrefield_split. Vous lui ordonnez également de supprimer les champscommand etmessage de l'objet de données courant en les passant àremove_field en tant qu'éléments d'un tableau, car ils contiennent des données qui sont désormais inutiles.

Le filtrekv représente la valeur analysée en tant que type chaîne (texte) par conception. Cela pose un problème, car Kibana ne peut pas facilement traiter les types de chaîne, même s’il s’agit d’un nombre. Pour résoudre ce problème, vous utiliserez du code Ruby personnalisé pour convertir les chaînes numériques uniquement en nombres, si possible. Le deuxième filtre est un blocruby qui fournit un paramètrecode acceptant une chaîne contenant le code à exécuter.

event est une variable que Logstash fournit à votre code et contient les données actuelles dans le pipeline de filtre. Comme indiqué précédemment, les filtres s'exécutent les uns après les autres, ce qui signifie que le filtre Ruby recevra les données analysées du filtrekv. Le code Ruby lui-même convertit lesevent en Hash et parcourt les clés, puis vérifie si la valeur associée à la clé peut être représentée sous la forme d'un entier ou d'un flottant (un nombre avec des décimales). Si c'est le cas, la valeur de la chaîne est remplacée par le nombre analysé. Lorsque la boucle se termine, il imprime un message (Ruby filter finished) pour signaler la progression.

La sortie envoie les données traitées à Elasticsearch pour indexation. Le document résultant sera stocké dans l'indexredis_info, défini en entrée et transmis en paramètre au bloc de sortie.

Enregistrez et fermez le fichier.

Vous avez installé Logstash à l'aide deapt et l'avez configuré pour demander périodiquement des statistiques à Redis, les traiter et les envoyer à votre instance Elasticsearch.

[[step-2 -—- testing-the-logstash-configuration]] == Étape 2 - Test de la configuration de Logstash

Vous allez maintenant tester la configuration en exécutant Logstash pour vérifier que les données seront correctement extraites.

Logstash prend en charge l'exécution d'une configuration spécifique en transmettant son chemin de fichier au paramètre-f. Exécutez la commande suivante pour tester votre nouvelle configuration à partir de la dernière étape:

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

L’affichage de la sortie peut prendre un certain temps, mais vous verrez bientôt quelque chose de similaire au suivant:

OutputWARNING: 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
[WARN ] 2019-09-20 11:59:53.440 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified
[INFO ] 2019-09-20 11:59:53.459 [LogStash::Runner] runner - Starting Logstash {"logstash.version"=>"6.8.3"}
[INFO ] 2019-09-20 12:00:02.543 [Converge PipelineAction::Create
] pipeline - Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50} [INFO ] 2019-09-20 12:00:03.331 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}} [WARN ] 2019-09-20 12:00:03.727 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"} [INFO ] 2019-09-20 12:00:04.015 [[main]-pipeline-manager] elasticsearch - ES Output version determined {:es_version=>6} [WARN ] 2019-09-20 12:00:04.020 [[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=>6} [INFO ] 2019-09-20 12:00:04.071 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]} [INFO ] 2019-09-20 12:00:04.100 [Ruby-0-Thread-5: :1] elasticsearch - Using default mapping template [INFO ] 2019-09-20 12:00:04.146 [Ruby-0-Thread-5: :1] elasticsearch - Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}} [INFO ] 2019-09-20 12:00:04.295 [[main]-pipeline-manager] exec - Registering Exec Input {:type=>"redis_info", :command=>"...", :interval=>10, :schedule=>nil} [INFO ] 2019-09-20 12:00:04.315 [Converge PipelineAction::Create
] pipeline - Pipeline started successfully {:pipeline_id=>"main", :thread=>"#"} [INFO ] 2019-09-20 12:00:04.483 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]} [INFO ] 2019-09-20 12:00:05.318 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600} Ruby filter finished Ruby filter finished Ruby filter finished ...

Vous verrez le messageRuby filter finished en cours d'impression à intervalles réguliers (définis sur 10 secondes à l'étape précédente), ce qui signifie que les statistiques sont envoyées à Elasticsearch.

Vous pouvez quitter Logstash en cliquant surCTRL + C sur votre clavier. Comme mentionné précédemment, Logstash exécutera automatiquement tous les fichiers de configuration trouvés sous/etc/logstash/conf.d en arrière-plan lors du démarrage en tant que service. Exécutez la commande suivante pour le démarrer:

sudo systemctl start logstash

Vous avez exécuté Logstash pour vérifier s’il peut se connecter à votre cluster Redis et collecter des données. Ensuite, vous explorerez certaines des données statistiques de Kibana.

[[step-3 -—- Explore-Imported-Data-in-Kibana]] == Étape 3 - Explorer les données importées dans Kibana

Dans cette section, vous allez explorer et visualiser les données statistiques décrivant les performances de votre base de données dans Kibana.

Dans votre navigateur Web, accédez à votre domaine où vous avez exposé Kibana en tant que partie des conditions préalables. Vous verrez la page d'accueil par défaut:

Kibana - Welcome Page

Avant d'explorer les données que Logstash envoie à Elasticsearch, vous devez d'abord ajouter l'indexredis_info à Kibana. Pour ce faire, cliquez surManagement dans la barre latérale verticale de gauche, puis surIndex Patterns sous la sectionKibana.

Kibana - Index Pattern Creation

Vous verrez un formulaire pour créer un nouveauIndex Pattern. Les modèles d'index dans Kibana permettent d'extraire des données de plusieurs index Elasticsearch à la fois et peuvent être utilisés pour explorer un seul index.

Sous le champ de texteIndex pattern, vous verrez l'indexredis_info répertorié. Tapez-le dans le champ de texte puis cliquez sur le boutonNext step.

Il vous sera ensuite demandé de choisir un champ d'horodatage afin que vous puissiez ensuite affiner vos recherches selon une plage de temps. Logstash en ajoute automatiquement un, appelé@timestamp. Sélectionnez-le dans la liste déroulante et cliquez surCreate index pattern pour terminer l'ajout de l'index à Kibana.

Kibana - Index Pattern Timestamp Selection

Pour créer et voir des visualisations existantes, cliquez sur l'élémentVisualize dans le menu vertical de gauche. Vous verrez la page suivante:

Kibana - Visualizations

Pour créer une nouvelle visualisation, cliquez sur le boutonCreate a visualization, puis sélectionnezLine dans la liste des types qui apparaîtra. Ensuite, sélectionnez le modèle d'indexredis_info* que vous venez de créer comme source de données. Vous verrez une visualisation vide:

Kibana - Empty Visualization

Le panneau de gauche fournit un formulaire pour l’édition des paramètres que Kibana utilisera pour dessiner la visualisation, qui sera affichée dans la partie centrale de l’écran. Le sélecteur de plage de dates se trouve dans le coin supérieur droit de l'écran. Si le champ@timestamp est utilisé dans la visualisation, Kibana n'affichera que les données appartenant à l'intervalle de temps spécifié dans le sélecteur de plage.

Vous allez maintenant visualiser l'utilisation moyenne de la mémoire Redis au cours d'un intervalle de temps spécifié. Cliquez surY-Axis sousMetrics dans le panneau de gauche pour le déplier, puis sélectionnezAverage commeAggregation et sélectionnezused_memory commeField. Cela peuplera l'axe Y du graphique avec les valeurs moyennes.

Ensuite, cliquez surX-Axis sousBuckets. Pour lesAggregation, choisissezDate Histogram. Les@timestamp doivent être automatiquement sélectionnés comme lesField. Ensuite, affichez la visualisation en cliquant sur le bouton de lecture bleu en haut du panneau. Si votre base de données est neuve et n’est pas utilisée, vous ne verrez pas une très longue ligne. Dans tous les cas, toutefois, vous verrez une représentation précise de l'utilisation moyenne de la mémoire. Voici à quoi peut ressembler la visualisation résultante après une utilisation faible ou inexistante:

Kibana - Redis Memory Usage Visualization

Dans cette étape, vous avez visualisé l'utilisation de la mémoire de votre base de données Redis gérée à l'aide de Kibana. Vous pouvez également utiliser d'autres types de tracé proposés par Kibana, tels que Visual Builder, pour créer des graphiques plus complexes qui présentent plusieurs champs à la fois. Cela vous permettra de mieux comprendre comment votre base de données est utilisée, ce qui vous aidera à optimiser les applications clientes, ainsi que votre base de données elle-même.

Conclusion

La pile Elastic est maintenant installée sur votre serveur et configurée pour extraire régulièrement des données statistiques de votre base de données Redis gérée. Vous pouvez analyser et visualiser les données à l'aide de Kibana, ou de tout autre logiciel approprié, qui vous aidera à recueillir des informations précieuses et des corrélations réelles sur les performances de votre base de données.

Pour plus d'informations sur ce que vous pouvez faire avec votre base de données gérée Redis, visitez le siteproduct docs. Si vous souhaitez présenter les statistiques de la base de données à l'aide d'un autre type de visualisation, consultez lesKibana docs pour obtenir des instructions supplémentaires.

Related