Инструмент, который может анализировать, фильтровать, разделять, объединять RDB-файлы и анализировать использование памяти в автономном режиме. Он также может синхронизировать данные двух Redis и позволяет пользователю определять собственные службы приёмника для переноса данных Redis куда-либо.
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
# запуск с 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
$ docker build -m 8g -f DockerfileNative -t redisrdbcli:redis-rdb-cli .
$ docker run -it redisrdbcli:redis-rdb-cli bash
$ bash-5.1# rct -V
Добавьте /path/to/redis-rdb-cli/bin
в переменную среды Path
.
$ 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
$ rct -f dump -s /path/to/dump.rdb -o /path/to/dump.aof
$ rct -f json -s /path/to/dump.rdb -o /path/to/dump.json
$ rct -f count -s /path/to/dump.rdb -o /path/to/dump.csv
$ rct -f mem -s /path/to/dump.rdb -o /path/to/dump.mem -l 50
$ 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
$ rct -f resp -s /path/to/dump.rdb -o /path/to/appendonly.aof
$ rst -s redis://127.0.0.1:6379 -m redis://127.0.0.1:6380 -r
$ rst -s redis://127.0.0.1:6379 -m redis://127.0.0.1:30001 -r -d 0
# 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
$ 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.
$ 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.
$ rdt -b redis://192.168.1.105:6379 -o /path/to/dump.rdb
Создать резервную копию удалённого файла дампа Redis (rdb).
$ rdt -b redis://192.168.1.105:6379 -o /path/to/dump.rdb --goal 3
Сделать резервную копию удалённого файла дампа Redis и преобразовать базу данных в целевую.
$ rdt -b /path/to/dump.rdb -o /path/to/filtered-dump.rdb -d 0 -t string
Отфильтровать данные из файла дампа Redis.
$ rdt -s ./dump.rdb -c ./nodes.conf -o /path/to/folder -d 0
Разделить файл дампа Redis на основе конфигурации узлов кластера.
$ rdt -m ./dump1.rdb ./dump2.rdb -o ./dump.rdb -t hash
Объединить несколько файлов дампа Redis в один.
$ rcut -s ./aof-use-rdb-preamble.aof -r ./dump.rdb -a ./appendonly.aof
Вырезать преамбулу aof-use-rdb из файла aof и вставить её в файлы дампа Redis (rdb) и appendonly.
# 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, исходный Redis сначала выполняет BGSAVE и создаёт файл снимка rdb. Команда rmt переносит этот файл снимка на целевой Redis. После завершения этого процесса команда rmt завершается.
Команда rst не только переносит файл снимка rdb, но и инкрементные данные из исходного Redis. Поэтому команда rst никогда не завершается, кроме случаев, когда используется сочетание клавиш CTRL+C. Команда rst поддерживает только фильтрацию по базе данных.
С версии v0.1.9 команда rct -f mem поддерживает отображение результатов в панели инструментов Grafana следующим образом:
Если вы хотите включить эту функцию, вам необходимо установить 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
$ 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
Если исходный и целевой Redis используют одно и то же хранилище ключей, настройте следующие параметры: source_keystore_path и target_keystore_path, чтобы они указывали на /path/to/redis-6.0-rc1/tests/tls/redis.p12
. Установите source_keystore_pass и target_keystore_pass.
После настройки параметров SSL используйте rediss://host:port
в вашей команде для открытия SSL, например: rst -s rediss://127.0.0.1:6379 -m rediss://127.0.0.1:30001 -r -d 0
.
$ rst -s redis://user:pass@127.0.0.1:6379 -m redis://user:pass@127.0.0.1:6380 -r -d 0
+@all
для обработки команд.Команда 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
+---------------+ +-------------------+ restore +---------------+
| | | redis dump format |---------------->| |
| | |-------------------| restore | |
| | convert | redis dump format |---------------->| |
| Dump rdb |------------>|-------------------| restore | Targe Redis |
| | | redis dump format |---------------->| |
| | |-------------------| restore | |
| | | redis dump format |---------------->| |
+---------------+ +-------------------+ +---------------+
Пользователь должен выполнить следующие шаги для реализации службы приёмника:
<?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 )