Перемещение данных Redis с помощью репликации в Ubuntu 18.04

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

В этом мануале вы узнаете, как при помощи встроенных функций репликации Redis переместить данные с одного сервера Ubuntu 18.04 (исходного) на другой (целевой). Для этого вам нужно внести несколько изменений в конфигурации каждого сервера: настроить целевой сервер в качестве реплики исходного, а затем после завершения миграции вернуть реплике статус первичного сервера.

Требования

1: Создание тестовых данных (опционально)

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

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

Подключитесь к исходному серверу Redis:

ssh 8host@source_server_ip

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

redis-cli

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

auth source_redis_password

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

mset string1 "Redis" string2 "is" string3 "fun!"
hmset hash1 field1 "Redis" field2 "is" field3 "fast!"
rpush list1 "Redis" "is" "feature-rich!"
sadd set1 "Redis" "is" "free!"

Затем выполните следующие команды expire, чтобы завершить срок действия некоторых из этих ключей. Это сделает их непостоянными, и Redis удалит их через определенное время (в данном случае через 7500 секунд):

expire string2 7500
expire hash1 7500
expire set1 7500

Читайте также: Завершение срока действия ключей в Redis

Теперь у вас есть немного тестовых данных, которые вы можете экспортировать на целевой экземпляр Redis. Оставьте командную строку redis-cli открытой, так как на следующем этапе мы запустим еще несколько команд – теперь для резервного копирования этих данных.

2: Резервное копирование данных Redis

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

Если вы закрыли интерфейс командной строки Redis, откройте его снова:

redis-cli

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

auth password

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

bgsave

Примечание: Вы можете сделать снапшот своей базы данных Redis с помощью команд save или bgsave. Причина, по которой мы используем команду bgsave, заключается в том, что команда save выполняется синхронно – то есть она заблокирует всех клиентов, подключенных к базе данных. В документации команды save рекомендуется по возможности не использовать ее в производственной среде.

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

Обратите внимание: если клиенты добавляют или изменяют данные во время выполнения bgsave, эти изменения не будут зафиксированы в снапшоте.

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

exit

При необходимости вы можете найти файл дампа данных в рабочем каталоге вашего экземпляра Redis. Во время установки мы выбрали для своего экземпляра Redis рабочий каталог /var/lib/redis.

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

sudo ls /var/lib/redis

Если файл дампа был экспортирован правильно, вы увидите его в выводе этой команды. По умолчанию этот файл называется dump.rdb:

dump.rdb

После этого вы можете настроить исходный сервер Redis для приема внешних подключений и поддержки репликации.

3: Настройка исходного сервера Redis

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

Откройте конфигурационный файл исходного экземпляра Redis в текстовом редакторе:

sudo nano /etc/redis/redis.conf

Перейдите к строке, которая начинается с директивы bind. По умолчанию она будет выглядеть так:

. . .
bind 127.0.0.1
. . .

Эта директива связывает Redis с 127.0.0.1, loopback адресом IPv4, который представляет localhost. Это значит, что данный экземпляр Redis настроен на прослушивание соединений, которые исходят с того же сервера, на котором он установлен. Чтобы разрешить исходному экземпляру принимать любые подключения к его публичному IP-адресу (например, соединяться с целевым экземпляром), добавьте IP-адрес исходного сервера Redis после 127.0.0.1. Обратите внимание, что после 127.0.0.1 не следует ставить запятую:

. . .
bind 127.0.0.1 source_server_IP
. . .

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

. . .
requirepass source_redis_password
. . .

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

После этого вы можете сохранить и закрыть файл Redis.

Затем перезапустите сервис Redis, чтобы изменения вступили в силу:

sudo systemctl restart redis

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

sudo ufw allow 6379

Примечание: По умолчанию Redis использует порт 6379.

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

4: Настройка целевого экземпляра Redis

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

Подключитесь к целевому серверу Redis:

ssh 8host@target_server_ip

Затем откройте конфигурационный файл Redis вашего целевого сервера:

sudo nano /etc/redis/redis.conf

Если вы этого еще не сделали, вам следует настроить пароль для целевого экземпляра Redis с помощью директивы requirepass:

. . .
requirepass target_redis_password
. . .

Затем раскомментируйте директиву masterauth и установите в ней пароль исходного экземпляра Redis. Таким образом целевой сервер сможет использовать его для аутентификации на исходном сервере после включения репликации.

. . .
masterauth source_redis_password
. . .

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

Для этого вам нужно настроить директиву replica-read-only. По умолчанию для этого параметра установлено значение yes, что означает, что клиенты не смогут писать данные на реплику. Установите здесь значение no, чтобы разрешить клиентам записывать данные:

. . .
replica-read-only no
. . .

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

Затем перезапустите Redis, чтобы изменения вступили в силу:

sudo systemctl restart redis

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

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

5: Запуск и проверка репликации

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

Откройте интерфейс командной строки Redis на целевом сервере:

redis-cli

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

auth password

Затем превратите целевой экземпляр в реплику исходного с помощью команды replicaof. Обязательно замените source_server_ip внешним IP-адресом исходного экземпляра, а source_port — портом, который использует Redis на исходном экземпляре:

replicaof source_server_ip source_port

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

scan 0

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

1) "0"
2) 1) "string3"
2) "string1"
3) "set1"
4) "string2"
5) "hash1"
6) "list1"

Примечание: Учтите, что эта команда может вернуть ключи в другом порядке.

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

Пока у вас открыто соединение, вы также можете убедиться, что ключи, срок действия которых вы установили, по-прежнему являются непостоянными. Для этого запустите  команду ttl с одним из этих ключей в качестве аргумента:

ttl hash1

Это вернет количество секунд до истечения срока действия ключа, после чего он будет удален:

5430

Как только вы убедитесь, что данные исходного экземпляра были правильно синхронизированы с целевым экземпляром, вы можете присвоить целевому ведущую роль, выполнив команду replicaof. На этот раз вместо IP-адреса и порта укажите значение no one. Благодаря этому целевой экземпляр немедленно прекратит синхронизацию с исходным:

replicaof no one

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

scan 0

В выводе вы должны увидеть те же ключи:

1) "0"
2) 1) "string3"
2) "string1"
3) "set1"
4) "string2"
5) "hash1"
6) "list1"

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

Заключение

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

Tags: , ,

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