Если вам нужна быстродействующая нереляционная СУБД типа «ключ-значение», то, возможно, подойдет 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. Значения метрик мониторинга Redis
Рис. 1. Значения метрик мониторинга Redis

На рис. 1 видно, что фрагментация памяти составляет 1.89, и это слишком много.

С помощью ссылки Graph можно увидеть график изменения той или иной метрики со временем. На рис. 2 показан график изменения количества клиентов, подключенных к Redis.

Рис. 2. График изменения количества клиентов, подключенных к Redis
Рис. 2. График изменения количества клиентов, подключенных к Redis

Как вы увидите дальше, в шаблоне Redis by Zabbix agent 2 имеются триггеры, контролирующие возможность подключения клиентов к сервису Redis.

Макросы для шаблона Redis by Zabbix agent 2

На рис. 3 мы показали макросы шаблона Redis by Zabbix agent 2.

Рис. 3. Макросы шаблона Redis by Zabbix agent 
Рис. 3. Макросы шаблона Redis by Zabbix agent 

Скорее всего, вам не придется здесь ничего менять. Но если 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).

Рис. 4. Триггеры шаблона Redis by Zabbix agent 
Рис. 4. Триггеры шаблона Redis by Zabbix agent 

Здесь есть триггеры, которые срабатывают, если сервис 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.

Комментарии (4)


  1. Sleuthhound
    13.09.2022 12:03

    Если вам нужна быстродействующая нереляционная СУБД типа «ключ-значение», то, возможно, подойдет Redis (Remote Dictionary Server). 

    Можно сразу поставить KeyDB и забыть про узкие места Redis, которые при росте проекта могут больно ударить в самое неподходящее время.


    1. AlexandreFrolov
      13.09.2022 12:47

      Спасибо за ваш комментарий, возможно буду использовать в других проектах.


  1. Starker
    14.09.2022 08:35
    +1

    Чуть подскажу как мы на проектах это делаем для забба(3.4):

    (printf "AUTH $pass\r\nINFO\r\nQUIT\r\n";) | nc localhost 6321;fi 

    так можно прям активной проверкой пулять и парсить в самом заббе. Если конечноже нету доступа к redis.cli.


  1. bpof
    15.09.2022 10:54

    При мониторинге стандартным шаблоном есть проблема, если на сервере запущено несколько экземпляров Redis, то мониторить можно только один из них, т.к. подключение идёт по порту и указать ещё один порт невозможно. Есть несколько решений. Можно переписать шаблон на LLD портов редиса.ps aux | grep redis-server | grep -v grep | awk '{print $12}' | cut -d ':' -f 2Или создать в Zabbix ещё одну сушьность, которая будет смотреть на другой порт.