Если вам нужна быстродействующая нереляционная СУБД типа «ключ-значение», то, возможно, подойдет Redis (Remote Dictionary Server). На базе Redis можно создать не только хранилище данных, но и кэш, брокер сообщений, а также очередь. Для увеличения отказоустойчивости можно настроить репликацию данных между серверами Redis.
Быстродействие Redis обеспечивается хранением данных в оперативной памяти, но вместе с тем имеется возможность постоянного хранения наборов данных на диске.
Когда вы создаете на базе Redis приложения, критичные для работоспособности вашего бизнеса, необходимо позаботиться о мониторинге сервиса Redis.
В этой статье мы расскажем о том, как установить Redis в ОС Debian 11, а также как контролировать этот сервис вручную и с помощью Zabbix.
Установка Redis
На сайте Redis есть инструкции по установке сервиса Redis для различных ОС. Для Linux ее можно найти здесь.
Что касается ОС Debian 11, то после обновления пакетов установите Redis командой apt install
:
# apt update
# apt upgrade
# apt install redis-server
Соблюдайте осторожность при обновлении пакетов командой upgrade
, так как в результате обновления могут измениться конфигурационные файлы установленных ранее сервисов. Особенно это важно, если на сервере установлена панель ISPmanager.
Для Redis лучше всего использовать отдельный сервер или выделенную виртуальную машину.
После установки убедитесь, что сервис запустился и находится в состоянии enabled:
# systemctl status redis.service
Далее проверьте конфигурацию Redis, которая находится в файле /etc/redis/redis.conf
, и при необходимости внесите нужные вам изменения. Затем перезапустите Redis:
# systemctl restart redis.service
Контроль сервиса Redis вручную
Ручной мониторинг Redis основан на использование следующей команды:
# redis-cli info
Команда выведет на консоль обширную информацию, разделенную на группы. Ниже эта информация показана в сокращенном виде:
# Server
redis_version:5.0.3
…
redis_mode:standalone
os:Linux 4.19.0-11-amd64 x86_64
arch_bits:64
…
process_id:3986
run_id:d354fb032bac0445485be25f55710c900daf4ad9
tcp_port:6379
uptime_in_seconds:59368613
uptime_in_days:687
…
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf
# Clients
connected_clients:82
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
# Memory
used_memory:23387080
used_memory_human:22.30M
used_memory_rss:44687360
used_memory_rss_human:42.62M
used_memory_peak:206291712
used_memory_peak_human:196.74M
used_memory_peak_perc:11.34%
used_memory_overhead:2276036
used_memory_startup:795736
used_memory_dataset:21111044
used_memory_dataset_perc:93.45%
…
total_system_memory:4138094592
total_system_memory_human:3.85G
…
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
…
mem_fragmentation_ratio:1.92
mem_fragmentation_bytes:21363176
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:1453148
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0
# Persistence
loading:0
rdb_changes_since_last_save:56
rdb_bgsave_in_progress:0
rdb_last_save_time:1660722010
rdb_last_bgsave_status:ok
…
# Stats
total_connections_received:592956
total_commands_processed:64503252
instantaneous_ops_per_sec:0
total_net_input_bytes:6462728424
total_net_output_bytes:26606657346051
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:6172
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:26183280
keyspace_misses:10725946
…
# Replication
role:master
connected_slaves:0
…
# CPU
used_cpu_sys:136409.578771
used_cpu_user:118724.185933
used_cpu_sys_children:15802.501500
used_cpu_user_children:21458.693155
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=419,expires=177,avg_ttl=331436823
Если вас интересуют данные только из одного блока, например, из блока Stats, добавьте к команде название блока параметров:
# redis-cli info stats
# Stats
total_connections_received:592959
total_commands_processed:64503957
instantaneous_ops_per_sec:5
total_net_input_bytes:6462785619
total_net_output_bytes:26606733572570
instantaneous_input_kbps:0.42
instantaneous_output_kbps:72.33
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:6172
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:26183458
keyspace_misses:10726043
…
Описание метрик можно найти здесь. Хорошую инструкцию с описанием, какие метрики необходимо отслеживать, есть на сайте.
Оценка объема памяти
Прежде всего, оцените объем памяти, выделенной для Redis:
# redis-cli INFO memory | grep used_memory
Вы увидите на консоли метрики, имеющие отношение к использованию памяти:
used_memory:23370400
used_memory_human:22.29M
used_memory_rss:42045440
used_memory_rss_human:40.10M
used_memory_peak:206291712
used_memory_peak_human:196.74M
used_memory_peak_perc:11.33%
used_memory_overhead:2260122
used_memory_startup:795736
used_memory_dataset:21110278
used_memory_dataset_perc:93.51%
used_memory_lua:41984
used_memory_lua_human:41.00K
used_memory_scripts:0
used_memory_scripts_human:0B
Параметр used_memory_human сообщает общее количество памяти, занятой сервисом Redis для хранения данных. Из-за фрагментации памяти это значение будет отличаться от объема памяти, выделенной для Redis операционной системой.
Метрика used_memory_peak_human показывает максимальное значение памяти, занимаемой Redis.
В любом случае для исключения свопинга нужно следить, чтобы объем памяти, выделенной для Redis, не превышал общий объем памяти, доступной на сервере.
Доступный объем памяти можно узнать так:
# redis-cli INFO | grep total_system_memory_human
total_system_memory_human:3.85G
Проверка фрагментации памяти
Оцените отношение параметров used_memory_rss_human и used_memory_human. Первая из этих метрик определяет объем памяти, выделенной ОС для Redis (RSS означает Resident Set Size). Вторая метрика, used_memory_human, содержит объем памяти, используемый Redis для хранения данных.
Фрагментацию памяти можно определить следующей командой:
# redis-cli INFO | grep mem_fragmentation_ratio
mem_fragmentation_ratio:1.82
Значение фрагментации, превышающее 1.5, может привести к перерасходу памяти. Чтобы исправить ситуацию, можно перезапустить Redis. Если же это значение меньше единицы, то для Redis не хватает оперативной памяти.
Оценка количества удаленных ключей
Контролируйте значение evicted_keys (количество ключей, удаленных Redis):
# redis-cli INFO stats | grep
evicted_keysevicted_keys:0
Если значение этого параметра велико, имеет смысл увеличить объем памяти, доступной Redis.
Оценка скорости кэширования
Далее оцените достаточность скорости кэширования. Введите такую команду:
# redis-cli INFO stats | grep keyspace
Команда покажет на экране значения keyspace_hits (количество успешных выборок из хранилища) и keyspace_misses (количество запросов отсутствующих данных):
keyspace_hits:26184072
keyspace_misses:10726317
Видно, что значение keyspace_misses довольно велико. Если оно еще и постоянно увеличивается со временем, то сервер Redis не справляется с потоком данных.
Оценка количества подключенных клиентов
Метрика connected_clients показывает количество клиентов, подключенных к Redis:
# redis-cli INFO | grep connected_clients
connected_clients:91
Если клиентов слишком много, возможны проблемы с обработкой запросов. Параметр maxclients в файле конфигурации Redis /etc/redis/redis.conf
задает максимально допустимое количество клиентов. По умолчанию это количество равно 10000, но в зависимости от конфигурации ОС, например, от ограничений на количество открытых файлов, может потребоваться уменьшить значение параметра maxclients.
После редактирования файла конфигурации необходимо перезапустить сервис Redis.
Мониторинг Redis с помощью Zabbix
Используя сервер Zabbix версии 6.2 и агент Zabbix agent 2, установленный на контролируемом хосте, можно воспользоваться готовым шаблоном Redis by Zabbix agent 2.
Для этого шаблона не нужны дополнительные скрипты, не придется редактировать файл конфигурации и перезапускать сервис агента. Просто подключите шаблон в Web-интерфейсе сервера Zabbix к серверу, на котором работает Redis.
Проверка доступности плагина мониторинга Redis
Для проверки доступности плагина мониторинга Redis введите в консоли сервера Zabbix такую команду:
$ zabbix_get -s xxx.xxx.xxx.xxx -k redis.ping
1
где xxx.xxx.xxx.xxx — адрес IP контролируемого хоста Redis. Если плагин доступен, команда выведет на консоль значение единицы.
Метрики шаблона Redis by Zabbix agent 2
Шаблон Redis by Zabbix agent 2 позволяет контролировать данные метрик, о которых мы рассказывали выше в разделе статьи про ручной контроль сервиса Redis.
Если открыть в Web-интерфейсе Zabbix раздел Latest data для хоста Redis и в поисковом фильтре в поле Name задать строку «Redis», вы увидите значения довольно большого количества метрик. На рис. 1 показана только часть первой страницы с метриками, а всего таких страниц три.
На рис. 1 видно, что фрагментация памяти составляет 1.89, и это слишком много.
С помощью ссылки Graph можно увидеть график изменения той или иной метрики со временем. На рис. 2 показан график изменения количества клиентов, подключенных к Redis.
Как вы увидите дальше, в шаблоне Redis by Zabbix agent 2 имеются триггеры, контролирующие возможность подключения клиентов к сервису Redis.
Макросы для шаблона Redis by Zabbix agent 2
На рис. 3 мы показали макросы шаблона Redis by Zabbix agent 2.
Скорее всего, вам не придется здесь ничего менять. Но если Redis работает на порту, отличном от 6379, то придется отредактировать макрос {$REDIS.CONN.URI}.
Макрос {" class="formula inline">REDIS.MEM.FRAG_RATIO.MAX.WARN} задает предельное отношение для фрагментации памяти, при котором должен сработать соответствующий триггер.
Другие макросы также участвуют в выражениях, определяющих критерии срабатывания триггеров.
Триггеры шаблона Redis by Zabbix agent 2
В шаблоне Redis by Zabbix agent 2 предусмотрено более дюжины различных триггеров (рис. 4).
Здесь есть триггеры, которые срабатывают, если сервис Redis не запущен (Redis: Service is down), если он перезапустился (Redis: has been restarted) или если сервер Zabbix не смог получить данные от плагина мониторинга Redis (Redis: Failed to fetch info data). Срабатывание этих триггеров требует реакции системного администратора.
Также обратите внимание на триггер Redis: Memory fragmentation ratio is too high, срабатывающий при слишком большой фрагментации памяти. Если сработал этот триггер, имеет смысл проверить, насколько эффективно используется оперативная память сервера. При необходимости нужно перезапустить сервис Redis.
Если появились клиенты, которые не могут подключиться к Redis, срабатывает триггер Redis: Connections are rejected высокой важности High. Для остальных триггеров определены уровни важности как предупреждение (Warning) или информация (Information).
В этой статье мы не рассматриваем репликацию серверов Redis и мониторинг такой репликации — эта тема заслуживает отдельной статьи.
Автор: Александр Фролов.
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.