1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/leonchen83-redis-cli-tool

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Инструмент, который может анализировать, фильтровать, разделять, объединять RDB-файлы и анализировать использование памяти в автономном режиме. Он также может синхронизировать данные двух Redis и позволяет пользователю определять собственные службы приёмника для переноса данных Redis куда-либо.

Чат с автором

Присоединяйтесь к чату на https://gitter.im/leonchen83/redis-rdb-cli

Свяжитесь с автором:

chen.bao.yi@gmail.com

Двоичный релиз:

двоичные релизы

Требования к среде выполнения:

jdk 1.8+

Установка:

$ wget https://github.com/leonchen83/redis-rdb-cli/releases/download/${version}/redis-rdb-cli-release.zip
$ unzip redis-rdb-cli-release.zip
$ cd ./redis-rdb-cli/bin
$ ./rct -h

Компиляция:


jdk 1.8+
maven-3.3.1+

Сборка и запуск:

$ git clone https://github.com/leonchen83/redis-rdb-cli.git
$ cd redis-rdb-cli
$ mvn clean install -Dmaven.test.skip=true
$ cd target/redis-rdb-cli-release/redis-rdb-cli/bin
$ ./rct -h 

Запуск в Docker:

# запуск с jvm
$ docker run -it --rm redisrdbcli/redis-rdb-cli:latest
$ rct -V

# запуск без jvm
$ docker run -it --rm redisrdbcli/redis-rdb-cli:latest-native
$ rct -V

Создание собственного образа через graalvm в Docker:

$ docker build -m 8g -f DockerfileNative -t redisrdbcli:redis-rdb-cli .
$ docker run -it redisrdbcli:redis-rdb-cli bash
$ bash-5.1# rct -V

Переменные среды Windows:

Добавьте /path/to/redis-rdb-cli/bin в переменную среды Path.

Использование:

Массовая вставка Redis:


$ rct -f dump -s /path/to/dump.rdb -o /path/to/dump.aof -r
$ cat /path/to/dump.aof | /redis/src/redis-cli -p 6379 --pipe

Преобразование RDB в формат дампа:

$ rct -f dump -s /path/to/dump.rdb -o /path/to/dump.aof

Преобразование RDB в JSON:

$ rct -f json -s /path/to/dump.rdb -o /path/to/dump.json

Количество ключей в RDB:

$ rct -f count -s /path/to/dump.rdb -o /path/to/dump.csv

Поиск 50 крупнейших ключей:

$ rct -f mem -s /path/to/dump.rdb -o /path/to/dump.mem -l 50

Сравнение RDB:

$ rct -f diff -s /path/to/dump1.rdb -o /path/to/dump1.diff
$ rct -f diff -s /path/to/dump2.rdb -o /path/to/dump2.diff
$ diff /path/to/dump1.diff /path/to/dump2.diff

Преобразование RDB в RESP:

$ rct -f resp -s /path/to/dump.rdb -o /path/to/appendonly.aof

Синхронизация с двумя Redis:

$ rst -s redis://127.0.0.1:6379 -m redis://127.0.0.1:6380 -r

Синхронная передача данных из одного Redis в кластер Redis:

$ rst -s redis://127.0.0.1:6379 -m redis://127.0.0.1:30001 -r -d 0

Обработка бесконечного цикла в команде rst:

# set client-output-buffer-limit in source redis
$ redis-cli config set client-output-buffer-limit "slave 0 0 0"
$ rst -s redis://127.0.0.1:6379 -m redis://127.0.0.1:6380 -r

Перенос RDB на удалённый Redis:

$ rmt -s /path/to/dump.rdb -m redis://192.168.1.105:6379 -r

Обратная миграция:


# Migrate data from redis-7 to redis-6
# About dump_rdb_version please see comment in redis-rdb-cli.conf
$ sed -i **s/dump_rdb_version=-1/dump_rdb_version=9/g /path/to/redis-rdb-cli/conf/redis-rdb-cli.conf**

*Заменить строку dump_rdb_version = -1 на dump_rdb_version = 9 в файле /path/to/redis-rdb-cli/conf/redis-rdb-cli.conf.*

**$ rmt -s redis://com.redis7:6379 -m redis://com.redis6:6379 -r**

*Выполнить команду rmt с параметрами -s, redis://com.redis7:6379, -m, redis://com.redis6:6379 и -r.*

### Handle big key in migration

