RedisShake icon indicating copy to clipboard operation
RedisShake copied to clipboard

fix select db

Open opt-m opened this issue 3 years ago • 5 comments

fix https://github.com/alibaba/RedisShake/issues/429

opt-m avatar Apr 01 '22 08:04 opt-m

CLA assistant check
All committers have signed the CLA.

CLAassistant avatar Apr 01 '22 08:04 CLAassistant

  1. 启动两个空redis 节点,版本均为 6.2.4。
  2. shake 配置为:
id = redis-shake
log.file = ./redis-shake.log
log.level = info
pid_path =
system_profile = 9310
http_profile = 9320
parallel = 32
source.type = standalone
source.address = X.X.X.X:6379
source.password_raw = XXXXXXX
source.auth_type = auth
source.tls_enable = false
source.rdb.input = local
source.rdb.parallel = 0
source.rdb.special_cloud =
target.type = standalone
target.address = Y.Y.Y.Y:6379
target.password_raw = YYYYYYY
target.auth_type = auth
target.db = 4
target.tls_enable = false
target.rdb.output = local_dump
target.version =
fake_time =
key_exists = rewrite
filter.db.whitelist = 1;3
filter.db.blacklist =
filter.key.whitelist =
filter.key.blacklist =
filter.slot =
filter.lua = false
big_key_threshold = 20971520
psync = true
metric = true
metric.print_log = false
sender.size = 104857600
sender.count = 4095
sender.delay_channel_size = 65535
keep_alive = 0
scan.key_number = 50
scan.special_cloud =
scan.key_file =
qps = 200000
replace_hash_tag = false
  1. 下载shake
wget https://github.com/alibaba/RedisShake/releases/download/release-v2.1.2-20220329/release-v2.1.2-20220329.tar.gz
tar zxvf release-v2.1.2-20220329.tar.gz
  1. 开启sync
./bin/redis-shake.linux -conf=redis-shake.conf -type=sync &
  1. 向 源节点写入数据
127.0.0.1:6379> set db0 0
OK
  1. 在目标节点观察到 key db0 存在, 并且位于 0 号数据库。
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
127.0.0.1:6379> get db0
"0"
127.0.0.1:6379>
  1. shake日志为
2022/04/07 16:38:46 [WARN] source.auth_type[auth] != auth
2022/04/07 16:38:46 [WARN] target.auth_type[auth] != auth
2022/04/07 16:38:46 [INFO] source rdb[X.X.X.X:6379] checksum[yes]
2022/04/07 16:38:46 [WARN]
______________________________
\                             \           _         ______ |
 \                             \        /   \___-=O'/|O'/__|
  \   RedisShake, here we go !! \_______\          / | /    )
  /                             /        '/-==__ _/__|/__=-|  -GM
 /        Alibaba Cloud        /         *             \ | |
/                             /                        (o)
------------------------------
if you have any problem, please visit https://github.com/alibaba/RedisShake/wiki/FAQ

