Установка и настройка Redis на Ubuntu

В данной статье рассмотрим, как установить standalone Redis, создать пользователя базы данных, настроить права и сетевой доступ.

Конфигурация оборудования

Сервер Ubuntu 18.04 LTS x86_64.

   
Как сэкономить время на установке Redis

Воспользуйтесь нашим готовым облачным решением на базе СУБД Redis. При регистрации вы получаете бесплатный бонусный счет, которого достаточно для работы в течение нескольких дней.

[попробовать облачную СУБД Redis]

Установка standalone Redis

  1. Авторизуйтесь на сервере Ubuntu 18.04.
  2. Обновите списки репозиториев:
ubuntu@ubuntu-standard-2-4-40gb:~$ sudo apt-get update
  1. По умолчанию в 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
  1. После установки убедитесь, что сервер запущен:
ubuntu@ubuntu-standard-2-4-40gb:~$ ps ax | grep redis
  335 ?        Ssl    0:00 /usr/bin/redis-server 127.0.0.1:6379
  1. Проверьте подключение к базе. По умолчанию для доступа к базе пароль не требуется:
ubuntu@ubuntu-standard-2-4-40gb:~$ redis-cli
127.0.0.1:6379> PING
PONG
127.0.0.1:6379>
  1. Добавьте сервис в список приложений, запускаемых автоматически:
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 по умолчанию не является надежно защищенной базой данной, используйте надежный пароль, а также ограничьте доступ к базе данных с помощью firewall.

Интересное о Redis

Следующая часть конфигурационного файла определяет предельный объем памяти, который может использоваться сервером 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 читайте тут.

Обратная связь

Возникли проблемы или остались вопросы? Напишите нам, мы будем рады вам помочь.