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

Автор выбралFree and Open Source Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

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

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

В этом руководстве вы импортируете метрики базы данных, созданные командой RedisINFO, в Elasticsearch черезLogstash. Это влечет за собой настройку Logstash для периодического запуска команды, анализа ее выходных данных и отправки их в Elasticsearch для индексации сразу после этого. Импортированные данные могут быть позже проанализированы и визуализированы в Кибане. К концу учебника у вас будет автоматизированная система сбора статистики Redis для последующего анализа.

Предпосылки

  • Сервер Ubuntu 18.04 с ОЗУ не менее 4 ГБ, привилегиями root и вторичной учетной записью без полномочий root. Вы можете настроить это, выполнивthis initial server setup guide. В этом руководстве пользователь без полномочий root -sammy.

  • Java 8 установлена ​​на вашем сервере. Для получения инструкций по установке посетитеHow To Install Java with apt on Ubuntu 18.04.

  • Nginx установлен на вашем сервере. Чтобы узнать, как это сделать, см.How To Install Nginx on Ubuntu 18.04.

  • Elasticsearch и Kibana установлены на вашем сервере. Выполните первые два шага руководстваHow To Install Elasticsearch, Logstash, and Kibana (Elastic Stack) on Ubuntu 18.04.

  • Управляемая база данных Redis, предоставленная DigitalOcean, с доступной информацией о соединении. Убедитесь, что IP-адрес вашего сервера находится в белом списке. Чтобы узнать больше об управляемых базах данных DigitalOcean, посетитеproduct docs.

  • Redli установлен на вашем сервере согласно руководствуHow To Connect to a Managed Database on Ubuntu 18.04.

[[step-1 -—- install-and-configuring-logstash]] == Шаг 1. Установка и настройка Logstash

В этом разделе вы установите Logstash и сконфигурируете его для получения статистики из кластера базы данных Redis, а затем проанализируете ее для отправки в Elasticsearch для индексации.

Начните с установки Logstash с помощью следующей команды:

sudo apt install logstash -y

После установки Logstash включите службу для автоматического запуска при загрузке:

sudo systemctl enable logstash

Прежде чем настраивать Logstash для получения статистики, давайте посмотрим, как выглядят сами данные. Чтобы подключиться к базе данных Redis, перейдите в панель управления управляемой базой данных и под панельюConnection details выберитеFlags из раскрывающегося списка:

Managed Database Control Panel

Вам будет показана предварительно настроенная команда для клиентаRedli, которую вы будете использовать для подключения к своей базе данных. ЩелкнитеCopy и выполните следующую команду на своем сервере, заменивredli_flags_command на команду, которую вы только что скопировали:

redli_flags_command info

Поскольку выходные данные этой команды длинные, мы объясним это с разбивкой по различным разделам:

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

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

Посмотрев наrole подReplication, вы узнаете, подключены ли вы к первичному узлу или к реплике. В оставшейся части раздела приводится количество подключенных в данный момент реплик и объем данных, которых нет у реплики в отношении первичной. Могут быть дополнительные поля, если экземпляр, к которому вы подключены, является репликой.

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

Logstash будет поручено периодически запускать командуinfo в вашей базе данных Redis (аналогично тому, как вы только что это сделали), анализировать результаты и отправлять их в Elasticsearch. Затем вы сможете получить к ним доступ позже из Кибаны.

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

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

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 передает объект, содержащий два поля,command иmessage строку. Полеcommand будет содержать команду, которая была запущена, аmessage будет содержать ее вывод.

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

Чтобы настроить фильтрkv, вы передаете: параметру `value_split`, а (обозначающий новую строку) параметруfield_split. Вы также приказываете ему удалить поля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.

[[step-2 -—- testing-the-logstash-configuration]] == Шаг 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
] 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 ...

Вы увидите, что сообщениеRuby filter finished печатается с регулярными интервалами (на предыдущем шаге было установлено 10 секунд), что означает, что статистика отправляется в Elasticsearch.

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

sudo systemctl start logstash

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

[[шаг-3 -—- исследование-импортированные-данные-в-кибане]] == Шаг 3 - Изучение импортированных данных в кибане

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

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

Kibana - Welcome Page

Прежде чем изучать данные, которые Logstash отправляет в Elasticsearch, вам сначала нужно добавить индексredis_info в Kibana. Для этого щелкнитеManagement на левой вертикальной боковой панели, а затем наIndex Patterns в разделеKibana.

Kibana - Index Pattern Creation

Вы увидите форму для создания новогоIndex Pattern. Шаблоны индексов в Kibana предоставляют способ извлечения данных из нескольких индексов Elasticsearch одновременно и могут использоваться для изучения только одного индекса.

Под текстовым полемIndex pattern вы увидите список индексаredis_info. Введите его в текстовое поле и нажмите кнопкуNext step.

Затем вас попросят выбрать поле для отметки времени, чтобы позже вы могли сузить область поиска по диапазону времени. Logstash автоматически добавляет единицу с именем@timestamp. Выберите его в раскрывающемся списке и нажмитеCreate index pattern, чтобы завершить добавление индекса в Kibana.

Kibana - Index Pattern Timestamp Selection

Чтобы создать и просмотреть существующие визуализации, щелкните элементVisualize в левом вертикальном меню. Вы увидите следующую страницу:

Kibana - Visualizations

Чтобы создать новую визуализацию, нажмите кнопкуCreate a visualization, затем выберитеLine из всплывающего списка типов. Затем выберите шаблон индексаredis_info*, который вы только что создали, в качестве источника данных. Вы увидите пустую визуализацию:

Kibana - Empty Visualization

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

Теперь вы будете визуализировать среднее использование памяти Redis за указанный промежуток времени. ЩелкнитеY-Axis подMetrics на панели слева, чтобы развернуть его, затем выберитеAverage какAggregation и выберитеused_memory какFieldс. Это заполнит ось Y графика средними значениями.

Затем щелкнитеX-Axis подBuckets. ДляAggregation выберитеDate Histogram. @timestamp должен автоматически выбираться какField. Затем покажите визуализацию, нажав синюю кнопку воспроизведения в верхней части панели. Если ваша база данных является новой и не используется, вы не увидите очень длинную строку. Однако во всех случаях вы увидите точное представление о среднем использовании памяти. Вот как может выглядеть полученная визуализация после небольшого или бесполезного использования:

Kibana - Redis Memory Usage Visualization

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

Заключение

Теперь на вашем сервере установлен стек Elastic, настроенный на регулярное получение статистических данных из управляемой базы данных Redis. Вы можете анализировать и визуализировать данные с помощью Kibana или другого подходящего программного обеспечения, которое поможет вам собрать ценные сведения и реальные корреляции в том, как работает ваша база данных.

Для получения дополнительной информации о том, что вы можете делать с вашей управляемой базой данных Redis, посетитеproduct docs. Если вы хотите представить статистику базы данных с помощью другого типа визуализации, просмотритеKibana docs для получения дальнейших инструкций.

Related