redis data migration 레디스 마이그레이션 rump? redis-shake! 쓰자!!

데이터를 무중단으로 migration 해야 할 일이 생겼다. 알아보니 rump 가 있다.

https://github.com/stickermule/rump

새로운 redis 서버로의 데이터 이관을 위해서 기존 서버의 사용은 유지한채 새로운 서버로 데이터를 이관해야 하는 상황

인프라 팀에서는 데이터 이관을 지원해 주지 않은다고 하고 해봤자 *.aof 파일을 복제해서 다시 켜주는 수준

개발자로서 데이터 이관을 알아봐야 하는 상황이었다.

test redis 2개 기동

일단 docker 를 이용해 2개의 redis 를 기동했다. 성능을 올리기 위해서 cpu 와 memory 옵션을 사용한다.

docker run –name redis1 -p 6379:6379 –rm –cpus=4 -m=8g redis

docker run –name redis2 -p 6389:6379 –rm –cpus=4 -m=8g redis

샘플 데이터 입력

https://github.com/nzin4x/import-redis-by-python

위의 코드를 이용해 100만건의 데이터를 넣었다. 약 14분 소요.

RUMP 로 데이터 복제 (비추)

rump 로 data 를 복제한다. rump 를 다운로드 받아서 바로 실행

redis1 의 0 번 DB의 내용을 redis2 의 1번 DB로 복제 하는 코드

curl -SL https://github.com/stickermule/rump/releases/download/1.0.0/rump-1.0.0-linux-amd64 -o rump
./rump -from redis://localhost:6379/0 -to redis://localhost:6389/1 -silent

wsl 이 있어서 얼마나 다행인지 windows 는 좋은 linux 머신이다.

Rump 가 너무 느려서 좀 알아보니

알리바바 그룹의 천재들이 만든 redis-shake 를 알아냈다.

redis-shake! 가 답이다.

sync 중에 원본 redis (redis1) 에 키 입력/조회도 되고 (실시간 사용 및 복제 가능) 속도가 엄청 빠르다.

