著者はhttps://www.brightfunds.org/funds/foss-nonprofits [無料およびオープンソース基金]を選択して、https://do.co/w4do-cta [Donationsのために書く]の一部として寄付を受け取りましたプログラム。

前書き

データベース監視は、データベースのパフォーマンスを示すさまざまなメトリックを体系的に追跡する継続的なプロセスです。 パフォーマンスデータを観察することで、貴重な洞察を得て、考えられるボトルネックを特定し、データベースのパフォーマンスを向上させる追加の方法を見つけることができます。 そのようなシステムは、多くの場合、問題が発生したときに管理者に通知するアラートを実装しています。 収集された統計を使用して、データベースの構成とワークフローだけでなく、クライアントアプリケーションの構成とワークフローも改善できます。

管理対象データベースの監視にhttps://www.elastic.co/products/elastic-stack[Elastic Stack](ELKスタック)を使用する利点は、検索に対する優れたサポートと、新しいデータを非常に迅速に取り込む機能です。 データの更新には優れていませんが、このトレードオフは、過去のデータがほとんど変更されない監視およびログ記録の目的には受け入れられます。 Elasticsearchは、データを照会する強力な手段を提供します。これを使用すると、https://www.elastic.co/products/kibana [Kibana]を使用してより良い結果を得ることができますさまざまな期間でデータベースがどのように変化するかを理解する。 これにより、データベースの負荷を実際のイベントと関連付けて、データベースの使用方法に関する洞察を得ることができます。

このチュートリアルでは、Redis INFOコマンドによって生成されたデータベースメトリックスをhttps://www.elastic.co/products/logstash[Logstash]を介してElasticsearchにインポートします。 。 これには、定期的にコマンドを実行し、その出力を解析し、すぐにインデックス作成のためにElasticsearchに送信するようにLogstashを構成する必要があります。 インポートされたデータは、後で分析し、Kibanaで視覚化できます。 チュートリアルの終わりまでに、後で分析するためにRedis統計を取り込む自動システムができます。

前提条件

  • 少なくとも4 GBのRAM、ルート権限、およびセカンダリの非ルートアカウントを持つUbuntu 18.04サーバー。 これは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [この初期サーバー設定ガイド]に従って設定できます。 このチュートリアルでは、非ルートユーザーは「++」です。

  • サーバーにインストールされたJava 8。 インストール手順については、https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-ubuntu-18-04#installing-specific-versions-of-openjdk [How Ubuntu 18.04に `+ apt +`でJavaをインストールするには。

  • サーバーにインストールされたNginx。 その方法のガイドについては、https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04 [Ubuntu 18.04にNginxをインストールする方法]を参照してください。

  • サーバーにインストールされているElasticsearchとKibana。 https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elastic-stack-on-ubuntu-18-04 [インストール方法]の最初の2つのステップを完了します。 Elasticsearch、Logstash、およびUbuntu 18.04上のKibana(Elastic Stack)]チュートリアル。

  • DigitalOceanからプロビジョニングされた、接続情報が利用可能なRedis管理データベース。 サーバーのIPアドレスがホワイトリストに登録されていることを確認してください。 DigitalOcean Managed Databasesの詳細については、https://www.digitalocean.com/docs/databases/overview/ [product docs]にアクセスしてください。

  • Redli https://www.digitalocean.com/community/tutorials/how-to-connect-to-managed-database-ubuntuに従ってサーバーにインストール-18-04#connecting-to-a-managed-redis-database [Ubuntu 18.04で管理対象データベースに接続する方法]チュートリアル。

ステップ1-Logstashのインストールと構成

このセクションでは、Logstashをインストールし、Redisデータベースクラスターから統計をプルするように構成し、それらを解析して、インデックス作成のためにElasticsearchに送信します。

次のコマンドでLogstashをインストールすることから始めます。

sudo apt install logstash -y

Logstashをインストールしたら、ブート時にサービスが自動的に開始されるようにします。

sudo systemctl enable logstash

