Redis - это хранилище структур данных в памяти с открытым исходным кодом. Вы можете использовать его как альтернативу Memcached для хранения простых пар ключ-значение, как базу данных NoSQL или даже как брокер сообщений по схеме Pub-Sub. Это руководство покажет вам, как установить, настроить, отладить и защитить Redis на CentOS 8 Stream.
Установка Redis
RPM-репо Remi's - это давний и проверенный сообществом репозиторий для CentOS. Его пакет Redis обычно новее, чем пакет Redis в CentOS.
Включите репозиторий:
1 | dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y |
Перечислите все доступные пакеты Redis в репозитории Remi.
1 | dnf module list | grep redis |
Результат должен выглядеть следующим образом:
1 2 3 4 5 6 | redis 5 [d][e] common [d] [i] Redis persistent key-value database redis 6 common [d] Redis persistent key-value database redis remi-5.0 common [d] Redis persistent key-value database redis remi-6.0 common [d] Redis persistent key-value database redis remi-6.2 common [d] Redis persistent key-value database redis remi-7.0 common [d] Redis persistent key-value database |
Значения во втором столбце выше соответствуют основным версиям Redis.
Предварительно может понадобиться сброс модуля редис
1 | dnf module reset redis |
Предполагая, что последняя основная версия - 7.0, установите эту версию:
1 | dnf module install redis:remi-7.0 -y |
Включите службу Redis для запуска во время загрузки.
1 | systemctl enable redis.service |
Запустите Redis.
1 | systemctl start redis.service |
Настройка Redis
Откройте файл конфигурации Redis :
1 | nano /etc/redis.conf |
Установите желаемый объем памяти для вашего приложения.
1 | maxmemory 128mb |
По умолчанию, когда maxmemory будет достигнуто, Redis перестанет записывать новые данные. Если вы хотите, чтобы Redis записывал новые данные, автоматически удаляя старые, вы должны указать Redis, как их удалять. Политика выселения allkeys-lru является хорошим выбором для большинства пользователей. Добавьте следующую строку:
1 | maxmemory-policy allkeys-lru |
Установите политику сохранения на диск.
По умолчанию Redis будет сохранять данные в памяти на диск после определенного периода или определенного количества операций записи в БД. Настройки по умолчанию следующие:
1 2 3 | save 900 1 save 300 10 save 60 10000 |
Это означает, что сохранение произойдет
- через 900 сек (15 мин), если изменился хотя бы 1 ключ
- через 300 сек (5 мин), если изменилось не менее 10 ключей
- через 60 секунд, если изменилось хотя бы 10000 ключей
При указанных выше настройках по умолчанию Redis будет загружать сохраненные данные в память при каждом перезапуске. Таким образом, ваши предыдущие данные в памяти будут восстановлены. Если вам не нужна эта функция, вы можете полностью отключить ее, закомментировав эти строки:
1 2 3 | # save 900 1 # save 300 10 # save 60 10000 |
Если вы решите сохранить эту функцию, вам следует обновить сервер до более производительного или добавить соответствующий файл подкачки в Linux, чтобы память Redis была вдвое больше, чем maxmemory, объявленная выше. В противном случае, когда maxmemory будет достигнута, процесс сохранения может привести к тому, что на вашем сервере закончится память.
Сохраните и закройте конфигурационный файл, затем перезапустите Redis, чтобы применить изменения.
1 | systemctl restart redis.service |
Тонкая настройка системы
Проверьте файл журнала Redis:
1 | tail /var/log/redis/redis.log |
Вы увидите примерно такую информацию:
- WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
- WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
- WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
Чтобы устранить первое предупреждение, введите следующую команду.
1 | echo 'net.core.somaxconn = 512' | sudo tee -a /etc/sysctl.conf > /dev/null |
Чтобы устранить второе предупреждение, введите следующую команду.
1 | echo 'vm.overcommit_memory = 1' | sudo tee -a /etc/sysctl.conf > /dev/null |
Перезагрузите значения sysctl.
1 | sysctl -p |
Чтобы исправить последнее предупреждение, необходимо отключить Transparent Huge Pages (THP) во время загрузки перед запуском службы Redis.
Создайте новый файл сценария:
1 | nano /usr/bin/disable-transparent-hugepage |
Вставьте в файл следующий текст:
1 2 3 | #!/bin/bash echo never > /sys/kernel/mm/transparent_hugepage/enabled exit 0 |
Сохраните и закройте файл, затем сделайте его запускаемым и принадлежащим учетной записи root:
1 2 | chown root:root /usr/bin/disable-transparent-hugepage chmod 770 /usr/bin/disable-transparent-hugepage |
Далее создайте файл конфигурации для службы systemd, которая будет вызывать скрипт во время загрузки:
1 | nano /etc/systemd/system/disable-transparent-hugepage.service |
Вставьте в файл следующий текст:
1 2 3 4 5 6 7 8 9 10 | [Unit] Description=Disable Transparent Huge Pages (THP) for Redis. Before=redis.service [Service] Type=exec ExecStart=/usr/bin/disable-transparent-hugepage [Install] WantedBy=multi-user.target |
Сохраните и закройте файл, затем включите службу:
1 | systemctl enable disable-transparent-hugepage.service |
Проверка установки
Перезапустите сервер:
1 | reboot |
После перезапуска сервера проверьте файл журнала Redis, чтобы убедиться в отсутствии предупреждений:
1 | tail /var/log/redis/redis.log |
Используйте программу redis-cli для подключения к Redis через стандартный loopback IP 127.0.0.1 и порт 6379.
1 | redis-cli -h 127.0.0.1 -p 6379 |
Если подключение прошло успешно, вы увидите командную строку Redis:
1 | 127.0.0.1:6379> |
Введите несколько команд Redis, чтобы убедиться, что все работает:
1 2 3 | set testkey testvalue get testkey exit |
Если вы увидите следующий результат, значит Redis работает правильно.
(Необязательно) Настройка Redis для доступа в локальной сети
Если вы создаете производственную среду с несколькими серверами для вашего приложения, серверам приложений необходим доступ к серверу Redis. Для безопасности рекомендуется использовать частную сеть.
Следуя этому руководству, включите и настройте частную сеть для этого сервера Redis и серверов приложений, которые должны взаимодействовать с Redis.
Обновите службу firewalld, чтобы разрешить входящие соединения из частной сети:
1 | firewall-cmd --permanent --zone=trusted --change-interface=ens1 |
Создайте службу systemd для отсрочки запуска Redis до тех пор, пока частный интерфейс не будет запущен и IP-адрес не будет назначен.
1 | nano /etc/systemd/system/redis.service.d/wait-for-ips.conf |
Вставьте следующий текст в файл, затем сохраните и закройте его:
1 2 3 | [Unit] After=network-online.target Wants=network-online.target |
Отредактируйте файл конфигурации Redis.
1 | nano /etc/redis.conf |
Добавьте частный IP-адрес, к которому должен привязываться Redis. Например, если Redis должен привязаться к внутреннему loopback (127.0.0.1) и частному IP-адресу (192.168.0.2):
1 | bind 127.0.0.1 192.168.0.2 |
Сохраните и закройте конфигурационный файл.
Перезапустите Redis, чтобы применить изменения.
1 | systemctl restart redis.service |