Как настроить репликацию Redis в Ubuntu 16.04

Вступление

Redis - это хранилище данных значения ключа с открытым исходным кодом, использующее модель хранения в памяти с дополнительными записями на диск для сохранения. Он включает в себя транзакции, шаблон обмена сообщениями в пабах и подчиненных и автоматическое переключение при сбое, а также другие функции. В Redis клиенты написаны на большинстве языков, а рекомендуемые указаны вtheir website.

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

В этом руководстве мы настроим репликацию между двумя серверами, на обоих работает Ubuntu 16.04. Этот процесс может быть легко адаптирован для большего количества серверов при необходимости.

Предпосылки

Чтобы выполнить это руководство, вам потребуется доступ к двум серверам Ubuntu 16.04. В соответствии с терминологией, которую использует Redis, мы будем называть основные серверы, ответственные за прием запросов на запись, серверомmaster, а вторичный сервер только для чтения - серверомslave.

У вас должен быть пользователь без полномочий root с правамиsudo, настроенными на каждом из этих серверов. Кроме того, в этом руководстве предполагается, что у вас установлен базовый брандмауэр. Вы можете следовать нашимUbuntu 16.04 initial server setup guide, чтобы выполнить эти требования.

Когда вы будете готовы начать, продолжайте с этим руководством.

Шаг 1: Установите Redis

Для начала мы установим Redis на серверыmaster иslave.

Мы установим обновленный пакет Redis Server, используяChris Lea’s Redis PPA. Всегда будьте осторожны при включении сторонних репозиториев. В этом случае Крис Ли - хорошо зарекомендовавший себя упаковщик, который поддерживает множество высококачественных упаковок.

Сначала добавьте PPA на оба ваших сервера:

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

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

Затем обновите локальный индекс пакета сервера и установите пакет сервера Redis, введя:

sudo apt-get update
sudo apt-get install redis-server

Это установит сервер Redis и запустит службу.

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

redis-cli ping

Вы должны получить следующий ответ:

OutputPONG

Это указывает на то, что Redis работает и доступен для локального клиента.

Шаг 2: Безопасный трафик между двумя серверами

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

Если Redis развернут в изолированной сети ...

Если ваши серверы работают в изолированной сети, вам, вероятно, нужно только настроить файл конфигурации Redis для привязки к вашему изолированному сетевому IP-адресу.

Откройте файл конфигурации Redis на каждом компьютере:

sudo nano /etc/redis/redis.conf

Найдите строкуbind и добавьте собственный изолированный сетевой IP-адрес сервера:

/etc/redis/redis.conf

bind 127.0.0.1 isolated_IP_address

Сохраните и закройте файл. Перезапустите сервис, набрав:

sudo systemctl restart redis-server.service

Откройте доступ к порту Redis:

sudo ufw allow 6379

Теперь у вас должна быть возможность получить доступ к одному серверу с другого, указав IP-адрес альтернативного сервера командеredis-cli с флагом-h:

redis-cli -h isolated_IP_address ping
OutputPONG

Redis теперь может принимать соединения от вашей изолированной сети.

Если Redis не развернут в изолированной сети ...

Для сетей, которые не изолированы или которые вы не контролируете, обязательно, чтобы трафик был защищен другими способами. Существует много вариантов защиты трафика между серверами Redis, в том числе:

  • Tunneling with stunnel: вам понадобится входящий и исходящий туннель для каждого сервера. Пример доступен в нижней части руководства.

  • Tunneling with spiped: вам нужно будет создать два файла модулей systemd для каждого сервера, один для связи с удаленным сервером, а другой для перенаправления подключений к собственному процессу Redis. Подробности включены в нижней части руководства.

  • Setting up a VPN with PeerVPN: Оба сервера должны быть доступны через VPN.

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

Шаг 3. Настройка Redis Master

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

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

sudo nano /etc/redis/redis.conf

Начните с поиска параметраtcp-keepalive и установите его на 60 секунд, как предлагают комментарии. Это поможет Redis обнаруживать проблемы с сетью или обслуживанием:

/etc/redis/redis.conf

. . .
tcp-keepalive 60
. . .

Найдите директивуrequirepass и установите для нее надежную парольную фразу. Хотя ваш трафик Redis должен быть защищен от внешних сторон, это обеспечивает аутентификацию для самого Redis. Поскольку Redis работает быстро и не ограничивает количество попыток ввода пароля, выберите надежную сложную фразу-пароль для защиты от попыток перебора:

/etc/redis/redis.conf

requirepass your_redis_master_password

Наконец, есть несколько необязательных настроек, которые вы можете изменить в зависимости от сценария использования.

