关于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)
此项目优缺点
优点:独立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{
@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架构师。原大连英极软件技术开发本部高级工程师。史荣久先生亦有贡献。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/256470.html