Как анализировать статистику управляемой базы данных Redis с помощью Elastic Stack на Ubuntu 18.04

Автор выбрал Фонд свободного и открытого исходного кода для получения пожертвования в рамках программы Пиши ради Пожертвований.

Введение

Мониторинг баз данных – это непрерывный процесс систематического отслеживания различных метрик, показывающих, как выполняется база данных. Наблюдая за данными о производительности, вы можете получить ценные знания и выявить возможные узкие места, а также найти дополнительные способы улучшения производительности базы данных. Такие системы часто реализуют уведомления, которые информируют администраторов, когда что-то идет не так. Собранные статистические данные могут быть использованы не только для улучшения конфигурации и рабочего процесса базы данных, но и для клиентских приложений.

Польза использования стека Elastic (ELK stack) для мониторинга вашей управляемой базы данных заключается в его отличной поддержке поиска и возможности быстрого приема новых данных. Он не отличается в обновлении данных, но этот компромисс приемлем для целей мониторинга и ведения журналов, где прошлые данные почти никогда не изменяются. Elasticsearch предлагает мощное средство запросов к данным, которое вы можете использовать через Kibana, чтобы лучше понимать, как база данных справляется с разными временными периодами. Это позволит вам коррелировать нагрузку базы данных с реальными событиями, чтобы получить представление о том, как используется база данных.

В этом руководстве вы будете импортировать метрики базы данных, созданные командой INFO Redis, в Elasticsearch через Logstash. Для этого необходимо настроить 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

Поскольку вывод этой команды длинный, мы разберем его на части.

В выводе команды info Redis разделы помечены символом #, что означает комментарий. Значения заполняются в форме ключ:значение, что делает их относительно легкими для разбора.

