Table of Contents
Введение
Redis — это хранилище данных типа ключ – значение в памяти, известное своей гибкостью, производительностью, широким набором поддерживаемых языков и встроенными функциями, включая *репликацию*. Репликация — это практика регулярного копирования данных из одной базы в другую для создания копии, которая всегда остается точным дубликатом основной версии. Одним из стандартных вариантов использования репликации в Redis является миграция существующего хранилища данных на новый сервер в случае масштабирования инфраструктуры для повышения производительности.
В этом обучающем руководстве описан процесс использования встроенных в Redis функций репликации для миграции данных с одного сервера Ubuntu 18.04 («источник») на другой («цель»). Этот процесс подразумевает внесение нескольких изменений в конфигурацию для каждого сервера, настройку целевого сервера для работы в виде копии источника, а затем возврат копии к начальному серверу после завершения миграции.
Предварительные требования
Для данного обучающего руководства вам потребуется следующее:
- Два сервера под управлением Ubuntu 18.04. Каждый сервер должен иметь пользователя с административными привилегиями и брандмауэр, настроенный с помощью
ufw. Для настройки этого окружения необходимо следовать указаниям обучающего руководства по начальной настройке сервера Ubuntu 18.04 для обоих серверов.
- Последняя версия Redis, установленная на каждом сервере. Для настройки воспользуйтесь нашим руководством Установка Redis из источника в Ubuntu 18.04.
Шаг 1 — (опциональный) Загрузка в экземпляр источника Redis образца данных
Этот опциональный шаг подразумевает загрузку в ваш экземпляр источника Redis примера данных, чтобы вы могли поэкспериментировать с миграцией данных в целевой экземпляр. Если у вас уже есть данные, которые вы хотите переместить, перейдите к [шагу 2](#step-2-—-backing-up-your-source-redis-instance), в котором описан процесс создания резервной копии.
Для начала подключитесь к серверу Ubuntu, который вы будете использовать в качестве экземпляр источника Redis, работая с вашим пользователем без прав root: Для начала подключитесь к серверу Ubuntu, который вы будете использовать в качестве исходного экземпляра Redis, который используется на вашем компьютере без прав root:
[environment local]
ssh <^>sammy<^>@<^>source_server_ip<^>
Затем выполните следующую команду для доступа к вашему серверу Redis: Затем выполните следующую команду для доступа к вашему серверу Redis:
redis-cli
Если вы настроили для вашего сервера аутентификацию по паролю, запустите команду 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-cli открытым на время, пока мы будем запускать несколько команд из него на следующем шаге, чтобы создать резервную копию этих данных.
Шаг 2 — Создание резервной копии экземпляра источника Redis
Каждый раз, когда вы планируете перенести данные с одного сервера на другой, существует риск того, что что-то может пойти не так, а вы в результате потеряете данные. Хотя этот риск невелик, мы будем использовать команду Redis bgsave для создания резервной копии вашей базы данных источника Redis на случай возникновения ошибки в процессе репликации.
Откройте интерфейс командной строки Redis, если вы этого еще не сделали:
redis-cli
Если вы настроили для вашего сервера аутентификацию по паролю, запустите команду 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:
[secondary_label Output]
<^>dump.rdb<^>
После подтверждения корректного резервного копирования данных следует настроить сервер источника Redis для приема внешних подключений и возможности выполнения репликации.
Шаг 3 — Настройка экземпляра источника Redis
По умолчанию Redis не настроен на прослушивание внешних подключений, то есть любые настроенные вами реплики не смогут синхронизироваться с вашим экземпляром источника, пока вы не обновите конфигурацию. Сейчас мы обновим файл конфигурации экземпляра источника, чтобы разрешить внешние подключения, а также установим пароль, который будет использоваться целевым экземпляром для аутентификации после запуска репликации. Затем мы добавим правило для брандмауэра, чтобы разрешить подключение к порту, на котором запущен Redis.
Откройте файл конфигурации экземпляра источника Redis в предпочитаемом вами текстовом редакторе. Мы будем использовать nano:
sudo nano /etc/redis/redis.conf
Перейдите в строку, которая начинается с директивы bind. По умолчанию она будет выглядеть следующим образом:
[label /etc/redis/redis.conf]
. . .
bind 127.0.0.1
. . .
Эта директива привязывает Redis к 127.0.0.1, кольцевому IPv4-адресу, представляющему localhost. Это означает, что этот экземпляр Redis настроен только для прослушивания подключений, поступающих с того же сервера, где он установлен. Чтобы разрешить вашему экземпляру принимать любое подключение, которое поступает на его публичный IP-адрес, например, подключение из целевого экземпляра, добавьте IP-адрес сервера вашего источника Redis после 127.0.0.1. Обратите внимание, что вам не нужно добавлять запятые после 127.0.0.1:
[label /etc/redis/redis.conf]
. . .
bind 127.0.0.1 <^>source_server_IP<^>
. . .
Далее, если вы еще не сделали этого, воспользуйтесь директивой requirepass для настройки пароля, который должен вводить пользователь, прежде чем он сможет взаимодействовать с данными экземпляра источника. Разкомментируйте директиву и установите сложный пароль или фразу-пароль:
[label /etc/redis/redis.conf]
. . .
requirepass <^>source_redis_password<^>
. . .
Обязательно запишите пароль, потому что он потребуется вам при настройке целевого сервера.
После этого вы можете сохранить и закрыть файл конфигурации Redis. Если вы использовали nano, нажмите CTRL+X, Y, затем ENTER.
Затем перезапустите службу Redis, чтобы эти изменения вступили в силу:
sudo systemctl restart redis
Это все, что вам требуется сделать для настройки Redis, но если вы настроили брандмауэр на вашем сервере, он будет продолжать блокировать любые попытки подключения вашего целевого сервера к источнику. Если вы настроили брандмауэр с помощью ufw, вы можете обновить его, чтобы разрешить подключение к порту, на котором запущен Redis с помощью следующей команды. Обратите внимание, что Redis настроен для использования порта 6379 по умолчанию:
sudo ufw allow <^>6379<^>
После внесения этого последнего изменения настройку вашего сервера источника Redis можно считать выполненной. Теперь вы можете перейти к настройке целевого экземпляра Redis, который будет использоваться в качестве копии источника.
Шаг 4 — Настройка экземпляра цели Redis
К этому вы настроили экземпляр источника Redis для принятия внешних подключений. Однако, поскольку вы закрыли доступ к источнику, разкомментировав директиву requirepass, ваш целевой экземпляр не сможет копировать данные, хранящиеся в источнике. Теперь вы должны настроить целевой экземпляр Redis, чтобы он мог выполнять аутентификацию при подключении к источнику для осуществления репликации.
Начнем с подключения к серверу цели Redis с помощью вашего пользователя без прав root:
[environment local]
ssh <^>sammy<^>@<^>target_server_ip<^>
Затем откройте файл конфигурации Redis вашего целевого сервера:
[environment second]
sudo nano /etc/redis/redis.conf
Если вы еще не сделали этого, вам нужно настроить пароль для экземпляра цели Redis с помощью директивы requirepass:
[environment second]
[label /etc/redis/redis.conf]
. . .
requirepass <^>target_redis_password<^>
. . .
Затем разкомментируйте директиву masterauth и настройте для нее пароль аутентификации экземпляра источника Redis. С помощью этого ваш целевой сервер сможет выполнять аутентификацию в экземпляре источника после обеспечения возможности репликации.
[environment second]
[label /etc/redis/redis.conf]
. . .
masterauth <^>source_redis_password<^>
. . .
Наконец, если у вас есть клиенты, осуществляющие запись в экземпляр источника, вы можете настроить для них запись также и в целевой экземпляр. Таким образом, если клиент записывает данные после того, как вы перевели цель на позицию основного источника, они не будут потеряны.
Для этого вам потребуется изменить директиву replica-read-only. По умолчанию для нее установлено значение yes, что означает, что она настроена для создания копии "только для чтения", в которую клиенты не смогут добавлять данные. Установите для этой директивы значение no, чтобы у клиентов появилась возможность записывать данные:
[environment second]
[label /etc/redis/redis.conf]
. . .
replica-read-only <^>no<^>
. . .
Это все изменения, которые вам нужно внести в файл конфигурации цели, поэтому вы можете сохранить и закрыть его.
Затем перезапустите службу Redis, чтобы эти изменения вступили в силу:
[environment second]
sudo systemctl restart redis
После перезагрузки службы Redis ваш целевой сервер будет готов к тому, чтобы стать копией источника. Чтобы сделать это, вам нужно будет запустить всего одну команду, что мы сделаем в ближайшее время.
Примечание: если у вас есть какие-либо клиенты, записывающие данные в экземпляр источника Redis, сейчас лучший момент, чтобы настроить для них запись и в ваш целевой экземпляр.
Шаг 5 — Запуск и подтверждение репликации
К этому моменту вы настроили для экземпляра источника Redis возможность подключения с целевого сервера, а также настроили для целевого экземпляра Redis аутентификацию в источнике в виде копии. После выполнения этих действий вы можете превратить ваш целевой экземпляр в копию источника.
Начнем с открытия интерфейса командной строки Redis на целевом сервере Redis:
[environment second]
redis-cli
Запустите команду auth для аутентификации подключения:
[environment second]
auth <^>password<^>
Затем превратите целевой экземпляр в копию источника с помощью команды replicaof. Обязательно замените <^>source_server_ip<^> на публичный IP-адрес вашего экземпляра источника, а <^>source_port<^> на порт, используемый Redis в вашем экземпляре источника:
[environment second]
replicaof <^>source_server_ip<^> <^>source_port<^>
Из запроса запустите следующую команду scan. Она возвращает все ключи, которые хранятся в копии:
[environment second]
scan 0
Если репликация работает ожидаемым образом, вы увидите все ключи из экземпляра источника, хранящиеся в копии. Если вы загрузили в источник данные из примера в шаге 1, вывод команды scan будет выглядеть примерно следующим образом:
[secondary_label Output]
[environment second]
1) "0"
2) 1) "string3"
2) "string1"
3) "set1"
4) "string2"
5) "hash1"
6) "list1"
Примечание: необходимо помнить, что эта команда может возвращать ключи в другом порядке, отличном от представленного в примере.
Однако, если эта команда не возвращает те же ключи, которые хранятся в экземпляре источника Redis, в одном из файлов конфигурации вашего сервера может быть ошибка, которая не дает целевой базе данных подключиться к источнику. В этом случае закройте подключение к целевому экземпляру Redis и еще раз проверьте, что вы внесли изменения в файлы конфигурации на вашем сервере источника и цели Redis корректно.
Пока ваше подключение открыто, вы можете также подтвердить, что ключи, для которых вы задали истекший срок действия, остаются волатильными. Чтобы сделать это, запустив команду ttl с одним из этих ключей в качестве аргумента:
[environment second]
ttl <^>hash1<^>
Она возвращает количество секунд до того, как ключ будет удален:
[environment second]
[secondary_label Output]
<^>5430<^>
Убедившись, что данные в вашем экземпляре источника были корректно синхронизированы с целью, вы можете сделать цель основным экземпляром, запустив команду replicaof еще раз. На этот раз вместо того, чтобы добавлять к replicaof IP-адрес и порт, добавьте no one. Это приведет к тому, что целевой экземпляр остановит синхронизацию с источником немедленно:
[environment second]
replicaof no one
Чтобы подтвердить, что данные, скопированные из источника, сохраняются в цели, перезапустите команду scan, которую вы запускали ранее:
[environment second]
scan 0
Вы должны увидеть те же самые ключи в выводе этой команде, которые вы видели после запуска scan, когда цель выполняла репликацию источника:
[environment second]
[secondary_label Output]
1) "0"
2) 1) "string3"
2) "string1"
3) "set1"
4) "string2"
5) "hash1"
6) "list1"
Вы успешно выполнили миграцию всех данных из экземпляра источника Redis в целевой экземпляр. Если у вас есть какие-либо клиенты, которые до сих пор записывают данные в экземпляр источника, сейчас оптимальное время, чтобы настроить для них запись только в целевой экземпляр.
Заключение
Помимо репликации, существует несколько методов миграции данных из одного экземпляра Redis в другой экземпляр, но репликация обладает преимуществами, требуя относительно небольшого числа изменений конфигурации, а также только одной команды для запуска или остановки.
Если вы хотите узнать больше о работе с Redis, мы рекомендуем ознакомиться с серией Управление базой данных Redis. Также, если вы хотите переместить ваши данные Redis в экземпляр Redis, управляемый the cloud provider, воспользуйтесь указаниями нашего руководства.