Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何配置解决双向同步时的数据回环问题? #88

Open
kimmking opened this issue May 24, 2023 · 8 comments
Open

如何配置解决双向同步时的数据回环问题? #88

kimmking opened this issue May 24, 2023 · 8 comments

Comments

@kimmking
Copy link

问题:双向同步时,在单个节点上连续对同一个key修改3次,导致两个redis都无限回环。

1、在当前mvn install编译打包,然后运行server.jar。
2、配置一个任务1,从redis1复制数据到redis2,并启动任务。
3、配置一个任务2,从redis2复制数据到redis1,并启动任务。
4、此时通过redis-cli,在redis1上,连续执行:

  • set k1 1001
  • set k1 1002
  • set k1 1003
  • set k1 101
  • set k1 102
  • set k1 103

5、然后在redis1和redis2使用get k1观察:有时候是1001,有时候是1002,有时候是102,有时候是103,无限制循环下去。

@pingxingshikong
Copy link
Member

pingxingshikong commented May 30, 2023

方法一:修改redis源码

方法二:通过辅助key(前提两边节点写入key不能相同)

A redis SET k1 1001

到达同步节点后修改命令并发送至B Redis:

MULTI
PSETEX md5('circle-'+$SourceNodeId+command+$SourceVersion) 1 1
SET k1 1001(command)
//用于定位offset
HSET redis-syncer-checkpoint $checkPointValue
EXEC

命令到达B Redis后再次回到同步程序时,如存在辅助key则真实命令不会再次写入A

同理B Redis节点数据也是如此

B redis SET S1 101

MULTI
PSETEX md5('circle-'+ServerId+command+version) 1 1
SET S1 101(command)
//用于定位offset
HSET redis-syncer-checkpoint $checkPointValue
EXEC

同步节点屏蔽所有辅助key的del命令

@githubxubin
Copy link

@ pingxingshikong Whether this issue has been fixed in the source code?tks

@githubxubin
Copy link

@ pingxingshikong 您好 我看源码里面 您上面这段逻辑似乎已经有了 ,但是还是有回环问题

@pingxingshikong
Copy link
Member

@ pingxingshikong 您好 我看源码里面 您上面这段逻辑似乎已经有了 ,但是还是有回环问题

双向同步的部分还没开放出来,现在开放出来的只支持单向同步

@susongyan
Copy link
Member

@kimmking
现在是辅助key的方式写在目标集群 反向任务根据辅助key的日志去判断是否对面过来的; 不过这种方式对目标集群的压力比较大 , 内存和tps的压力会翻倍
还可以考虑别的方式,可以一起讨论下

@jiashiwen
Copy link
Member

双向同步看似是个好功能但在实际生产中易造成数据混淆,而且涉及冷启动问题,运维也很麻烦,双数据中间交叉同步应用只读对端同步数据可能更靠谱一些

@Vampire-DIO
Copy link

如果考虑实现CRDT呢?我看到携程有过相应的实现

@pingxingshikong
Copy link
Member

如果考虑实现CRDT呢?我看到携程有过相应的实现

这种方式需要修改redis源码

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants