Репликация данных Redis в Ubuntu 16.04
Ubuntu | Комментировать запись
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: Redis, Ubuntu 16.04