1.前言
1.只支持单机kvrocks到单机redis的迁移
2.单机redis需要支持flushdb命令,若rename-command更改flushdb名称,需要更改回来
3.支持两个kvrocks中两个namespace间数据同步,数据可续传4.kvrocks2redis工具要和kvrocks在同机器上,且同步过程中会产生大的aof文件,适用于小体量的同步迁移
5.如果想kvrocks到kvrocks同步,可以通过创建主从的方式,从节点支持设置slave-read-only no实现从可写操作,从而实现实时同步
2.编译
1.git clone https://github.com/KvrocksLabs/kvrocks
cd incubator-kvrocks
git checkout v2.1.0
2.将下边的Dockerfile文件替换,即可编译,编译时间较久,需要的文件提前下载
# 容器中执行编译即可
# ./x.py build --ghproxy -DENABLE_STATIC_LIBSTDCXX=OFF'若编译kvrocks需要二进制文件更小,可以添加-DCMAKE_BUILD_TYPE=Release参数编译'
FROM centos:7
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /kvrocks
COPY . .
RUN yum install -y git make autoconf automake libtool python3 which
RUN yum -y install centos-release-scl \
&& yum -y install devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils \
&& echo "source /opt/rh/devtoolset-11/enable" >> ~/.bashrc
RUN mv cmake-3.17.1-Linux-x86_64.tar.gz /opt/ \
&& cd /opt && tar -zxvf cmake-3.17.1-Linux-x86_64.tar.gz \
&& ln -sf /opt/cmake-3.17.1-Linux-x86_64/bin/* /usr/bin/
3.迁移工具kvrocks2redis
'前提:'
1.redis需要支持flushdb命令
2.支持两个kvrocks中两个namespace间数据同步,数据可续传,缺点aof文件无限增长
3.备份数据可通过创建主从方式,从节点支持设置slave-read-only no可实现从可写操作
kvrocks2redis将首先尝试连接到kvrock实例以进行增量同步。
如果连接或增量同步失败,kvrocks2redis将把配置的数据目录中的完整Kvrocks数据解析到AOF文件。
如果可以进行增量同步,kvrocks2redis会将增量数据解析到AOF文件。另一个线程(名为redis writer)持续读取AOF并将AOF的内容发送给redis。
程序运行时,将生成以下文件:
xxx_appendonly.aof:解析后的数据将保存在此文件中。
xxx_last_next_offset.txt:表示redis编写器线程读取的AOF文件的位置。
last_next_seq.txt:表示kvrocks2redis解析的序列号,用于记录同步位置并检查是否可以执行增量同步。
'配置文件:'
################################ GENERAL #####################################
# The value should be INFO, WARNING, ERROR, FATAL.
#
# Default is INFO
loglevel INFO
# By default kvrocks2redis does not run as a daemon. Use 'yes' if you need it.
# Note that kvrocks2redis will write a pid file in /var/run/kvrocks2redis.pid when daemonized.
daemonize no
# The kvrocks working directory.
# Note that you must specify a directory here, not a file name.
data-dir /var/lib/kvrocks/db/
# Intermediate files are output to this directory when the kvrocks2redis program runs.
output-dir ./log/
# Sync kvrocks node. Use the node's Psync command to get the newest wal raw write_batch.
#
# kvrocks <kvrocks_ip> <kvrocks_port> [<kvrocks_auth>]
kvrocks 127.0.0.1 6668 zcx-test-kvrocks
# Enable cluster mode.
#
# Default: yes
cluster-enable no
################################ NAMESPACE AND Sync Target Redis #####################################
# Synchronize the specified namespace data to the specified Redis DB.
# Warning: It will flush the target redis DB data.
#
# namespace.{namespace} <redis_ip> <redis_port> [<redis_auth> <redis_db_number>]
# Default redis_db_number is 0
namespace.test01 10.xxx.xx.15 9989 zcx123zzz 0
namespace.test02 10.xxx.xx.15 9989 zcx123zzz 1
'启动命令'
kvrocks2redis -c kvrocks2redis.conf
4.kvrocks镜像(附加)
ubuntu 系统输入命令:sudo apt-get install vim-gtk
centos 系统输入命令:yum -y install vim*
'Dockerfile'
FROM kvrocks/kvrocks:latest
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y vim-gtk
WORKDIR /kvrocks/
COPY kvrocks.conf kvrocks2redis.conf /tmp/
COPY kvrocks2redis redis-benchmark redis-cli kvrocks-entrypoint.sh /usr/local/bin/
RUN mkdir -p kvrocks2redis store && chmod +x /usr/local/bin/kvrocks-entrypoint.sh
ENTRYPOINT ["kvrocks-entrypoint.sh"]
'kvrocks-entrypoint.sh'
#!/bin/bash
set -e
if [ ! -f "/kvrocks/conf/confexist" ];then
touch /kvrocks/conf/confexist
eval "cat <<EOF
$(< /tmp/kvrocks.conf)
EOF
" > /kvrocks/conf/kvrocks.conf
eval " cat <<EOF
$(< /tmp/kvrocks2redis.conf)
EOF
" > /kvrocks/kvrocks2redis/kvrocks2redis.conf
fi
exec /kvrocks/bin/kvrocks -c /kvrocks/conf/kvrocks.conf
exit 0