Redis – это открытое хранилище данных типа «ключ-значение». Redis поддерживает транзакции, pub/sub, автоматическое аварийное переключение и множество других функций.
Разработчики рекомендуют использовать Redis в среде производства Linux и OS X. Redis предоставляет множество клиентов, написанных на разных языках программирования; подробную информацию о клиентах можно найти на веб-сайте Redis.
В производственной среде репликация данных даже всего на две ноды считается полезным решением. Избыточность данных позволяет восстановить утраченную информацию в случае сбоя среды; это особенно важно при увеличении пользовательской базы приложения.
Данное руководство поможет настроить два сервера Redis: один ведущий (master) и один ведомый (slave). Также вы научитесь на время менять местами сервера master и slave.
Примечание: При помощи данных инструкций можно добавить в кластер больше серверов.
Данное руководство сосредоточено на создании кластера из двух серверов. Основы работы с Redis описаны в этом руководстве.
Требования
- Предварительно настроенные серверы CentOS 7 (в целом руководство подходит и для более старых дистрибутивов системы); инструкции по настройке – здесь. Для тестирования подойдут серверы с небольшим объёмом ресурсов, но в производственной среде рекомендуется использовать объемные серверы. Итак, подготовьте два сервера: master и slave.
- Не-root пользователь с доступом к sudo.
1: Установка Redis
Установите Redis на сервер master. Для этого нужно включить репозиторий EPEL.
Примечание: EPEL (Extra Packages for Enterprise Linux) – это репозиторий, разработанный командой Fedora, который предоставляет качественные сторонние пакеты для дистрибутивов RHEL.
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
Если команда wget не сработала, возможно, она не установлена. Установите её:
yum install wget
После этого снова запустите:
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
После этого введите:
sudo rpm -ivh epel-release-7-5.noarch.rpm
Затем используйте команду:
sudo yum -y update
Выполнение этой команды может занять несколько минут. После этого можно установить Redis:
sudo yum install redis -y
После завершения установки запустите сервис Redis:
sudo systemctl start redis.service
Проверьте состояние хранилища:
sudo systemctl status redis.service
Команда вернёт:
redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Wed 2015-07-22 02:26:31 EDT; 13s ago
Main PID: 18995 (redis-server)
CGroup: /system.slice/redis.service
└─18995 /usr/bin/redis-server 127.0.0.1:6379
Протестируйте установку Redis:
redis-cli ping
Команда должна вернуть:
PONG
Также проверить установку можно при помощи команды:
redis-benchmark -q -n 1000 -c 10 -P 5
Эта команда запустит redis-benchmark в тихом режиме (максимальное количество запросов – 1000, 10 одновременных подключений, передача 5 запросов).
Примечание: Чтобы получить подробную информацию о redis-benchmark, введите:
redis-benchmark --help
Запустите эталонный тест. После его завершения результат будет примерно таким:
PING_INLINE: 166666.67 requests per second
PING_BULK: 249999.98 requests per second
SET: 200000.00 requests per second
GET: 200000.00 requests per second
INCR: 200000.00 requests per second
LPUSH: 200000.00 requests per second
LPOP: 200000.00 requests per second
SADD: 200000.00 requests per second
SPOP: 249999.98 requests per second
LPUSH (needed to benchmark LRANGE): 200000.00 requests per second
LRANGE_100 (first 100 elements): 35714.29 requests per second
LRANGE_300 (first 300 elements): 11111.11 requests per second
LRANGE_500 (first 450 elements): 7194.24 requests per second
LRANGE_600 (first 600 elements): 5050.50 requests per second
MSET (10 keys): 100000.00 requests per second
После этого перейдите на сервер slave и повторите все вышеперечисленные действия.
Примечание: Если в вашем кластере больше серверов, повторите этот раздел на всех серверах.
Итак, хранилище Redis установлено и запущено на двух нодах. Если вывод на любой из нод отличается от приведённого выше вывода, внимательно повторите инструкции по установке и убедитесь, что все требования соблюдены.
2: Настройка ведущего сервера (Redis Master)
Итак, у вас есть кластер Redis из двух нод. Теперь нужно отредактировать их конфигурационные файлы. Между настройками ведущего и ведомого сервера существуют небольшие различия.
Для начала настройте сервер master.
Откройте в текстовом редакторе файл /etc/redis.conf:
sudo vi /etc/redis.conf
Отредактируйте в нём следующие строки.
Установите новое значение таймера keepalive для TCP:
tcp-keepalive 60
Откройте доступ к серверу в сети, раскомментировав следующую строку:
#bind 127.0.0.1
Учитывая особенности Redis (в частности, высокую скорость работы хранилища), злоумышленник может очень быстро выполнить успешную brute force атаку и получить пароль доступа. Поэтому рекомендуется раскомментировать строку requirepass и указать в ней сложный пароль.
requirepass your_redis_master_password
Следующую строку нужно отредактировать в зависимости от целей использования сервера. Предположим, ключи не буду удаляться из кластера; тогда нужно раскомментировать строку и установить такое значение:
maxmemory-policy noeviction
После этого нужно настроить резервное копирование данных. Раскомментируйте следующие строи и задайте им новые значения:
appendonly yes
appendfilename "appendonly.aof"
Сохраните изменения.
Перезапустите сервис Redis:
sudo systemctl restart redis.service
3: Настройка ведомого сервера (Redis Slave)
Теперь нужно настроить сервер slave. Откройте /etc/redis.conf в текстовом редакторе:
sudo vi /etc/redis.conf
Некоторые параметры будут совпадать с сервером master.
Откройте доступ к серверу в сети; для этого нужно раскомментировать строку:
#bind 127.0.0.1
Серверу slave также необходим пароль. Раскомментируйте следующую строку и введите надёжный пароль:
requirepass your_redis_slave_password
Затем раскомментируйте следующую строку и укажите IP-адрес сервера master и порт (по молчанию – порт 6379):
slaveof your_redis_master_ip 6379
Раскомментируйте masterauth и укажите пароль сервера master.
masterauth your_redis_master_password
Сохраните и закройте файл. Перезапустите сервис:
sudo systemctl restart redis.service
Эта команда перезапустит Redis с новыми настройками.
Подключитесь к серверу Redis:
redis-cli -h 127.0.0.1 -p 6379
Авторизуйтесь при помощи пароля сервера slave.
AUTH your_redis_slave_password
Итак, теперь машины master и slave кластера Redis настроены.
4: Репликация данных
Чтобы лучше понять поведение кластера Redis, протестируйте его работу. Проверьте взаимодействие серверов Redis.
На сервере master подключитесь к Redis в терминале.
Сначала подключитесь к локальной копии на порт 6379.
Примечание: Если вы изменили стандартный порт, укажите новый номер порта.
redis-cli -h 127.0.0.1 -p 6379
Укажите пароль Redis:
AUTH your_redis_master_password
Команда должна вернуть:
OK
После этого нужно запустить:
INFO
Эта команда предоставит все данные о master-сервере Redis. Особенно важен сейчас раздел #Replication. Он должен выглядеть примерно так:
. . .
# Replication
role:master
connected_slaves:1
slave0:ip=111.111.111.222,port=6379,state=online,offset=407,lag=1
master_repl_offset:407
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:406
. . .
Обратите внимание на строку connected_slaves:1, которая значит, что ведомый сервер взаимодействует с сервером master. Также здесь можно найти IP-адрес, порт, состояние, и много других сведений о сервере.
Теперь просмотрите раздел #Replication на машине slave. Подключитесь к этому серверу и выполните команду INFO.
. . .
# Replication
role:slave
master_host:111.111.111.111
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:1401
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
. . .
Как видите, здесь отмечено, что данная машина исполняет роль ведомой и не имеет подчинённых ей машин.
5: Настройка аварийного переключения
Любой сервер slave можно повысить до статуса master. Такая архитектура кластера позволяет обрабатывать сбои, обеспечивая целостность данных и наименьшее время простоя.
Попробуйте выполнить такую настройку вручную.
На сервере slave подключитесь к Redis:
redis-cli -h 127.0.0.1 -p 6379
Авторизуйтесь, указав пароль:
AUTH your_redis_slave_password
Отключите поведение slave:
SLAVEOF NO ONE
Команда ответит:
OK
После этого введите:
INFO
Найдите раздел # Replication:
. . .
# Replication
role:master
connected_slaves:0
master_repl_offset:1737
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
. . .
Как и ожидалось, slave-сервер стал сервером master и теперь может принимать соединения от других машин. Его можно использовать в качестве ведущего сервера на время устранения ошибок на предыдущем сервере master.
Если в кластере есть несколько slave-серверов, после изменения master-сервера нужно соединить их с новым сервером.
Для этого можно создать скрипт, который в случае сбоя сервера master внесёт соответствующие поправки в настройки:
- Перенаправит все запросы на сервер slave.
- Выполнит на этом сервере команду SLAVEOF NO ONE. Начиная с версии Redis 1.0.0, эта команда отключает репликацию данных на сервере slave и запускает его в качестве ведущего сервера.
- Переподключит все существующие серверы slave (SLAVEOF hostname port) к новому master-серверу. Значения hostname и port нужно заменить именем хоста и портом нового master-сервера.
- Устранив неполадки на старом сервере master, можно восстановить его статус.
Существует множество средств для обеспечения такого поведения кластера.
Выберите наиболее подходящее для вашей среды решение и тщательно протестируйте его, прежде чем возникнут какие-либо сбои.
6: Восстановление статуса master
Теперь старый master-сервер стал сервером slave. Чтобы восстановить старый сервер master, войдите на текущий сервер master, запустите Redis и введите следующую команду:
SLAVEOF your_redis_master_ip 6379
Если теперь снова запустить команду INFO, вы увидите, что настройки вернулись в исходное состояние.
Заключение
Данное руководство охватывает только базовые настройки хранилища данных Redis с архитектурой master-slave. Такая архитектура позволяет в случае сбоя сервера master быстро передать его функции другому серверу.
В дальнейшем рекомендуется написать скрипт для автоматизации процедуры замены сервера master в случае его сбоя. Также нужно защитить подключения между серверами. Не забывайте своевременно тестировать новые настройки кластера.
Кроме того, необходимо принимать меры предосторожности при развертывании новых установок в производственной среде. Ознакомьтесь с документацией Redis и выберите наиболее подходящую модель безопасности для вашего приложения. Redis часто используется для хранения сессий, и содержащаяся в хранилище информация может быть полезна для злоумышленников. Потому машины Redis, как правило, доступны только в частной сети и нуждаются в нескольких уровнях безопасности.