```shell
# set proto-max-bulk-len in target redis
$ redis-cli -h ${host} -p 6380 -a ${pwd} config set proto-max-bulk-len 2048mb

# set Xms Xmx in redis-rdb-cli node
$ export JAVA_TOOL_OPTIONS="-Xms8g -Xmx8g"

# execute migration
$ rmt -s redis://127.0.0.1:6379 -m redis://127.0.0.1:6380 -r

Настроить параметр proto-max-bulk-len в целевом Redis, используя команду redis-cli.

Установить значения Xms и Xmx для JAVA_TOOL_OPTIONS.

Выполнить миграцию данных, используя команду rmt.

Migrate rdb to remote redis cluster

$ rmt -s /path/to/dump.rdb -c ./nodes-30001.conf -r

или просто использовать следующую команду без nodes-30001.conf

$ rmt -s /path/to/dump.rdb -m redis://127.0.0.1:30001 -r

Мигрировать файл дампа (dump.rdb) на удалённый кластер Redis.

Backup remote rdb

$ rdt -b redis://192.168.1.105:6379 -o /path/to/dump.rdb

Создать резервную копию удалённого файла дампа Redis (rdb).

Backup remote rdb and convert db to dest db

$ rdt -b redis://192.168.1.105:6379 -o /path/to/dump.rdb --goal 3

Сделать резервную копию удалённого файла дампа Redis и преобразовать базу данных в целевую.

Filter rdb

$ rdt -b /path/to/dump.rdb -o /path/to/filtered-dump.rdb -d 0 -t string

Отфильтровать данные из файла дампа Redis.

Split rdb via cluster's nodes.conf

$ rdt -s ./dump.rdb -c ./nodes.conf -o /path/to/folder -d 0

Разделить файл дампа Redis на основе конфигурации узлов кластера.

Merge multi rdb to one

$ rdt -m ./dump1.rdb ./dump2.rdb -o ./dump.rdb -t hash

Объединить несколько файлов дампа Redis в один.

Cut aof-use-rdb-preamble file to rdb file and aof file

$ rcut -s ./aof-use-rdb-preamble.aof -r ./dump.rdb -a ./appendonly.aof

Вырезать преамбулу aof-use-rdb из файла aof и вставить её в файлы дампа Redis (rdb) и appendonly.

Monitor redis server

# step1 
# open file `/path/to/redis-rdb-cli/conf/redis-rdb-cli.conf`
# change property `metric_gateway from `none` to `influxdb`
#
# step2
$ cd /path/to/redis-rdb-cli/dashboard
$ docker-compose up -d
#
# step3
$ rmonitor -s redis://127.0.0.1:6379 -n standalone
$ rmonitor -s redis://127.0.0.1:30001 -n cluster
$ rmonitor -s redis-sentinel://sntnl-usr:sntnl-pwd@127.0.0.1:26379?master=mymaster&authUser=usr&authPassword=pwd -n sentinel
#
# step4
# open url `http://localhost:3000/d/monitor/monitor`, login grafana use `admin`, `admin` and check monitor result.

Мониторинг сервера Redis.

Разница между rmt и rst

  1. Когда запускается rmt, исходный Redis сначала выполняет BGSAVE и создаёт файл снимка rdb. Команда rmt переносит этот файл снимка на целевой Redis. После завершения этого процесса команда rmt завершается.

  2. Команда rst не только переносит файл снимка rdb, но и инкрементные данные из исходного Redis. Поэтому команда rst никогда не завершается, кроме случаев, когда используется сочетание клавиш CTRL+C. Команда rst поддерживает только фильтрацию по базе данных.

Dashboard

С версии v0.1.9 команда rct -f mem поддерживает отображение результатов в панели инструментов Grafana следующим образом:

memory

Если вы хотите включить эту функцию, вам необходимо установить Docker и Docker Compose. Затем выполните следующую команду:

$ cd /path/to/redis-rdb-cli/dashboard

# start
$ docker-compose up -d

# stop
$ docker-compose down

Измените параметр metric_gateway с none на influxdb.

Откройте http://localhost:3000, чтобы проверить результаты команды rct -f mem.

Если вы развернули этот инструмент в нескольких экземплярах, вам нужно изменить параметр metric_instance, чтобы обеспечить уникальность между экземплярами. Redis 6

Redis 6 SSL

  1. Используйте openssl для создания хранилища ключей:
$ cd /path/to/redis-6.0-rc1
$ ./utils/gen-test-certs.sh
$ cd tests/tls
$ openssl pkcs12 -export -CAfile ca.crt -in redis.crt -inkey redis.key -out redis.p12
  1. Если исходный и целевой Redis используют одно и то же хранилище ключей, настройте следующие параметры: source_keystore_path и target_keystore_path, чтобы они указывали на /path/to/redis-6.0-rc1/tests/tls/redis.p12. Установите source_keystore_pass и target_keystore_pass.

  2. После настройки параметров SSL используйте rediss://host:port в вашей команде для открытия SSL, например: rst -s rediss://127.0.0.1:6379 -m rediss://127.0.0.1:30001 -r -d 0.

Redis 6 ACL

  1. Для открытия поддержки Redis ACL используйте следующий URI:
