17611538698
webmaster@21cto.com

Redis-replicator:一款专注redis数据同步的工具

资讯 0 4796 2017-08-22 12:01:50
REDIS-REP.png

关于Redis-replicator 
 
Github 项目地址:redis-replicator
 
给大家介绍一下项目。
 
使用 Java 实现了 Reids 的主从同步协议, 模拟 Slave 的行为接收 Master 的数据。 同时也可实现 Rdb 文件的解析以及分割一个 Rdb 文件到多个文件, 合并多个 Rdb 文件到一个。以及 Aof 数据的解析和 Master 数据的异地备份。
 
Redis-replicator-2.3.0 以上可支持 Redis-2.6.x 至 Redis-4.0.x 之间的所有版本(包括Redis-4.0.x 的 Module)
 

redis-rep.jpg


此项目优缺点
 
优点:独立jar,仅依赖commons-logging,打包之后仅297 KB;可以内嵌到任何工程中,基本无 jar 包冲突。
缺点:仅支持点对点同步,而且各种扩展需要自己实现,没有一站式解决方案。
 
竞品比较
 
与此项目类似,市面上还有其他几个项目实现类似功能
redis-rdb-tool (不支持数据同步功能)
x-pipe (不够轻量级,各有利弊,HA以及监控方面比此项目好)
redis-migrate-tool(C语言实现,不支持 Redis-4.0.x 的 Module 扩展,但支持集群同步)
 
快速开始
 
一个典型的同步场景如下代码所示:
Replicator replicator = new RedisReplicator("127.0.0.1", 6379, Configuration.defaultSetting());
replicator.addRdbListener(new RdbListener.Adaptor() {
@Override
public void handle(Replicator replicator, KeyValuePair<?> kv) {
System.out.println(kv);
}
});
replicator.addCommandListener(new CommandListener() {
@Override
public void handle(Replicator replicator, Command command) {
System.out.println(command);
}
});
replicator.open();
 
命令扩展
 
当有新的 Redis 版本;并增加了新的 Redis 命令而 Redis-replicator未包含此命令时。 用户可以自行扩展命令, 如下形式的扩展:
 
// 实现未包含的命令 
public class YourAppendCommand implements Command {
public final String key;
public final String value;
public YourAppendCommand(String key, String value) {
this.key = key;
this.value = value;
}
}

// 为命令写一个解析器
public class YourAppendParser implements CommandParser<YourAppendCommand> {
@Override
public YourAppendCommand parse(Object command) {
return new YourAppendCommand(new String((byte) command[1], UTF_8), new String((byte) command[2], UTF_8));
}
}

// 注册命令解析器到 Replicator 上
Replicator replicator = new RedisReplicator("127.0.0.1",6379,Configuration.defaultSetting());
replicator.addCommandParser(CommandName.name("APPEND"),new YourAppendParser());

// Handle 此命令的事件
replicator.addCommandListener(new CommandListener() {
@Override
public void handle(Replicator replicator, Command command) {
if(command instanceof YourAppendCommand){
YourAppendCommand appendCommand = (YourAppendCommand)command;
// your code goes here
}
}
});
 
模块扩展
 
在 Redis-4.0.x 中, 增加了模块支持,可以用户自定义命令以及 Rdb 存储格式,与上面的命令扩展类似,Module 扩展与之不同的地方在于,需要实现Module接口,以及ModuleParser接口,并通过Replicator.addModuleParser注册此接口。
 
谁在使用
 
到目前为止,有东方财富网,51信用卡,incubator-rocketmq-externals,等公司或开源项目使用或打算使用此项目。

本文为投稿作品。
 
 
作者:陈宝仪。
说明:陈先生现为Nextop架构师。原大连英极软件技术开发本部高级工程师。史荣久先生亦有贡献。

评论