Установка и настройка Redis на Ubuntu
В данной статье рассмотрим, как установить standalone Redis, создать пользователя базы данных, настроить права и сетевой доступ.
- Сервер Ubuntu 18.04 LTS x86_64.
Воспользуйтесь нашим готовым облачным решением на базе СУБД Redis. При регистрации вы получаете бесплатный бонусный счет, которого достаточно для работы в течение нескольких дней.
-
Авторизуйтесь на сервере Ubuntu 18.04.
-
Обновите списки репозиториев:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo apt-get update
-
По умолчанию в Ubuntu 18.04 в репозиториях располагается Redis 4. Выполните одно из действий:
-
Если этой версии достаточно, установите ее:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo apt-get install redis-server
-
Если требуется актуальная версия Redis:
-
Добавьте PPA-репозиторий с новой версией Redis:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo add-apt-repository ppa:chris-lea/redis-server Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. More info: https://launchpad.net/~chris-lea/+archive/ubuntu/redis-server Press [ENTER] to continue or Ctrl-c to cancel adding it.
-
Установите Redis новой версии:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo apt-get install redis-server
-
-
-
После установки убедитесь, что сервер запущен:
ubuntu@ubuntu-standard-2-4-40gb:~$ ps ax | grep redis 335 ? Ssl 0:00 /usr/bin/redis-server 127.0.0.1:6379
-
Проверьте подключение к базе. По умолчанию для доступа к базе пароль не требуется:
ubuntu@ubuntu-standard-2-4-40gb:~$ redis-cli 127.0.0.1:6379> PING PONG 127.0.0.1:6379>
-
Добавьте сервис в список приложений, запускаемых автоматически:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo systemctl enable redis-server Synchronizing state of redis-server.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable redis-server Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service.
Установка завершена.
По умолчанию для доступа к Redis не требуется пароль. Для настройки прав доступа отредактируйте конфигурационный файл /etc/redis/redis.conf
. В соответствии с документацией, Redis - высокопроизводительная база данных, которая позволяет злоумышленнику проверять до 150 000 паролей в секунду. Поэтому рекомендуется использовать надежный пароль:
-
Сгенерируйте пароль из 32 символов:
ubuntu@ubuntu-standard-2-4-40gb:~$ openssl rand 32 | openssl base64 -A JvDoH6XbAaFHHYnHEH0O0voURJCd5XoZ64W2lf1hyXQ=
-
Укажите этот пароль в файле
/etc/redis/redis.conf
в разделеSECURITY
в командеrequirepass
:################################## SECURITY ################################### # Require clients to issue AUTH <PASSWORD> before processing any other # commands. This might be useful in environments in which you do not trust # others with access to the host running redis-server. # # This should stay commented out for backward compatibility and because most # people do not need auth (e.g. they run their own servers). # # Warning: since Redis is pretty fast an outside user can try up to # 150k passwords per second against a good box. This means that you should # use a very strong password otherwise it will be very easy to break. # # requirepass foobared requirepass JvDoH6XbAaFHHYnHEH0O0voURJCd5XoZ64W2lf1hyXQ=
Для повышения уровня безопасности можно использовать переименование команд либо запрет выполнения команд для работы с базой данных. Например:
# Command renaming.
#
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it will still be available for internal-use tools
# but not available for general clients.
#
# Example:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
# rename-command CONFIG ""
#
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
После изменения файла конфигурации, выполните проверку доступности базы данных:
-
Перезагрузите сервер Redis:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo systemctl restart redis-server.service
-
Подключитесь к серверу и проверьте выполненные настройки:
ubuntu@ubuntu-standard-2-4-40gb:~$ redis-cli 127.0.0.1:6379> ping (error) NOAUTH Authentication required. 127.0.0.1:6379> auth JvDoH6XbAaFHHYnHEH0O0voURJCd5XoZ64W2lf1hyXQ= OK 127.0.0.1:6379> ping PONG 127.0.0.1:6379>
По умолчанию Redis слушает только 127.0.0.1. Чтобы настроить сетевой доступ к серверу, выполните следующие шаги:
-
Отредактируйте файл
_/etc/redis/redis.conf_
. Найдите строку_bind 127.0.0.1 ::1_
и закомментируйте ее:# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES # JUST COMMENT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #bind 127.0.0.1 ::1
-
Перезапустите Redis:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo systemctl restart redis-server.service
-
Убедитесь, что Redis слушает сеть:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo netstat -tulpn | grep redis tcp 0 0 0.0.0.0:6379 0.0.0.0:\* LISTEN 1562/redis-server \* tcp6 0 0 :::6379 :::\* LISTEN 1562/redis-server \*
-
Проверьте сетевое подключение к базе данных с другого компьютера:
root@ash:~# redis-cli -h <REDIS_SERVER_IP> REDIS:6379> ping (error) NOAUTH Authentication required. REDIS:6379> auth JvDoH6XbAaFHHYnHEH0O0voURJCd5XoZ64W2lf1hyXQ= OK REDIS:6379> ping PONG REDIS:6379>
Следующая часть конфигурационного файла определяет предельный объем памяти, который может использоваться сервером Redis, и механизм вытеснения ключей при заполнении этого объема памяти:
############################## MEMORY MANAGEMENT ################################
# Set a memory usage limit to the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).
#
# If Redis can't remove keys according to the policy, or if the policy is
# set to 'noeviction', Redis will start to reply with errors to commands
# that would use more memory, like SET, LPUSH, and so on, and will continue
# to reply to read-only commands like GET.
#
# This option is usually useful when using Redis as an LRU or LFU cache, or to
# set a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have replicas attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the replicas are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of replicas is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have replicas attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for replica
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes>
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
# Both LRU, LFU and volatile-ttl are implemented using approximated
# randomized algorithms.
#
# Note: with any of the above policies, Redis will return an error on write
# operations, when there are no suitable keys for eviction.
#
# At the date of writing these commands are: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
#
# The default is:
#
# maxmemory-policy noeviction
-
Параметр
_maxmemory_
определяет максимальный объем памяти в байтах, который может использоваться Redis. -
Параметр
_maxmemory-policy_
определяет политику вытеснения ключей при заполнении этого объема памяти. Возможные значения:- noeviction — не вытеснять данные, то есть если память закончилась, при попытке записи в базу данных выдавать ошибку (по умолчанию);
- volatile-lru — удалить наименее используемые в последнее время ключи с настройкой expire;
- allkeys-lru — удалить наименее используемые в последнее время ключи вне зависимости от настройки expire;
- volatile-lfu — удалить наименее часто используемые ключи с настройкой expire;
- allkeys-lfu — удалить наименее часто используемые ключи вне зависимости от настройки expire;
- volatile-random — удалить случайные ключи с настройкой expire;
- allkeys-random — удалить случайные ключи вне зависимости от настройки expire;
- volatile-ttl — удалить ключи, срок действия которых истекает быстрее остальных (то есть время жизни которых приближается к expire).
Еще одной интересной особенностью Redis является однопоточность. Это делает бессмысленными попытки масштабирования путем наращивания ядра процессора — в результате при высоких нагрузках может заметно деградировать производительность сервера Redis. Официальная рекомендация разработчиков: для снижения нагрузки пересматривать архитектуру приложения, использующего Redis. Поскольку такое решение подходит не всем, был создан многопоточный сервер KeyDB, полностью совместимый с Redis и набирающий популярность в настоящее время. Подробнее о KeyDB вы можете на сайте разработчика.