如何使用 Elastic Stack 在 Ubuntu 18.04 上分析受管理的 Redis 資料庫統計資料

作者選擇了自由開源基金作為為捐贈而寫計劃的捐贈對象。

介紹

數據庫監控是持續不斷地系統地跟蹤各種指標,顯示數據庫的性能如何。通過觀察性能數據,您可以獲得有價值的見解,並識別可能的瓶頸,以及找到改善數據庫性能的其他方法。這些系統通常實現警報功能,當事情出錯時通知管理員。收集的統計數據不僅可以用於改善數據庫的配置和工作流程,還可以用於客戶端應用程序。

使用Elastic Stack(ELK堆棧)來監控您的管理數據庫的好處在於它出色的搜索支持和快速載入新數據的能力。它在更新數據方面表現不佳,但這種折衷對於監控和記錄目的是可以接受的,因為過去的數據幾乎不會更改。 Elasticsearch 提供了一種強大的查詢數據的方法,您可以通過 Kibana 使用它來更好地了解數據庫在不同時間段的表現。這將允許您將數據庫負載與現實事件相關聯,以獲得有關數據庫使用方式的洞察。

在本教程中,您將通過 Logstash 將由Redis INFO 命令生成的數據庫指標導入Elasticsearch。這涉及配置Logstash定期運行該命令,解析其輸出,並立即將其發送到Elasticsearch進行索引。導入的數據稍後可以在Kibana中進行分析和可視化。在本教程結束時,您將擁有一個自動化系統,用於拉取Redis統計信息以供以後分析。

先決條件

步驟1 — 安裝和配置 Logstash

在這一部分,您將安裝 Logstash 並將其配置為從您的 Redis 數據庫集群中提取統計信息,然後將其解析並發送到 Elasticsearch 進行索引。

首先使用以下命令安裝 Logstash:

  1. sudo apt install logstash -y

安裝 Logstash 後,啟用服務以在啟動時自動啟動:

  1. sudo systemctl enable logstash

在配置 Logstash 以提取統計信息之前,讓我們看看數據本身的樣子。要連接到您的 Redis 數據庫,請前往您的托管數據庫控制面板,在連接詳情面板下,從下拉菜單中選擇標誌

您將看到一個預配置的命令用於 Redli 客戶端,您將使用它來連接到您的數據庫。單擊 複製,並在您的服務器上運行以下命令,將redli_flags_command 替換為您剛剛複製的命令:

  1. redli_flags_command info

由於此命令的輸出很長,我們將解釋它分解為不同的部分。

在 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

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

添加以下行:

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

记得用控制面板中显示的命令替换 redis_flags_command

您定義了一個input,這是一組將在收集的數據上運行的過濾器,以及一個將過濾後的數據發送到Elasticsearch的輸出。輸入由exec命令組成,該命令將定期在服務器上運行一個command,在設定的時間interval(以秒為單位)後運行。它還指定了一個type參數,該參數在將文檔索引到Elasticsearch時定義文檔類型。 exec塊傳遞包含兩個字段的對象,commandmessage字符串。 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參數來運行特定配置。運行以下命令來測試您上一步的新配置:

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

顯示輸出可能需要一些時間,但很快您將看到類似以下的內容:

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

您將看到Ruby filter finished消息以固定間隔(在上一步中設置為10秒)被打印出來,這意味著統計信息正在發送到Elasticsearch。

您可以通過在鍵盤上按CTRL + C退出Logstash。如前所述,當作為服務啟動時,Logstash將自動在/etc/logstash/conf.d下運行找到的所有配置文件。運行以下命令來啟動它:

  1. sudo systemctl start logstash

您已运行 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 文檔 以獲得進一步的說明。

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