Logstashを構成して統計を取得する前に、データ自体がどのように見えるかを見てみましょう。 Redisデータベースに接続するには、管理されたデータベースコントロールパネルに移動し、*接続の詳細*パネルで、ドロップダウンから*フラグ*を選択します。

image:https://assets.digitalocean.com/articles/redis_elk/step1.png [管理されたデータベースのコントロールパネル]

Redliクライアント用に事前設定されたコマンドが表示されます。このコマンドを使用して、データベースに接続します。 *コピー*をクリックし、サーバーで次のコマンドを実行します。「++」をコピーしたコマンドに置き換えます。

info

このコマンドの出力は長いため、これをさまざまなセクションに分けて説明します。

Redisの `+ info `コマンドの出力では、セクションはコメントを示す `#`でマークされています。 値は ` key:value +`の形式で入力され、比較的解析しやすくなります。

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

. . .

`+ Server `セクションには、RedisビルドのバージョンやベースとなるGitコミットなど、Redisビルドに関する技術情報が含まれています。 一方、 ` Clients +`セクションは現在開かれている接続の数を提供します。

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
. . .

ここで、「+ Memory 」は、Redisがそれ自体に割り当てたRAMの量と、使用できるメモリの最大量を確認します。 メモリが不足し始めると、コントロールパネルで指定した戦略を使用してキーを解放します(この出力の ` maxmemory_policy +`フィールドに表示)。

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
. . .

`+ Persistence `セクションでは、Redisが保存したキーを最後にディスクに保存した時刻と、成功したかどうかを確認できます。 ` Stats +`セクションは、クライアントおよびクラスター内接続に関連する数、要求されたキーが見つかった(または見つからなかった)回数などを提供します。

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
. . .

「+ Replication 」の下にある「 role +」を見ると、プライマリノードに接続しているかレプリカノードに接続しているかがわかります。 セクションの残りの部分では、現在接続されているレプリカの数と、プライマリに関してレプリカに不足しているデータの量を提供します。 接続先のインスタンスがレプリカの場合、追加のフィールドが存在する場合があります。

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

「+ CPU 」の下に、システム( ` used_cpu_sys `)とユーザー( ` used_cpu_user `)のCPU Redisが現在消費している量が表示されます。 ` Cluster `セクションには、Redisクラスターが実行中であることを示すのに役立つ一意のフィールド ` cluster_enabled +`が1つだけ含まれています。

Logstashには、Redisデータベースで定期的に「+ info +」コマンドを実行し(実行した方法と同様)、結果を解析し、Elasticsearchに送信するタスクが割り当てられます。 これで、後でKibanaからそれらにアクセスできるようになります。

ElasticsearchのRedis統計にインデックスを付けるための設定は、Logstashが設定ファイルを保存する「+ / etc / logstash / conf.d 」ディレクトリの下の「 redis.conf +」という名前のファイルに保存します。 サービスとして開始されると、バックグラウンドで自動的に実行されます。

お気に入りのエディター(たとえば、nano)を使用して `+ redis.conf +`を作成します。

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

次の行を追加します。

/etc/logstash/conf.d/redis.conf

input {
   exec {
       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}"
   }
}

「++」を、手順の前半で使用したコントロールパネルに表示されているコマンドに置き換えてください。

収集されたデータで実行されるフィルターのセットである「+ input 」と、フィルターされたデータをElasticsearchに送信する出力を定義します。 入力は、「 exec 」コマンドで構成されます。このコマンドは、設定された「 interval 」時間(秒単位)の後、サーバーで定期的に「 command 」を実行します。 また、Elasticsearchでインデックスを作成するときにドキュメントタイプを定義する「 type 」パラメーターも指定します。 ` exec `ブロックは、2つのフィールド、 ` command `および ` message `文字列を含むオブジェクトを渡します。 ` command `フィールドには実行されたコマンドが含まれ、 ` message +`にはその出力が含まれます。

入力から収集されたデータに対して順次実行される2つのフィルターがあります。 + kv +`フィルターはキー値フィルターの略で、Logstashに組み込まれています。 `+ keyvalue +`の一般的な形式でデータを解析するために使用され、値とフィールドセパレーターと見なされるものを指定するパラメーターを提供します。 フィールドセパレータは、一般形式でフォーマットされたデータを互いに分離する文字列に関係します。 Redis INFOコマンドの出力の場合、フィールドセパレーター( `+ field_split +)は新しい行であり、値セパレーター( + value_split +)は `:`です。 定義されたフォームに従わない行は、コメントを含めて破棄されます。

+ kv +`フィルターを設定するには、 `+:+`を `+ value_split +`パラメーターに渡し、 `+ \ r \ n +(新しい行を示す)を `+ field_split `パラメーターに渡します。 また、現在使用されていないデータが含まれているため、配列の要素として ` remove_field `に渡すことで、現在のデータオブジェクトから ` command `および ` message +`フィールドを削除するように命令します。

`+ kv `フィルターは、設計により文字列(テキスト)タイプとして解析した値を表します。 これは、実際に数字であっても、Kibanaが文字列型を簡単に処理できないために問題を引き起こします。 これを解決するには、可能な場合は、カスタムRubyコードを使用して、数字のみの文字列を数字に変換します。 2番目のフィルターは、実行するコードを含む文字列を受け入れる「 code」パラメーターを提供する「+ ruby​​」ブロックです。

+ event +`はLogstashがコードに提供する変数で、フィルターパイプラインの現在のデータが含まれています。 前述したように、フィルターは次々に実行されます。つまり、Rubyフィルターは解析されたデータを `+ kv +`フィルターから受け取ります。 Rubyコード自体が `+ event +`をハッシュに変換し、キーを走査し、キーに関連付けられた値が整数または浮動小数点(小数を含む数値)として表現できるかどうかを確認します。 可能な場合、文字列値は解析された数値に置き換えられます。 ループが終了すると、進行状況を報告するメッセージ( `+ Rubyフィルター終了+)が出力されます。

出力は、インデックス付けのために処理されたデータをElasticsearchに送信します。 結果のドキュメントは、入力で定義され、パラメーターとして出力ブロックに渡される `+ redis_info +`インデックスに保存されます。

ファイルを保存して閉じます。

`+ apt +`を使用してLogstashをインストールし、Redisから統計を定期的に要求し、処理し、Elasticsearchインスタンスに送信するように設定しました。

ステップ2-Logstash構成のテスト

Logstashを実行して構成をテストし、データが適切にプルされることを確認します。

Logstashは、ファイルパスを `+ -f +`パラメーターに渡すことにより、特定の構成の実行をサポートします。 次のコマンドを実行して、最後の手順の新しい構成をテストします。

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