nz@nzMain:/mnt/c/Users/nzin4/release-v2.1.1-20210903$ ./redis-shake.linux -conf redis-shake.conf -type sync
2022/03/09 21:20:06 [WARN] source.auth_type[auth] != auth
2022/03/09 21:20:06 [WARN] target.auth_type[auth] != auth
2022/03/09 21:20:06 [INFO] input password is empty, skip auth address[127.0.0.1:6389] with type[auth].
2022/03/09 21:20:06 [INFO] input password is empty, skip auth address[127.0.0.1:6379] with type[auth].
2022/03/09 21:20:06 [INFO] input password is empty, skip auth address[127.0.0.1:6379] with type[auth].
2022/03/09 21:20:06 [INFO] source rdb[127.0.0.1:6379] checksum[yes]
2022/03/09 21:20:06 [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/03/09 21:20:06 [INFO] redis-shake configuration: {"ConfVersion":1,"Id":"redis-shake","LogFile":"","LogLevel":"info","SystemProfile":9310,"HttpProfile":9320,"Parallel":32,"SourceType":"standalone","SourceAddress":"127.0.0.1:6379","SourcePasswordRaw":"***","SourcePasswordEncoding":"***","SourceAuthType":"auth","SourceTLSEnable":false,"SourceRdbInput":[],"SourceRdbParallel":1,"SourceRdbSpecialCloud":"","TargetAddress":"127.0.0.1:6389","TargetPasswordRaw":"***","TargetPasswordEncoding":"***","TargetDBString":"3","TargetDBMapString":"","TargetAuthType":"auth","TargetType":"standalone","TargetTLSEnable":false,"TargetRdbOutput":"local_dump","TargetVersion":"6.2.6","FakeTime":"","KeyExists":"rewrite","FilterDBWhitelist":[],"FilterDBBlacklist":[],"FilterKeyWhitelist":[],"FilterKeyBlacklist":[],"FilterSlot":[],"FilterLua":false,"BigKeyThreshold":524288000,"Metric":true,"MetricPrintLog":false,"SenderSize":104857600,"SenderCount":4095,"SenderDelayChannelSize":65535,"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":["127.0.0.1:6379"],"TargetAddressList":["127.0.0.1:6389"],"SourceVersion":"6.2.6","HeartbeatIp":"127.0.0.1","ShiftTime":0,"TargetReplace":false,"TargetDB":3,"Version":"develop,cc226f841e2e244c48246ebfcfd5a50396b59710,go1.15.7,2021-09-03_10:06:55","Type":"sync","TargetDBMap":null}
2022/03/09 21:20:06 [INFO] DbSyncer[0] starts syncing data from 127.0.0.1:6379 to [127.0.0.1:6389] with http[9321], enableResumeFromBreakPoint[false], slot boundary[-1, -1]
2022/03/09 21:20:06 [INFO] input password is empty, skip auth address[127.0.0.1:6379] with type[auth].
2022/03/09 21:20:06 [INFO] DbSyncer[0] psync connect '127.0.0.1:6379' with auth type[auth] OK!
2022/03/09 21:20:06 [INFO] DbSyncer[0] psync send listening port[9320] OK!
2022/03/09 21:20:06 [INFO] DbSyncer[0] try to send 'psync' command: run-id[?], offset[-1]
2022/03/09 21:20:06 [INFO] Event:FullSyncStart  Id:redis-shake
2022/03/09 21:20:06 [INFO] DbSyncer[0] psync runid = 95203197147e62b36935e3b68a3f98e4c7fe99c2, offset = 0, fullsync
2022/03/09 21:20:06 [INFO] DbSyncer[0] +
2022/03/09 21:20:07 [INFO] DbSyncer[0] -
2022/03/09 21:20:07 [INFO] DbSyncer[0] +
2022/03/09 21:20:08 [INFO] DbSyncer[0] -

...
2022/03/09 21:21:31 [INFO] DbSyncer[0] total = 108.17MB -     102.68MB [ 94%]  entry=1064782
2022/03/09 21:21:32 [INFO] DbSyncer[0] total = 108.17MB -     104.14MB [ 96%]  entry=1079907
2022/03/09 21:21:33 [INFO] DbSyncer[0] total = 108.17MB -     105.57MB [ 97%]  entry=1094745
2022/03/09 21:21:34 [INFO] DbSyncer[0] total = 108.17MB -     106.89MB [ 98%]  entry=1108481
2022/03/09 21:21:35 [INFO] DbSyncer[0] total = 108.17MB -     108.17MB [100%]  entry=1122766
...

2022/03/09 21:21:33 [INFO] DbSyncer[0] total = 108.17MB -     105.57MB [ 97%]  entry=1094745
2022/03/09 21:21:34 [INFO] DbSyncer[0] total = 108.17MB -     106.89MB [ 98%]  entry=1108481
2022/03/09 21:21:35 [INFO] DbSyncer[0] total = 108.17MB -     108.17MB [100%]  entry=1122766
2022/03/09 21:21:35 [INFO] DbSyncer[0] sync rdb done
2022/03/09 21:21:35 [INFO] input password is empty, skip auth address[127.0.0.1:6389] with type[auth].
2022/03/09 21:21:35 [INFO] DbSyncer[0] FlushEvent:IncrSyncStart Id:redis-shake
2022/03/09 21:21:35 [INFO] input password is empty, skip auth address[127.0.0.1:6379] with type[auth].
2022/03/09 21:21:36 [INFO] DbSyncer[0] sync:  +forwardCommands=9      +filterCommands=0      +writeBytes=36

112만건 복제시 1분 20초가 소요됨.

복제가 끝나도 계속 연속해서 계속 sync 가 이어지며 (redis1 -> redis2) 당연히 redis1 에 값을 계속 밀어 넣어도 연속해서 sync 가 이어진다.

redis-shake 로 데이터 sync 중에 redis1 에 값 입력 시간 측정

2022-03-09 21:39:29.951538
113.0
114.0
115.0
116.0
117.0
118.0
119.0
120.0
121.0
122.0
2022-03-09 21:41:32.432655

10만건 입력시 1분 53초. rump 할 때 보다 약간 느리지만 같은 속도로 볼 수 있다. 이는 python 의 구현방법에 따라 차이가 있을 수 있겠지만..

redis-shake 가 답이다. alibaba 만세.

자세히 알아보지는 않았지만 rump 는 클라우드로 데이터를 넣는 용으로 쓸 수 있는 듯. 용도가 다른 듯.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다