Если вы не хотите, чтобы Redis автоматически удалял старые и менее используемые ключи по мере их заполнения, вы можете отключить автоматическое удаление ключей:

/etc/redis/redis.conf

maxmemory-policy noeviction

Для повышения гарантий долговечности вы можете включить сохранение файлов только для добавления. Это поможет минимизировать потерю данных в случае сбоя системы за счет больших файлов и немного меньшей производительности:

/etc/redis/redis.conf

appendonly yes
appendfilename "redis-staging-ao.aof"

Когда вы закончите, сохраните и закройте файл.

Перезапустите службу Redis, чтобы перезагрузить наши изменения конфигурации:

sudo systemctl restart redis-server.service

Теперь, когда главный сервер настроен, найдите время, чтобы протестировать его.

Шаг 4: Проверьте Redis Master

Убедитесь, что вы можете аутентифицироваться, используя пароль, который вы установили, запустив клиент Redis:

redis-cli

Сначала попробуйте команду без аутентификации:

info replication

Вы должны получить следующий ответ:

Redis master outputNOAUTH Authentication required.

Это ожидается и указывает на то, что наш сервер Redis правильно отклоняет неаутентифицированные запросы.

Затем используйте командуauth для аутентификации:

auth your_redis_master_password

Вы должны получить подтверждение того, что ваши учетные данные были приняты:

Redis master outputOK

Если вы попробуете команду еще раз, на этот раз она будет успешной:

info replication
Redis master output# Replication
role:master
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

Пока вы проходите аутентификацию, установите тестовый ключ, чтобы мы могли проверить репликацию позже:

set test 'this key was defined on the master server'

Вернитесь обратно в оболочку операционной системы, когда закончите:

exit

Теперь, когда у нас есть готовый главный сервер, давайте перейдем к нашему подчиненному компьютеру.

Шаг 5: Настройте подчиненный Redis

Затем нам нужно внести некоторые изменения, чтобы позволить нашемуslave server подключаться к нашему главному экземпляру.

Откройте/etc/redis/redis.conf на подчиненном сервере:

sudo nano /etc/redis/redis.conf

Сначала найдите и раскомментируйте строкуslaveof. Эта директива берет IP-адрес и порт, которые вы используете для безопасной связи с главным сервером Redis, через пробел. По умолчанию сервер Redis прослушивает 6379 на локальном интерфейсе, но каждый из методов защиты сети каким-то образом изменяет настройки по умолчанию для внешних сторон.

Используемые вами значения будут зависеть от метода, который вы использовали для защиты вашего сетевого трафика:

  • isolated network: используйте изолированный сетевой IP-адрес и порт Redis (6379) главного сервера (например,slaveof isolated_IP_address 6379).

  • stunnel илиspiped: используйте локальный интерфейс (127.0.0.1) и порт, настроенный для туннелирования трафика (это будетslaveof 127.0.0.1 8000, если вы следовали руководству).

  • PeerVPN: используйте IP-адрес главного сервера VPN и обычный порт Redis (это будетslaveof 10.8.0.1 6379, если вы следовали руководству).

Общая форма:

/etc/redis/redis.conf

slaveof ip_to_contact_master port_to_contact_master

Затем раскомментируйте и заполните строкуmasterauth паролем, который был установлен для главного сервера Redis:

/etc/redis/redis.conf

masterauth your_redis_master_password

Установите пароль для вашего подчиненного сервера, чтобы предотвратить несанкционированный доступ. Здесь действуют те же предупреждения о сложности пароля:

/etc/redis/redis.conf

requirepass your_redis_slave_password

Сохраните и закройте файл, когда вы закончите.

Шаг 6: протестируйте подчиненный Redis и примените изменения

Прежде чем мы перезапустим службу для реализации наших изменений, давайте подключимся к локальному экземпляру Redis на подчиненной машине и убедимся, что ключtest не установлен:

redis-cli

Запросите ключ, набрав:

get test

Вы должны получить следующий ответ:

Redis slave output(nil)

Это указывает на то, что локальный экземпляр Redis не имеет ключа с именемtest. Вернитесь в оболочку, набрав:

exit

Перезапустите службу Redis на ведомом устройстве, чтобы применить эти изменения:

sudo systemctl restart redis-server.service

Это применимо ко всем изменениям, которые мы внесли в файл конфигурации Redis Slave.

Снова подключитесь к локальному экземпляру Redis:

redis-cli

Как и на главном сервере Redis, теперь операции должны завершаться сбоем, если они не авторизованы:

get test
Redis slave output(error) NOAUTH Authentication required.

