Настройка кластера Redis на Ubuntu 14.04

Redis – это открытое хранилище данных типа «ключ-значение». Redis поддерживает транзакции, pub/sub, автоматическое аварийное переключение и множество других функций.

Разработчики рекомендуют использовать Redis в среде производства Linux и OS X. Redis предоставляет множество клиентов, написанных на разных языках программирования; подробную информацию о клиентах можно найти на веб-сайте Redis.

В производственной среде репликация данных даже всего на две ноды считается полезным решением. Избыточность данных позволяет восстановить утраченную информацию в случае сбоя среды; это особенно важно при увеличении пользовательской базы приложения.

Данное руководство поможет настроить два сервера Redis: один ведущий (master) и один ведомый (slave). Также вы научитесь на время менять местами сервера master и slave.

Примечание: При помощи данных инструкций можно добавить в кластер больше серверов.

Данное руководство сосредоточено на создании кластера из двух серверов. Основы работы с Redis описаны в этом руководстве.

Требования

  • Предварительно настроенные серверы Ubuntu 14.04 LTS (в целом руководство подходит и для более старых дистрибутивов системы); инструкции по настройке – здесь. Для тестирования подойдут серверы с небольшим объёмом ресурсов, но в производственной среде рекомендуется использовать объемные серверы. Итак, подготовьте два сервера: master и slave.
  • Не-root пользователь с доступом к sudo.

1: Установка Redis

Установите Redis на сервер master. Для начала нужно добавить репозиторий Redis (автор Chris Lea).

Примечание: Будьте предельно осторожны при добавлении сторонних репозиториев; в руководстве используется этот репозиторий, потому что он поддерживается надёжным разработчиком.

sudo add-apt-repository ppa:chris-lea/redis-server

Нажмите ENTER, чтобы добавить репозиторий.

Запустите следующую команду, чтобы обновить пакеты:

sudo apt-get update

Установите Redis:

sudo apt-get install redis-server

Убедитесь в том, что сервер Redis установлен и запущен:

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: 249999.98 requests per second
GET: 499999.97 requests per second
INCR: 333333.34 requests per second
LPUSH: 499999.97 requests per second
LPOP: 499999.97 requests per second
SADD: 499999.97 requests per second
SPOP: 499999.97 requests per second
LPUSH (needed to benchmark LRANGE): 499999.97 requests per second
LRANGE_100 (first 100 elements): 111111.12 requests per second
LRANGE_300 (first 300 elements): 27777.78 requests per second
LRANGE_500 (first 450 elements): 8333.33 requests per second
LRANGE_600 (first 600 elements): 6369.43 requests per second
MSET (10 keys): 142857.14 requests per second

После этого перейдите на сервер slave и повторите все вышеперечисленные действия.

Примечание: Если в вашем кластере больше серверов, повторите этот раздел на всех серверах.

Итак, хранилище Redis установлено и запущено на двух нодах. Если вывод на любой из нод отличается от приведённого выше вывода, внимательно повторите инструкции по установке и убедитесь, что все требования соблюдены.

2: Настройка ведущего сервера (Redis Master)

Итак, у вас есть кластер Redis из двух нод. Теперь нужно отредактировать их конфигурационные файлы. Между настройками ведущего и ведомого сервера существуют небольшие различия.

Для начала настройте сервер master.

Откройте в текстовом редакторе файл /etc/redis.conf:

sudo nano /etc/redis/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 redis-staging-ao.aof

Сохраните изменения.

Перезапустите сервис Redis:

sudo service redis-server restart

Дополнительно можно добавить уникальные данные в основную БД, выполнив раздел «Операции Redis» этого руководства. Это позволит в дальнейшем проверить репликацию данных в кластере.

3: Настройка ведомого сервера (Redis Slave)

Теперь нужно настроить сервер slave. Откройте /etc/redis.conf в текстовом редакторе:

sudo nano /etc/redis/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 service redis-server restart

Эта команда перезапустит 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: ,

1 комментарий

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