Раздел 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 для себя, а также максимальное количество памяти, которое он может использовать. Если он начнет исчерпывать память, он будет освобождать ключи, используя стратегию, указанную в Панели управления (показанной в поле 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 ...

Глядя на role в разделе Replication, вы узнаете, подключены ли вы к основному или реплицирующему узлу. Остальная часть раздела предоставляет количество в настоящее время подключенных реплик и количество данных, которых не хватает реплике по сравнению с основным. Могут быть дополнительные поля, если экземпляр, к которому вы подключены, является репликой.

Примечание: В проекте Redis в документации и в различных командах используются термины «мастер» и «слейв». DigitalOcean в целом предпочитает альтернативные термины «primary» и «replica». В данном руководстве будут использоваться термины «primary» и «replica», когда это возможно, но обратите внимание, что есть несколько случаев, когда термины «мастер» и «слейв» невозможно избежать.

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 вы увидите количество системных (used_cpu_sys) и пользовательских (used_cpu_user) ресурсов ЦП, которые в данный момент потребляет Redis. Раздел 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 будет периодически запускать команду info на вашей базе данных Redis (подобно тому, как вы только что сделали), парсить результаты и отправлять их в Elasticsearch. Затем вы сможете получить к ним доступ из Kibana.

Вы будете хранить конфигурацию для индексации статистики Redis в Elasticsearch в файле с именем redis.conf в каталоге /etc/logstash/conf.d, где Logstash хранит файлы конфигурации. При запуске в качестве службы он автоматически будет выполнять их в фоновом режиме.

Создайте файл redis.conf с помощью вашего любимого редактора (например, nano):

  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, который является набором фильтров, которые будут запущены на собранных данных, и output, который отправит отфильтрованные данные в Elasticsearch. Вход состоит из команды exec, которая будет выполняться на сервере периодически, после установленного времени interval (выраженного в секундах). Он также определяет параметр type, который определяет тип документа при индексации в Elasticsearch. Блок exec передает объект, содержащий два поля: command и строку message. Поле command будет содержать выполненную команду, а message – ее вывод.

Есть два фильтра, которые будут последовательно выполняться на данных, собранных из ввода. Фильтр kv означает фильтр ключ-значение и встроен в Logstash. Он используется для разбора данных в общем виде ключразделитель_значениязначение и предоставляет параметры для указания, что считается разделителями значения и поля. Разделитель поля относится к строкам, разделяющим данные, отформатированные в общем виде, друг от друга. В случае вывода команды Redis INFO разделитель поля (field_split) – это новая строка, а разделитель значения (value_split) – :. Строки, не соответствующие определенной форме, будут отброшены, включая комментарии.

Для настройки фильтра kv вы передаёте параметру value_split значение :, а параметру field_split\r\n (обозначающий новую строку). Также вы указываете удалить поля command и message из текущего объекта данных, передав их в remove_field как элементы массива, потому что они содержат данные, которые теперь бесполезны.

Фильтр kv по умолчанию представляет разобранные значения как строковый (текстовый) тип, что вызывает проблемы, поскольку Kibana не может легко обрабатывать строковые типы, даже если на самом деле это число. Для решения этой проблемы вы будете использовать собственный Ruby-код для преобразования строк, содержащих только числа, в числа, где это возможно. Второй фильтр – это блок ruby, который предоставляет параметр code, принимающий строку, содержащую код, который нужно выполнить.

event – это переменная, которую Logstash предоставляет вашему коду, и содержит текущие данные в конвейере фильтров. Как отмечалось ранее, фильтры выполняются один за другим, что означает, что фильтр Ruby получит разобранные данные от фильтра kv. Сам Ruby-код преобразует event в хэш и проходит по ключам, затем проверяет, может ли значение, связанное с ключом, быть представлено как целое число или как число с плавающей точкой (число с десятичной частью). Если это возможно, строковое значение заменяется разобранным числом. По завершении цикла выводится сообщение (Ruby filter finished) для отчёта о выполненном прогрессе.

Выходные данные отправляются в Elasticsearch для индексации. Результирующий документ будет сохранен в индексе redis_info, определенном во входных данных и переданном как параметр в блок вывода.

Сохраните и закройте файл.

Вы установили Logstash с использованием apt и настроили его на периодический запрос статистики из 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.

Вы можете выйти из Logstash, нажав CTRL + C на клавиатуре. Как упоминалось ранее, Logstash автоматически запускает все файлы конфигурации, найденные в каталоге /etc/logstash/conf.d, в фоновом режиме при запуске в качестве службы. Запустите следующую команду, чтобы запустить его:

  1. sudo systemctl start logstash

Вы запустили Logstash, чтобы проверить, может ли он подключиться к вашему кластеру Redis и собирать данные. Затем вы исследуете некоторые статистические данные в Kibana.

Шаг 3 — Исследование импортированных данных в Kibana

В этом разделе вы исследуете и визуализируете статистические данные, описывающие производительность вашей базы данных в Kибана.

В вашем веб-браузере перейдите на свой домен, где вы открыли Kibana как часть предварительных требований. Вы увидите стандартную приветственную страницу:

Прежде чем исследовать данные, которые Logstash отправляет в Elasticsearch, вам сначала нужно добавить индекс redis_info в Kibana. Для этого сначала выберите Исследовать самостоятельно на приветственной странице, а затем откройте меню гамбургера в верхнем левом углу. Под Аналитика нажмите на Поиск.

Затем Kibana попросит вас создать новый шаблон индекса:

Нажмите Создать шаблон индекса. Вы увидите форму для создания нового Шаблона индекса. Шаблоны индексов в Kибана предоставляют возможность извлекать данные из нескольких индексов Elasticsearch одновременно и могут использоваться для исследования только одного индекса.

Справа в Kibana перечисляются все доступные индексы, такие как redis_info, которые вы настроили для использования Logstash. Введите это в поле текста Name и выберите @timestamp из выпадающего списка как Поле времени. Когда закончите, нажмите кнопку Создать шаблон индекса ниже.

Для создания и просмотра существующих визуализаций откройте гамбургер-меню. В разделе Аналитика выберите Панель инструментов. Когда загрузится, нажмите на Создать визуализацию, чтобы начать создание новой:

Левая панель предоставляет список значений, которые Kibana может использовать для построения визуализации, которая будет отображаться в центральной части экрана. В верхнем правом углу экрана находится средство выбора диапазона дат. Если визуализация использует поле @timestamp, Kibana будет показывать только данные, принадлежащие временному интервалу, указанному в средстве выбора диапазона.

Из выпадающего списка на главной части страницы выберите Линия в разделе Линия и область. Затем найдите поле used_memory в списке слева и перетащите его в центральную часть. Вы скоро увидите визуализацию линии медианного объема использованной памяти во времени:

Справа вы можете настроить обработку горизонтальной и вертикальной осей. Там вы можете установить вертикальную ось для отображения средних значений вместо медианы, нажав на показанную ось:

Вы можете выбрать другую функцию или указать свою:

График будет немедленно обновлен с обновленными значениями.

На этом этапе вы визуализировали использование памяти вашей управляемой базы данных Redis с помощью Kibana. Это позволит вам лучше понять, как используется ваша база данных, что поможет вам оптимизировать клиентские приложения, а также саму базу данных.

Заключение

Теперь у вас установлен стек 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