Настройка кластера Redis на CentOS 7

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

Tags: , ,

Добавить комментарий