2022/04/07 16:38:46 [INFO] redis-shake configuration: {"ConfVersion":0,"Id":"redis-shake","LogFile":"./redis-shake.log","LogLevel":"info","SystemProfile":9310,"HttpProfile":9320,"Parallel":32,"SourceType":"standalone","SourceAddress":"X.X.X.X:6379","SourcePasswordRaw":"***","SourcePasswordEncoding":"***","SourceAuthType":"auth","SourceTLSEnable":false,"SourceTLSSkipVerify":false,"SourceRdbInput":["local"],"SourceRdbParallel":1,"SourceRdbSpecialCloud":"","TargetAddress":"Y.Y.Y.Y:6379","TargetPasswordRaw":"***","TargetPasswordEncoding":"***","TargetDBString":"4","TargetDBMapString":"","TargetAuthType":"auth","TargetType":"standalone","TargetTLSEnable":false,"TargetTLSSkipVerify":false,"TargetRdbOutput":"local_dump","TargetVersion":"6.2.4","FakeTime":"","KeyExists":"rewrite","FilterDBWhitelist":["1","3"],"FilterDBBlacklist":[],"FilterKeyWhitelist":[],"FilterKeyBlacklist":[],"FilterSlot":[],"FilterCommandWhitelist":null,"FilterCommandBlacklist":null,"FilterLua":false,"BigKeyThreshold":20971520,"Metric":true,"MetricPrintLog":false,"SenderSize":104857600,"SenderCount":4095,"SenderDelayChannelSize":65535,"SenderTickerMs":20,"KeepAlive":0,"PidPath":"","ScanKeyNumber":50,"ScanSpecialCloud":"","ScanKeyFile":"","Qps":200000,"ResumeFromBreakPoint":false,"Psync":true,"NCpu":0,"HeartbeatUrl":"","HeartbeatInterval":10,"HeartbeatExternal":"","HeartbeatNetworkInterface":"","ReplaceHashTag":false,"ExtraInfo":false,"SockFileName":"","SockFileSize":0,"FilterKey":null,"FilterDB":"","Rewrite":false,"SourceAddressList":["X.X.X.X:6379"],"TargetAddressList":["Y.Y.Y.Y:6379"],"SourceVersion":"6.2.4","HeartbeatIp":"127.0.0.1","ShiftTime":0,"TargetReplace":false,"TargetDB":4,"Version":"develop,e43689343aa046b19965854b5794828b1484e457,go1.17,2022-03-29_15:03:51","Type":"sync","TargetDBMap":null}
2022/04/07 16:38:46 [INFO] DbSyncer[0] starts syncing data from X.X.X.X:6379 to [Y.Y.Y.Y:6379] with http[9321], enableResumeFromBreakPoint[false], slot boundary[-1, -1]
2022/04/07 16:38:46 [INFO] DbSyncer[0] psync connect 'X.X.X.X:6379' with auth type[auth] OK!
2022/04/07 16:38:46 [INFO] DbSyncer[0] psync send listening port[9320] OK!
2022/04/07 16:38:46 [INFO] DbSyncer[0] try to send 'psync' command: run-id[?], offset[-1]
2022/04/07 16:38:46 [INFO] Event:FullSyncStart	Id:redis-shake
2022/04/07 16:38:46 [INFO] DbSyncer[0] psync runid = b9a63c028399607cc161d679039e4c24c235ee84, offset = 100401129, fullsync
2022/04/07 16:38:46 [INFO] DbSyncer[0] rdb file size = 178
2022/04/07 16:38:46 [INFO] Aux information key:redis-ver value:6.2.4
2022/04/07 16:38:46 [INFO] Aux information key:redis-bits value:64
2022/04/07 16:38:46 [INFO] Aux information key:ctime value:1649320726
2022/04/07 16:38:46 [INFO] Aux information key:used-mem value:70411224
2022/04/07 16:38:46 [INFO] Aux information key:repl-stream-db value:0
2022/04/07 16:38:46 [INFO] Aux information key:repl-id value:b9a63c028399607cc161d679039e4c24c235ee84
2022/04/07 16:38:46 [INFO] Aux information key:repl-offset value:100401129
2022/04/07 16:38:46 [INFO] Aux information key:aof-preamble value:0
2022/04/07 16:38:47 [INFO] DbSyncer[0] total = 178B -         178B [100%]  entry=0
2022/04/07 16:38:47 [INFO] DbSyncer[0] sync rdb done
2022/04/07 16:38:47 [INFO] DbSyncer[0] FlushEvent:IncrSyncStart	Id:redis-shake
2022/04/07 16:38:48 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:49 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:50 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:51 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:52 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:53 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:54 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:55 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:38:56 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:57 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:58 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:38:59 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:00 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:01 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:02 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:03 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:04 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:05 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:39:06 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:07 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:08 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:09 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:10 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:11 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:12 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:13 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:14 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:15 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:39:16 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:17 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:18 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:19 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:20 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:21 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:22 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:23 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=7
2022/04/07 16:39:24 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:25 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:39:26 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:27 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:28 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:29 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:30 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:31 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:32 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:33 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:34 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:35 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:39:36 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:37 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:38 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:39 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:40 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:41 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:42 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:43 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:44 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:45 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:39:46 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:47 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:48 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:49 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:50 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:51 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:52 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:53 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:54 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:55 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:39:56 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:57 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:58 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:39:59 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:00 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:01 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:02 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:03 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:04 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:05 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:40:06 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:07 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:08 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:09 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:10 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:11 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:12 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:13 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:14 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:15 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 16:40:16 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:17 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:18 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:19 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:20 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:21 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:22 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 16:40:23 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0

opt-m avatar Apr 07 '22 08:04 opt-m

把日志级别改下: log.level = debug

这是我用你的配置复现的日志(会看到ignore字样的日志):

2022/04/07 17:32:51 [INFO] DbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2022/04/07 17:32:52 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 17:32:53 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 17:32:54 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2022/04/07 17:32:55 [DEBUG] DbSyncer[0] ignore command[select]
2022/04/07 17:32:55 [DEBUG] DbSyncer[0] ignore command[set]
2022/04/07 17:32:55 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=2      +writeBytes=0
2022/04/07 17:32:56 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0

chenyang8094 avatar Apr 07 '22 09:04 chenyang8094

sorry, 上述描述我搞错一个地方 * 实际部署使用的并不是两个空节点。实际架构为:A(master) -> B(slave & source) -> shake -> C(target)

我们为了避免对master造成可能的影响,shake同步的源选择的是slave节点。

在使用 redis-cli --replica 连接来源实例的master A、slave B 后,可以看到:master A 会在增量阶段第一个命令会强制发送 select db 命令。而 slave B 并不会。可以在 redis 源码中: replicationFeedSlaves 以及 replicationFeedSlavesFromMasterStream 发现两者差异

另外根据 Redis rdb以及加载rdb 的逻辑,slave 加载 rdb后,会在 rdb 头信息得到repl_stream_db ,并将master连接的db设置为该值。因此参考这部分逻辑, shake 应该保留解析rdb时得到的repl_stream_db, 并且在增量同步阶段将 repl_stream_db 认为是来源 db。

opt-m avatar Apr 14 '22 10:04 opt-m

@opt-m 抱歉这个PR拖这么久,之前一直没时间细看。

我认为你描述的问题不止存在于db filter,你的复制场景问题(A-->B --> Shake)同样存在于正常的sync模式(甚至其他模式),这是一个级联复制下的bug。shake当前的确没有处理repl_stream_db信息(直接忽略),导致在级联复制时(作为slave的slave),会丢失自己master client当前db的信息(默认都会写到db 0,除非master上手动执行select不同的db)。

所以,我认为你的PR需要关注和处理这块,而不仅仅用于filter db。

我认为逻辑比较简单,sync RDB时提取repl_stream_db,并在之后的increasse sync阶段先设置selected db(并向target段发送一个select命令,如果该db没有被filter规则过滤),这样后续的同步和filter自然都能对的上了。

chenyang8094 avatar Jun 28 '22 06:06 chenyang8094

v3 上已经改了

suxb201 avatar Sep 21 '22 01:09 suxb201