介紹
數據庫監控是持續不斷地系統地跟蹤各種指標,顯示數據庫的性能如何。通過觀察性能數據,您可以獲得有價值的見解,並識別可能的瓶頸,以及找到改善數據庫性能的其他方法。這些系統通常實現警報功能,當事情出錯時通知管理員。收集的統計數據不僅可以用於改善數據庫的配置和工作流程,還可以用於客戶端應用程序。
使用Elastic Stack(ELK堆棧)來監控您的管理數據庫的好處在於它出色的搜索支持和快速載入新數據的能力。它在更新數據方面表現不佳,但這種折衷對於監控和記錄目的是可以接受的,因為過去的數據幾乎不會更改。 Elasticsearch 提供了一種強大的查詢數據的方法,您可以通過 Kibana 使用它來更好地了解數據庫在不同時間段的表現。這將允許您將數據庫負載與現實事件相關聯,以獲得有關數據庫使用方式的洞察。
在本教程中,您將通過 Logstash 將由Redis INFO 命令生成的數據庫指標導入Elasticsearch。這涉及配置Logstash定期運行該命令,解析其輸出,並立即將其發送到Elasticsearch進行索引。導入的數據稍後可以在Kibana中進行分析和可視化。在本教程結束時,您將擁有一個自動化系統,用於拉取Redis統計信息以供以後分析。
先決條件
- 一個擁有至少8 GB RAM、根權限和次要非根帳戶的Ubuntu 18.04伺服器。您可以按照這個初始伺服器設置指南進行設置。在本教程中,非根用戶是
sammy
。 - 在您的伺服器上安裝Java 8。有關安裝說明,請訪問在Ubuntu 18.04上使用
apt
安裝Java的方法,並按照第一步中概述的命令執行。您不需要安裝Java開發工具包(JDK)。 - 在您的伺服器上安裝Nginx。有關如何執行此操作的指南,請參閱在Ubuntu 18.04上安裝Nginx的方法教程。
- 在您的伺服器上安裝Elasticsearch和Kibana。完成在Ubuntu 18.04上安裝Elasticsearch、Logstash和Kibana(Elastic Stack)的方法教程的前兩個步驟。
- A Redis managed database provisioned from DigitalOcean with connection information available. Make sure that your server’s IP address is on the whitelist. For a guide on creating a Redis database using the DigitalOcean Control Panel, visit the Redis Quickstart guide.
- 根據在Ubuntu 18.04上連接到托管數據庫的方法教程,在您的伺服器上安裝Redli。
步驟1 — 安裝和配置 Logstash
在這一部分,您將安裝 Logstash 並將其配置為從您的 Redis 數據庫集群中提取統計信息,然後將其解析並發送到 Elasticsearch 進行索引。
首先使用以下命令安裝 Logstash:
安裝 Logstash 後,啟用服務以在啟動時自動啟動:
在配置 Logstash 以提取統計信息之前,讓我們看看數據本身的樣子。要連接到您的 Redis 數據庫,請前往您的托管數據庫控制面板,在連接詳情面板下,從下拉菜單中選擇標誌:
您將看到一個預配置的命令用於 Redli 客戶端,您將使用它來連接到您的數據庫。單擊 複製,並在您的服務器上運行以下命令,將redli_flags_command
替換為您剛剛複製的命令:
由於此命令的輸出很長,我們將解釋它分解為不同的部分。
在 Redis info
命令的輸出中,部分用 #
標記,表示注釋。值以 key:value
的形式填充,這使它們相對容易解析。
Server
部分包含有关 Redis 构建的技术信息,例如其版本和基于的 Git 提交,而 Clients
部分提供当前打开连接的数量。
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
确认了 Redis 为自身分配了多少 RAM,以及它可能使用的最大内存量。如果开始内存不足,它将使用您在控制面板中指定的策略释放键(显示在此输出中的 maxmemory_policy
字段中)。
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
...
在 Persistence
部分,您可以看到 Redis 上次将其存储的键保存到磁盘的时间,以及是否成功。 Stats
部分提供与客户端和集群连接相关的数字,请求的键被找到(或未找到)的次数等等。
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
...
通过查看 Replication
下的 role
,您将知道是否连接到主节点或副本节点。该部分的其余部分提供了当前连接的副本数以及副本在与主节点相比缺少的数据量。如果您连接的实例是副本,则可能会有其他字段。
注意: Redis 项目在其文档和各种命令中使用“主”和“从”这些术语。DigitalOcean 通常更喜欢替代术语“主”和“副本”。本指南将尽可能使用“主”和“副本”这些术语,默认情况下,但请注意,在某些情况下,“主”和“从”这些术语不可避免地会出现。
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
...
在 CPU
下,您将看到 Redis 当前正在消耗的系统 (used_cpu_sys
) 和用户 (used_cpu_user
) CPU 力量的数量。Cluster
部分只包含一个唯一字段,cluster_enabled
,用于指示 Redis 集群是否正在运行。
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
# 错误统计
# 集群
cluster_enabled:0
# Keyspace
Logstash 将被委托定期在您的 Redis 数据库上运行 info
命令(类似于您刚才所做的),解析结果,并将其发送到 Elasticsearch。然后,您将能够稍后从 Kibana 访问它们。
您将在名为 /etc/logstash/conf.d
的目录下的文件 redis.conf
中存储将 Redis 统计信息索引到 Elasticsearch 的配置,其中 Logstash 存储配置文件。当作为服务启动时,它将自动在后台运行它们。
使用您喜欢的编辑器(例如 nano)创建 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}"
}
}
记得用控制面板中显示的命令替换 redis_flags_command
。
您定義了一個input
,這是一組將在收集的數據上運行的過濾器,以及一個將過濾後的數據發送到Elasticsearch的輸出。輸入由exec
命令組成,該命令將定期在服務器上運行一個command
,在設定的時間interval
(以秒為單位)後運行。它還指定了一個type
參數,該參數在將文檔索引到Elasticsearch時定義文檔類型。 exec
塊傳遞包含兩個字段的對象,command
和message
字符串。 command
字段將包含運行的命令,而message
將包含其輸出。
有兩個過濾器將依次運行在從輸入收集的數據上。 kv
過濾器代表鍵值過濾器,內置於Logstash中。它用於解析一般形式的數據keyvalue_separatorvalue
,並提供了參數來指定什麼被認為是值和字段分隔符。字段分隔符指的是將數據格式化為一般形式的字符串之間的字符串。對於Redis INFO命令的輸出,字段分隔符(field_split
)是一個新行,值分隔符(value_split
)是:
。不符合定義形式的行將被丟棄,包括註釋。
要配置 kv
过滤器,您将 :
传递给 value_split
参数,并将 \r\n
(表示换行)传递给 field_split
参数。您还要求将 command
和 message
字段从当前数据对象中删除,方法是将它们作为数组的元素传递给 remove_field
,因为它们包含现在无用的数据。
kv
过滤器通过设计将其解析的值表示为字符串(文本)类型。这带来了一个问题,因为即使它实际上是一个数字,Kibana也无法轻松处理字符串类型。为了解决这个问题,您将使用自定义的Ruby代码将仅包含数字的字符串转换为数字(如果可能的话)。第二个过滤器是一个 ruby
块,提供了一个接受包含要运行的代码的字符串的 code
参数。
event
是Logstash提供给您的代码的一个变量,其中包含过滤器管道中的当前数据。如前所述,过滤器依次运行,这意味着Ruby过滤器将接收来自 kv
过滤器的解析数据。Ruby代码本身将 event
转换为哈希,并遍历键,然后检查与键关联的值是否可以表示为整数或浮点数(带有小数的数字)。如果可以,将字符串值替换为解析后的数字。循环完成时,它打印出一条消息( Ruby filter finished
)以报告进度。
輸出將處理後的數據發送到Elasticsearch進行索引。結果文件將存儲在redis_info
索引中,該索引在輸入中被定義並作為參數傳遞給輸出塊。
保存並關閉文件。
您已使用apt
安裝了Logstash並將其配置為定期從Redis請求統計信息,處理這些信息,並將其發送到您的Elasticsearch實例。
步驟2 — 測試Logstash配置
現在,您將運行Logstash來測試配置,以確保它可以正確地提取數據。
Logstash支持通過將其文件路徑傳遞給-f
參數來運行特定配置。運行以下命令來測試您上一步的新配置:
顯示輸出可能需要一些時間,但很快您將看到類似以下的內容:
OutputUsing 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
...
您將看到Ruby filter finished
消息以固定間隔(在上一步中設置為10秒)被打印出來,這意味著統計信息正在發送到Elasticsearch。
您可以通過在鍵盤上按CTRL + C
退出Logstash。如前所述,當作為服務啟動時,Logstash將自動在/etc/logstash/conf.d
下運行找到的所有配置文件。運行以下命令來啟動它:
您已运行 Logstash 检查其是否可以连接到您的 Redis 集群并收集数据。接下来,您将在 Kibana 中探索一些统计数据。
步骤 3 — 在 Kibana 中探索导入的数据
在本节中,您将探索并可视化描述数据库性能的统计数据。
在您的网络浏览器中,导航至您暴露 Kibana 的域名,作为先决条件的一部分。您将看到默认的欢迎页面:
在探索 Logstash 发送到 Elasticsearch 的数据之前,您首先需要将 redis_info
索引添加到 Kibana。为此,请首先从欢迎页面中选择 自行探索,然后打开左上角的汉堡菜单。在 分析 下,单击 发现。
然后,Kibana 将提示您创建新的索引模式:
按下 创建索引模式。您将看到一个创建新的 索引模式 的表单。Kibana 中的索引模式提供了一种同时从多个 Elasticsearch 索引中提取数据的方式,并且可以用来探索仅一个索引。
在右側,Kibana 列出了所有可用的索引,如 redis_info
,這是您已配置 Logstash 使用的。在名稱文本字段中輸入它,並從下拉菜單中選擇 @timestamp
作為時間戳字段。完成後,按下下方的創建索引模式按鈕。
要創建並查看現有的可視化,請打開漢堡菜單。在分析下,選擇儀表板。加載後,按下創建可視化開始創建新的可視化:
左側面板提供了 Kibana 可用來繪製可視化的值列表,該列表將顯示在屏幕中央部分。在屏幕右上角是日期範圍選擇器。如果在可視化中使用了@timestamp
字段,Kibana 將僅顯示屬於範圍選擇器中指定的時間間隔的數據。
從頁面的主部下拉菜單中,在線條和區域部分下選擇線條。然後,在左側列表中找到used_memory
字段並將其拖動到中央部分。您將很快看到一條關於時間的用量中位數的線條可視化:
在右側,您可以配置水平和垂直軸的處理方式。在那裡,您可以通過按下所示的軸來將垂直軸設置為顯示平均值而不是中位數:
您可以選擇不同的函數,或提供您自己的函數:
圖形將立即使用更新的值刷新。
在這一步中,您已經使用 Kibana 可視化了您管理的 Redis 數據庫的內存使用情況。這將使您能夠更好地了解您的數據庫的使用情況,進而幫助您優化客戶端應用程序以及數據庫本身。
結論
您現在已經在您的服務器上安裝了 Elastic 堆棧並配置為定期從您管理的 Redis 數據庫中提取統計數據。您可以使用 Kibana 或其他適合的軟件來分析和可視化數據,這將幫助您獲得有關您的數據庫表現的寶貴見解和現實世界的相關性。
有關您可以如何使用 Redis 托管數據庫的更多信息,請訪問 產品文檔。如果您想使用其他可視化類型呈現數據庫統計信息,請查看 Kibana 文檔 以獲得進一步的說明。