Перейти к основному содержимому

Перенести данные Redis в облачную базу данных Redis

Вы можете перенести данные Redis и Valkey в Selectel с непрерывной синхронизацией и минимальным простоем с помощью RedisShake.

RedisShake подключается к исходному Redis как реплика. Сначала он переносит снимок данных (RDB) и журнал операций (AOF), а потом непрерывно передает новые изменения в целевой Redis, пока синхронизацию не остановят. Приложения можно переключить на новый Redis, пока синхронизация еще идет, поэтому простой минимальный.

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

Требования

Для небольших инсталляций RedisShake хватит 2 ядер CPU, 4 ГБ RAM и 10 ГБ на диске. Место на диске зависит от размера файлов RDB и AOF (параметры sync_rdb и sync_aof). Для больших объемов данных нужную производительность CPU стоит оценить по тестам в документации RedisShake.

Дополнительно нужны:

  • сетевой доступ из окружения RedisShake к исходному и целевому Redis;
  • RedisShake 4.x;
  • Docker и Docker Compose или кластер Kubernetes, если RedisShake запускается в контейнере.

Перенести данные

  1. Установите RedisShake.

  2. Настройте RedisShake.

  3. Запустите синхронизацию.

  4. Опционально: проверьте статус переноса.

  5. Завершите перенос.

1. Установить RedisShake

  1. Скачайте бинарный файл из репозитория RedisShake на GitHub. Вы также можете скачать Docker-образ:

    docker pull ghcr.io/tair-opensource/redisshake:latest
  2. Если Redis защищен паролем, передайте его:

    redis-cli -h 127.0.0.1 -p 6379 -a '<password>'

    Укажите <password> — пароль Redis.

  3. Убедитесь, что исходный Redis доступен из окружения, где будет работать RedisShake:

    redis-cli -h <host> -p <port> ping
    telnet <host> <port>

    Укажите:

    • <host> — адрес Redis;
    • <port> — стандартный порт Redis.
  4. Проверьте состояние кластера и список узлов для Redis Cluster:

    redis-cli -h <host> -p <port> cluster info
    redis-cli -h <host> -p <port> cluster nodes

    Укажите:

    • <host> — адрес Redis;
    • <port> — стандартный порт Redis.
  5. Проверьте использование памяти:

    redis-cli -h <host> -p <port> info memory

    Укажите:

    • <host> — адрес Redis;
    • <port> — стандартный порт Redis.
  6. Повторите шаги 3—5 для проверки целевого Redis.

2. Настроить RedisShake

  1. Откройте CLI.

  2. Откройте файл shake.toml в текстовом редакторе.

  3. Задайте параметры синхронизации. Если исходный или целевой Redis — Redis Cluster, укажите для него cluster = true. Полный справочник параметров shake.toml в репозитории RedisShake на GitHub.

[sync_reader]
cluster = false
address = "<source_address>:6379"
username = ""
password = ""
tls = false
sync_rdb = true
sync_aof = true
# prefer_replica = false
# try_diskless = false

[redis_writer]
cluster = false
address = "<target_address>:6379"
username = ""
password = ""
tls = false
off_reply = false

Укажите:

  • <source_address> — адрес исходного Redis;
  • <target_address> — адрес целевого Redis.

3. Запустить синхронизацию

Перед запуском проверьте, что конфигурационный файл shake.toml заполнен и лежит по нужному пути.

  1. Откройте CLI.

  2. Подготовьте docker-compose.yaml:

    services:
    redis-shake:
    image: ghcr.io/tair-opensource/redisshake:latest
    container_name: redis-shake
    volumes:
    - ./shake.toml:/app/shake_sync_env.toml:ro
    - ./data:/app/data
    environment:
    SYNC: "true"
  3. Запустите Docker Compose:

    docker compose up -d

4. Опционально: проверить статус миграции

Во время синхронизации RedisShake постоянно пишет в журнал статус и текущие операции. По журналу можно отследить, сколько изменений еще осталось.

  1. Откройте CLI.

  2. Включите отображение логов RedisShake в реальном времени:

    tail -f data/shake.log
  3. Сверьте количество ключей в исходном и целевом Redis:

    redis-cli -h <source_host> -p <source_port> dbsize
    redis-cli -h <target_host> -p <target_port> dbsize

    Укажите:

    • <source_host> — адрес исходного Redis;
    • <source_port> — порт исходного Redis;
    • <target_host> — адрес целевого Redis;
    • <target_port> — порт целевого Redis.

5. Завершить миграцию

  1. Переключите приложения на новый Redis, пока синхронизация еще работает. Так не потеряются изменения, сделанные до переключения.

  2. Когда все данные перенеслись, остановите RedisShake тем же способом, которым запускали.

    1. Откройте CLI.

    2. Остановите и удалите контейнеры:

      docker compose down