出力の表示には時間がかかる場合がありますが、すぐに次のようなものが表示されます。

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<main>] 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<main>] pipeline - Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x73adceba run>"}
[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
...

「+ Ruby filter finished +」メッセージが一定の間隔(前のステップで10秒に設定)で印刷されていることがわかります。これは、統計がElasticsearchに送信されていることを意味します。

キーボードの[+ CTRL + C ]をクリックしてLogstashを終了できます。 前述のように、Logstashはサービスとして起動すると、バックグラウンドで ` / etc / logstash / conf.d +`にあるすべての設定ファイルを自動的に実行します。 次のコマンドを実行して起動します。

sudo systemctl start logstash

Logstashを実行して、Redisクラスターに接続してデータを収集できるかどうかを確認しました。 次に、Kibanaの統計データのいくつかを調べます。

ステップ3-Kibanaでインポートされたデータを調べる

このセクションでは、Kibanaでのデータベースのパフォーマンスを説明する統計データを調べて視覚化します。

Webブラウザーで、前提条件の一部としてKibanaを公開したドメインに移動します。 デフォルトのウェルカムページが表示されます。

image:https://assets.digitalocean.com/articles/redis_elk/step3a.png [Kibana-Welcome Page]

LogstashがElasticsearchに送信するデータを調べる前に、最初に `+ redis_info +`インデックスをKibanaに追加する必要があります。 これを行うには、左側の垂直サイドバーから[管理]をクリックし、[キバナ]セクションの下の[インデックスパターン]をクリックします。

image:https://assets.digitalocean.com/articles/redis_elk/step3b.png [Kibana-Index Pattern Creation]

新しい*インデックスパターン*を作成するためのフォームが表示されます。 Kibanaのインデックスパターンは、複数のElasticsearchインデックスからデータを一度にプルする方法を提供し、1つのインデックスのみを探索するために使用できます。

インデックスパターン*テキストフィールドの下に、 `+ redis_info +`インデックスが一覧表示されます。 テキストフィールドに入力し、[*次のステップ]ボタンをクリックします。

その後、タイムスタンプフィールドを選択するように求められるため、後で時間範囲で検索を絞り込むことができます。 Logstashは、 `+ @ timestamp +`と呼ばれる名前を自動的に追加します。 ドロップダウンから選択し、* Create index pattern *をクリックして、Kibanaへのインデックスの追加を完了します。

image:https://assets.digitalocean.com/articles/redis_elk/step3c.png [Kibana-インデックスパターンのタイムスタンプの選択]

既存のビジュアライゼーションを作成して表示するには、左側の垂直メニューの[視覚化]アイテムをクリックします。 次のページが表示されます。

image:https://assets.digitalocean.com/articles/redis_elk/step3d.png [Kibana-Visualizations]

新しいビジュアライゼーションを作成するには、[ビジュアライゼーションを作成]ボタンをクリックし、表示されるタイプのリストから[ライン]を選択します。 次に、データソースとして作成したばかりの `+ redis_info * +`インデックスパターンを選択します。 空の視覚化が表示されます。

image:https://assets.digitalocean.com/articles/redis_elk/step3e.png [Kibana-Empty Visualization]

左側のパネルには、Kibanaが視覚化の描画に使用するパラメーターを編集するためのフォームがあり、画面の中央部分に表示されます。 画面の右上には、日付範囲ピッカーがあります。 ビジュアライゼーションで「+ @ timestamp +」フィールドが使用されている場合、Kibanaは範囲ピッカーで指定された時間間隔に属するデータのみを表示します。

指定した時間間隔でのRedisの平均メモリ使用量を視覚化します。 左側のパネルの* Metrics の下にある Y-Axis をクリックして展開し、 Aggregation として_Average_を選択し、 Field *として `+ used_memory +`を選択します。 これにより、プロットのY軸に平均値が入力されます。

次に、* Buckets の下にある X-Axis をクリックします。 * Aggregation *には、 Date Histogram を選択します。 `+ @ timestamp +`が Field *として自動的に選択されるはずです。 次に、パネル上部の青い再生ボタンをクリックして、視覚化を表示します。 データベースが真新しくて使用されていない場合、非常に長い行は表示されません。 ただし、すべての場合において、平均メモリ使用量の正確な描写が表示されます。 結果の視覚化は、ほとんど使用されないか、まったく使用されない場合があります。

image:https://assets.digitalocean.com/articles/redis_elk/step3f.png [Kibana-Redis Memory Usage Visualization]

このステップでは、Kibanaを使用して、管理対象Redisデータベースのメモリ使用量を視覚化しました。 Visual Builderなど、Kibanaが提供する他のプロットタイプを使用して、同時に複数のフィールドを描写するより複雑なグラフを作成することもできます。 これにより、データベースがどのように使用されているかをより深く理解できるようになり、クライアントアプリケーションとデータベース自体の最適化に役立ちます。

結論

これで、Elastic Stackがサーバーにインストールされ、マネージドRedisデータベースから定期的に統計データをプルするように設定されました。 Kibanaまたはその他の適切なソフトウェアを使用してデータを分析および視覚化できます。これにより、データベースのパフォーマンスに関する貴重な洞察と現実の相関を収集できます。

Redis Managed Databaseでできることの詳細については、https://www.digitalocean.com/docs/databases/redis/ [product docs]にアクセスしてください。 別の種類の視覚化を使用してデータベースの統計情報を表示する場合は、https://www.elastic.co/guide/en/kibana/current/tutorial-visualizing.html [Kibana docs]で詳細な手順を確認してください。