Репликация данных Redis в Ubuntu 16.04

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

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

Это руководство  поможет настроить репликацию между двумя серверами Ubuntu 16.04.

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

Требования

  • Два сервера Ubuntu 16.04: один из них будет ведущим (или master), а второй – ведомым сервером (или slave).
  • Пользователь с доступом к sudo на каждом сервере. О настройке такого пользователя можно прочитать здесь.

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

Сначала нужно установить 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

Если установка и запуск Redis прошли успешно, вы увидите ответ:

PONG

2: Защита трафика между двумя серверами

Примечание: Данный раздел нужно выполнить на всех серверах.

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

Изолированная сеть

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

Откройте конфигурационный файл Redis:

sudo nano /etc/redis/redis.conf

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

bind 127.0.0.1 isolated_IP_address

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

sudo systemctl restart redis-server.service

Откройте порт Redis в брандмауэре:

sudo ufw allow 6379

Теперь серверы могут взаимодействовать друг с другом. Чтобы убедиться в этом, используйте командную строку redis-cli. Запустите:

redis-cli -h isolated_IP_address ping
PONG

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

Инструменты шифрования

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

  • Инструмент stunnel – инструмент для туннелирования. Позволяет настроить входящий туннель на сервере redis и исходящий туннель на сервере web. Сервер web будет подключаться к локальному порту для связи с удаленным сервисом Redis.
  • Инструмент spiped: сервер web будет использоваться в качестве клиента spiped.на каждом сервере нужно создать юнит-файл system. Сервер web будет подключаться к локальному порту для связи с удаленным сервисом Redis.
  • PeerVPN: оба сервера будут помещены в VPN. Сервер web будет подключаться к серверу redis с помощью IP-адреса VPN.

Выберите один из предложенных методов и зашифруйте трафик между серверами.

3: Настройка master-сервера Redis

Теперь все готово к настройке ведущего сервера Redis.

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

sudo nano /etc/redis/redis.conf

Найдите параметр tcp-keepalive и установите значение 60. Так Redis сможет определять сбои сети или сервиса.

. . .
tcp-keepalive 60
. . .

Затем найдите директиву requirepass. Выберите сложный пароль и введите его в эту строку. Ранее вы защитили трафик Redis от постороннего вмешательства, а теперь, с помощью директивы requirepass, вы настроили аутентификацию Redis. Redis не ограничивает количество попыток ввода пароля, потому пароль должен быть очень сложным – иначе его могут подобрать с помощью brute force атаки.

requirepass your_redis_master_password

Теперь нужно установить несколько опциональных параметров. Эти настройки зависят от целей сервера.

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

maxmemory-policy noeviction

Также вы можете настроить длительное хранение данных. Это позволяет минимизировать потерю данных в случае сбоя системы, но может замедлить производительность.

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

Сохраните и закройте файл.

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

sudo systemctl restart redis-server.service

Теперь master-сервер нужно протестировать.

4: Тестирование master-сервера Redis

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

redis-cli

Попробуйте запустить команду, не проходя аутентификацию:

info replication

Сервер должен ответить:

NOAUTH Authentication required.

Если сервер требует авторизоваться, значит, настройка прошла успешно.

Чтобы пройти аутентификацию, введите команду auth и пароль:

auth your_redis_master_password

Сервер ответит:

OK

Теперь снова попробуйте запустить команду:

info replication
# 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: Настройка slave-сервера Redis

Теперь нужно подготовить ведомый сервер к взаимодействию с master-сервером.

Перейдите на slave-сервер и откройте файл /etc/redis/redis.conf.

sudo nano /etc/redis/redis.conf

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

Значения зависят от метода защиты трафика (раздел 2).

Если серверы работают в изолированной сети, вам нужно использовать IP-адрес этой сети и стандартный порт 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

Общий синтаксис директивы slaveof имеет такой вид:

slaveof ip_to_contact_master port_to_contact_master

Раскомментируйте строку masterauth и укажите в ней пароль master-сервера Redis.

masterauth your_redis_master_password

Чтобы предотвратить несанкционированный доступ, установите пароль для slave-сервера.

requirepass your_redis_slave_password

Сохраните и закройте файл.

6: Тестирование slave-сервера и обновление настроек

Прежде чем перезапустить сервис, чтобы обновить настройки, попробуйте подключиться к локальному экземпляру Redis на slave-машине и убедитесь, что у неё нет доступа к тестовому ключу.

redis-cli

Запросите тестовый ключ:

get test

На экране появится:

(nil)

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

exit

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

sudo systemctl restart redis-server.service

Это обновит настройки сервиса.

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

redis-cli

Как и в случае с master-сервером Redis, неавторизованному пользователю будет отказано в доступе к данным.

get test
(error) NOAUTH Authentication required.

Пройдите аутентификацию:

auth your_redis_slave_password
OK

Попробуйте ещё раз получить доступ к тестовому ключу. Теперь данные будут доступны:

get test
"this key was defined on the master server"

Репликация данных запустилась сразу же после обновления настроек сервиса Redis.

Чтобы убедиться в этом, используйте команду info, которая выводит сведения о репликации.

Примечание: Замените master_host и master_port значениями, указанными в директиве slaveof.

info replication
# 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

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

info replication
# 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

Как видите, серверы master и slave могут взаимодействовать.

7: Изменение ролей серверов slave и master

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

Повышение slave вручную

Повысить статус slave-сервера можно вручную. Введите команду:

redis-cli

Введите пароль slave-сервера, чтобы пройти аутентификацию:

auth your_redis_slave_password

Создайте новый тестовый ключ, чтобы в дальнейшем проверить настройку:

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

Эта команда вернёт ошибку, так как по умолчанию ведомые серверы Redis существуют в режиме только для чтения (опция slave-read-only yes).

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

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

slaveof no one
OK

Снова запросите сведения о репликации:

info replication
# 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

Как видите, slave-сервер стал master-сервером Redis.

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

Если у вас несколько slave-серверов, их нужно переключить на новый master-сервер, чтобы продолжить репликацию. Для этого используйте команду slaveof.

Чтобы вручную восстановить исходный master-сервер, перенаправьте на него новый master (и остальные серверы slave, если такие есть) при помощи slaveof:

slaveof ip_to_contact_master port_to_contact_master
OK

Запросите тестовый ключ на ведомом сервере:

get test
"this key was defined on the master server"

Для целостности информации все данные сервера slave ресинхронизируются с новым master.

Автоматическое изменение статуса slave-сервера

Автоматическое повышение slave-сервера Redis требует согласования на уровне приложения. Реализация такой настройки зависит от среды приложения, потому составить общий план действий довольно сложно – настройка во многом индивидуальна для каждого сервера.

Рассмотрим наиболее общие этапы настройки автоматического обхода сбоев.

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

  • Определите сбой мастера на уровне приложения.
  • Перейдите на slave и запустите slaveof no one. Это остановит репликацию и повысит его статус до master.
  • Откорректируйте настройки нового сервера master (они должны совпадать с настройками предыдущего master-сервера). В большинстве случаев это можно сделать заранее.
  • Перенаправьте трафик приложения на новый master-сервер.
  • Если у вас несколько серверов slave, выполните на каждом из них такую команду:

slaveof new_master_ip new_master_port.

Эта команда остановит репликацию, обновит данные ведомых серверов и запустит репликацию с новым master-сервером.

Заключение

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

Данное руководство охватывает только основы настройки репликации master-slave на серверах Redis. Чтобы получить больше информации об использовании Redis, ознакомьтесь со специальным разделом нашего Информатория.

Tags: ,

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