$ rst -s redis://user:pass@127.0.0.1:6379 -m redis://user:pass@127.0.0.1:6380 -r -d 0
  1. Пользователь ДОЛЖЕН иметь разрешение +@all для обработки команд.

Hack rmt

Модель потоков Rmt

Команда rmt использует следующие 4 параметра (redis-rdb-cli.conf) для миграции данных в удалённый репозиторий:

migrate_batch_size=4096
migrate_threads=4
migrate_flush=yes
migrate_retries=1

Самый важный параметр — migrate_threads=4, это означает, что мы используем следующую модель потоков для миграции данных:

Миграция данных из одного экземпляра Redis в другой


single redis ----> single redis

+--------------+         +----------+     thread 1      +--------------+
|              |    +----| Endpoint |-------------------|              |
|              |    |    +----------+                   |              |
|              |    |                                   |              |
|              |    |    +----------+     thread 2      |              |
|              |    |----| Endpoint |-------------------|              |
|              |    |    +----------+                   |              |
| Source Redis |----|                                   | Target Redis |
|              |    |    +----------+     thread 3      |              |
|              |    |----| Endpoint |-------------------|              |
|              |    |    +----------+                   |              |
|              |    |                                   |              |
|              |    |    +----------+     thread 4      |              |
|              |    +----| Endpoint |-------------------|              |
+--------------+         +----------+                   +--------------+

Миграция данных из одного экземпляра Redis в кластер Redis


single redis ----> redis cluster

+--------------+         +----------+     thread 1      +--------------+
|              |    +----| Endpoints|-------------------|              |
|              |    |    +----------+                   |              |
|              |    |                                   |              |
|              |    |    +----------+     thread 2      |              |
|              |    |----| Endpoints|-------------------|              |
|              |    |    +----------+                   |              |
| Source Redis |----|                                   | Redis cluster|
|              |    |    +----------+     thread 3      |              |
|              |    |----| Endpoints|-------------------|              |
|              |    |    +----------+                   |              |
|              |    |                                   |              |
|              |    |    +----------+     thread 4      |              |
|              |    +----| Endpoints|-------------------|              |
+--------------+         +----------+                   +--------------+ **Миграция кластера и одиночная миграция — это «Endpoint» и «Endpoints»**. В миграции кластера «Endpoints» содержит несколько «Endpoint», указывающих на каждый экземпляр «master» в кластере. Например:

3 мастера, 3 реплики redis-кластера. Если migrate_threads=4, то у нас будет 3 * 4 = 12 соединений, которые связаны с экземпляром «master».

### Производительность миграции

Следующие 3 параметра влияют на производительность миграции:

```properties
migrate_batch_size=4096
migrate_retries=1
migrate_flush=yes
  1. migrate_batch_size: По умолчанию мы используем redis pipeline для миграции данных в удалённое хранилище. Размер пакета «pipeline» задаётся параметром migrate_batch_size. Если migrate_batch_size = 1, то «pipeline» превращается в одну команду, которая отправляется и ожидает ответа от удалённого хранилища.
  2. migrate_retries: Значение migrate_retries = 1 означает, что при возникновении ошибки сокета мы воссоздаём новый сокет и пытаемся отправить неудавшуюся команду в целевой redis указанное количество раз.
  3. migrate_flush: Значение migrate_flush = yes означает, что мы записываем каждую 1 команду в сокет, а затем немедленно вызываем SocketOutputStream.flush(). Если migrate_flush = no, мы вызываем SocketOutputStream.flush() при записи в сокет каждые 64 КБ. Обратите внимание, что этот параметр также влияет на migrate_retries. Параметр migrate_retries действует только тогда, когда migrate_flush = yes.

Принцип миграции

+---------------+             +-------------------+    restore      +---------------+
|               |             | redis dump format |---------------->|               |
|               |             |-------------------|    restore      |               |
|               |   convert   | redis dump format |---------------->|               |
|    Dump rdb   |------------>|-------------------|    restore      |  Targe Redis  |
|               |             | redis dump format |---------------->|               |
|               |             |-------------------|    restore      |               |
|               |             | redis dump format |---------------->|               |
+---------------+             +-------------------+                 +---------------+

Ограничения миграции

  1. Мы используем cluster's nodes.conf для миграции данных в кластер. Из-за этого мы не обрабатываем перенаправления MOVED и ASK. Поэтому ограничение миграции кластера заключается в том, что кластер ДОЛЖЕН находиться в стабильном состоянии во время миграции. Это означает, что в кластере НЕ ДОЛЖНО быть мигрирующих, импортируемых слотов и переключения ведомых устройств на мастер.
  2. При использовании rst для переноса данных в кластер следующие команды не поддерживаются: PUBLISH,SWAPDB,MOVE,FLUSHALL,FLUSHDB,MULTI,EXEC,SCRIPT FLUSH,SCRIPT LOAD,EVAL,EVALSHA. А следующие команды RPOPLPUSH,SDIFFSTORE,SINTERSTORE,SMOVE,ZINTERSTORE,ZUNIONSTORE,DEL,UNLINK,RENAME,RENAMENX,PFMERGE,PFCOUNT,MSETNX,BRPOPLPUSH,BITOP,MSET,COPY,BLMOVE,LMOVE,ZDIFFSTORE,GEOSEARCHSTORE ПОДДЕРЖИВАЮТСЯ ТОЛЬКО ТОГДА, КОГДА ЭТИ КОМАНДЫ НАХОДЯТСЯ В ОДНОМ СЛОТЕ(например: del {user}:1 {user}:2).

Команда ret

Что делает команда ret

  1. Команда ret позволяет пользователю определять собственные службы приёмника, такие как приёмник данных redis в mysql или mongodb.
  2. Команда ret использует Java SPI-расширение для выполнения этой задачи.

Как реализовать службу приёмника

Пользователь должен выполнить следующие шаги для реализации службы приёмника:

  1. Создать проект Java с использованием maven pom.xml.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.your.company</groupId>
    <artifactId>your-sink-service</artifactId>
    <version>1.0.0</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.moilioncircle</groupId>
``` **1.**