Теперь выполните аутентификацию, используя пароль подчиненного Redis, который вы установили в последнем разделе:

auth your_redis_slave_password
Redis slave outputOK

Если мы попытаемся получить доступ к ключу на этот раз, мы обнаружим, что он доступен:

get test
Redis slave output"this key was defined on the master server"

Как только мы перезапустили наш сервис Redis на ведомом устройстве, репликация началась немедленно.

Вы можете проверить это с помощью команды Redisinfo, которая сообщает информацию о репликации. Значениеmaster_host иmaster_port должно соответствовать аргументам, которые вы использовали для параметраslaveof:

info replication
Redis slave output# Replication
role:slave
master_host:10.8.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:1387
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

Если вы посмотрите на ту же информацию на главном сервере Redis, вы увидите что-то вроде этого:

info replication
Redis master output# Replication
role:master
connected_slaves:1
slave0:ip=10.8.0.2,port=6379,state=online,offset=1737,lag=1
master_repl_offset:1737
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1736

Как видите, главный и подчиненный серверы правильно идентифицируют друг друга в своих определенных отношениях.

Шаг 7: Повышение статуса Redis Slave до Master

Основной причиной настройки репликации является обработка сбоев с минимальной потерей данных и простоем. Ведомые устройства Redis могут быть переведены в главное состояние для обработки трафика записи в случае сбоя главного устройства Redis.

Продвижение Redis Slave вручную

Мы можем сделать это вручную с подчиненного сервера Redis. Войдите в систему с помощью клиента Redis:

redis-cli

Авторизуйтесь, используя пароль подчиненного Redis:

auth your_redis_slave_password

Перед продвижением ведомого Redis попробуйте перезаписать тестовый ключ:

set test 'this key was overwritten on the slave server'

Это должно завершиться ошибкой, потому что по умолчанию подчиненные устройства Redis настроены только для чтения с параметромslave-read-only yes:

Redis slave output(error) READONLY You can't write against a read only slave.

Чтобы отключить репликацию и повысить статус текущего сервера до главного, используйте командуslaveof со значениемno one:

slaveof no one
Redis slave outputOK

Проверьте информацию о репликации еще раз:

info replication
Redis slave output# Replication
role:master
connected_slaves:0
master_repl_offset:6749
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

Как видите, раб теперь назначен мастером Redis.

Попробуйте перезаписать ключ еще раз, и на этот раз он должен получиться:

set test 'this key was overwritten on the slave server'
Redis slave outputOK

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

Если есть какие-либо другие подчиненные устройства, укажите их вновь назначенному мастеру, чтобы продолжить репликацию изменений. Это можно сделать с помощью командыslaveof и информации о соединении нового мастера.

Чтобы вручную возобновить репликацию на исходный мастер, верните промежуточный мастер и подчиненные устройства к исходному мастеру с помощью командыslaveof со значениями, используемыми в файле конфигурации:

slaveof ip_to_contact_master port_to_contact_master
Redis slave outputOK

Если вы снова проверите ключ на ведомом устройстве, вы увидите, что мастер Redis восстановил исходное значение:

get test
Redis slave output"this key was defined on the master server"

По соображениям согласованности все данные на ведомом устройстве сбрасываются при повторной синхронизации с главным сервером.

Автоматическое продвижение Redis Slave

Автоматическое продвижение подчиненного устройства Redis требует координации с прикладным уровнем. Это означает, что реализация сильно зависит от среды приложения, что затрудняет предложение конкретных действий.

Однако мы можем пройти через общие шаги, необходимые для выполнения автоматического перехода на другой ресурс. В следующих шагах предполагается, что все серверы Redis настроены для доступа друг к другу:

  • Из приложения определите, что главный сервер больше не доступен.

  • На одном ведомом выполните командуslaveof no one. Это остановит репликацию и повысит ее до основного статуса.

  • Отрегулируйте любые настройки нового мастера, чтобы они соответствовали предыдущим настройкам мастера. Это можно сделать заранее в файле конфигурации для большинства параметров.

  • Прямой трафик из вашего приложения на недавно продвинутый мастер Redis.

  • На всех оставшихся подчиненных запуститеslaveof new_master_ip new_master_port. Это приведет к тому, что ведомые устройства прекратят репликацию со старого мастера, полностью отбросят свои (теперь устаревшие) данные и начнут репликацию с нового мастера.

После восстановления службы на исходном главном сервере вы можете либо разрешить ему вернуться в качестве ведомого, указывая на недавно назначенного главного, либо разрешить ему возобновить работу в качестве главного, если это необходимо.

Заключение

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

Related