int version, byte[] key, int type, ContextKeyValuePair context) throws IOException {
    byte[] val = new DefaultRdbValueVisitor(replicator).applyString(in, version);
    getEscaper().encode(key, getOutputStream());
    getEscaper().encode(val, getOutputStream());
    getOutputStream().write('\n');
    return context;
}
**2.** Зарегистрируйте этот форматтер с помощью Java SPI.

# Создайте файл com.moilioncircle.redis.rdb.cli.api.format.FormatterService в src/main/resources/META-INF/services/

|-src
|____main
| |____resources
| | |____META-INF
| | | |____services
| | | | |____com.moilioncircle.redis.rdb.cli.api.format.FormatterService

# Добавьте следующее содержимое в com.moilioncircle.redis.rdb.cli.api.format.FormatterService:

your.package.YourFormatterService
**3.** Соберите и разверните.

$ mvn clean install

$ cp ./target/your-service-1.0.0-jar-with-dependencies.jar /path/to/redis-rdb-cli/lib
**4.** Запустите сервис форматирования.

$ rct -f test -s redis://127.0.0.1:6379 -o ./out.csv -t string -d 0 -e json
## Участники
* Баойи Чен (https://github.com/leonchen83)
* Цзиньтао Чжан (https://github.com/tao12345666333)
* Маз Ахмади (https://github.com/cmdshepard)
* Аниш Карандикар (https://github.com/anishkny)
* Эйр (https://github.com/air3ijai)
* Рагху Нандан Б С (https://github.com/raghu-nandan-bs)

Особая благодарность Kater Technologies (https://www.kater.com/)
## Консалтинг

Коммерческая поддержка для redis-rdb-cli доступна. В настоящее время доступны следующие услуги:
* Консультирование на месте. 10 000 долларов США в день
* Обучение на месте. 10 000 долларов США в день.
Вы также можете связаться с Баойи Чен напрямую, написав по адресу chen.bao.yi@gmail.com.
## Поддерживается Нин Вэньцзюнь

27 января 2023 года, печальный день, когда я потерял свою мать Нин Вэньцзюнь. Она поддерживала меня и вдохновляла на разработку этого инструмента. Каждый раз, когда компания использовала этот инструмент, она радовалась как ребёнок и призывала меня продолжать. Без неё я не смог бы поддерживать этот инструмент так долго. Даже если я не достиг многого, она всё равно гордилась мной. Покойся с миром, и надеюсь, что Бог благословит её.
## Поддерживается IntelliJ IDEA

IntelliJ IDEA (https://www.jetbrains.com/?from=redis-rdb-cli) — это интегрированная среда разработки (IDE) для создания компьютерного программного обеспечения на Java. Разработана компанией JetBrains (ранее известной как IntelliJ) и доступна в виде бесплатной версии сообщества под лицензией Apache 2, а также в платной коммерческой версии. Обе версии можно использовать для коммерческого развития.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Redis rdb CLI — это инструмент командной строки, который может анализировать, фильтровать, разделять, объединять RDB-файлы и изучать использование памяти в автономном режиме. Он также может синхронизировать данные двух серверов Redis и позволяет пользователям определять собственные сервисы приёмников для переноса данных Redis в другое место. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/leonchen83-redis-cli-tool.git
git@api.gitlife.ru:oschina-mirror/leonchen83-redis-cli-tool.git
oschina-mirror
leonchen83-redis-cli-tool
leonchen83-redis-cli-tool
master