赞
踩
公司的A业务与B业务共用一套redis存储,架构如下:
前期业务量小,多个业务共用同一套 Redis 的好处如下:
随着业务量的上涨,与共用 Redis 实例相比,下面的因素不得不考虑:
线上多次发生A与B业务对redis资源的争夺,导致相互影响自己的业务,因此必须做redis集群实例的隔离。A与B业务独立使用各自的redis集群,架构如下图:
A业务继续使用redis集群1,新搭建redis集群2给B业务使用,这样就做到了redis实例的隔离。看似方案完美,但同时也带来了新的问题,如下:
以上问题的共同点,需要在redis集群1上找出业务B的数据,才能做数据迁移以及删除。
目前业务使用redis的情况如下:
通过以上分析,如果能解析rdb,同时过滤出b:开头的所有key,那我们就能做到redis数据的迁移,以及数据的删除。我前面的文章 redis存储可视化分析 Rdr工具能分析rdb分件,但是有个问题是 rdr没提供key前缀匹配的功能。可以使用redis-rdb-tools进行分析
redis-rdb-tools
解析 Redis dump.rdb 文件、分析内存并将数据导出为 JSON 格式.
Rdbtools is a parser for Redis’ dump.rdb files. The parser generates events similar to an xml sax parser, and is very efficient memory wise.
In addition, rdbtools provides utilities to :
通过python的pip工具安装(推荐),这种方式最简单
pip install rdbtools python-lzf
安装完成后,通过 rdb -h 查看使用方式
rdb -h usage: usage: rdb [options] /path/to/dump.rdb Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb positional arguments: dump_file RDB Dump file to process optional arguments: -h, --help show this help message and exit -c CMD, --command CMD Command to execute. Valid commands are json, diff, justkeys, justkeyvals, memory and protocol -f FILE, --file FILE Output file -n DBS, --db DBS Database Number. Multiple databases can be provided. If not specified, all databases will be included. -k KEYS, --key KEYS Keys to export. This can be a regular expression -o NOT_KEYS, --not-key NOT_KEYS Keys Not to export. This can be a regular expression -t TYPES, --type TYPES Data types to include. Possible values are string, hash, set, sortedset, list. Multiple typees can be provided. If not specified, all data types will be returned -b BYTES, --bytes BYTES Limit memory output to keys greater to or equal to this value (in bytes) -l LARGEST, --largest LARGEST Limit memory output to only the top N keys (by size) -e {raw,print,utf8,base64}, --escape {raw,print,utf8,base64} Escape strings to encoding: raw (default), print, utf8, or base64. -x, --no-expire With protocol command, remove expiry from all keys -a N, --amend-expire N With protocol command, add N seconds to key expiry time
我这里需要通过 前缀匹配,输出到文件,命令如下:
rdb --command justkeyvals --key "b:*" dump.rdb > data.txt
以上,获取到redis集群1里面业务B的数据,到此,我就可以对数据进行迁移删除
进行数据迁移前,如果直接迁移,业务B里面读取不到数据,影响业务,所以先改造业务,双读单写,业务B新的数据写入到redis集群2,读取数据,先从redis集群1读,如果没有数据再去redis集群2读取,这样保持数据能从reids获取,如图:
业务B发布线上后,新的数据写入到redis2集群,迁移前,redis执行bgasve,拿到最新的rdb快照信息,就可以开始解析rdb文件,进行数据的迁移
rdb --command justkeyvals --key "b:*" dump.rdb > data.txt
解析出的格式如下:
前面key,后面是value,解析的时候 以空格分隔
b:user003 fname Ron,sname Bumquist,
b:user001 fname Raoul,sname Duke,
b:user002 fname Gonzo,sname Dr,
b:user_list user003,user002,user001
把这些数据写入到redis集群2,同时根据key,删除redis集群1种业务B的数据,释放内存
数据迁移完成后,业务B改造,数据读写都在redis集群2上进行,优化完后,再次上线,如图:
至此,redis数据的迁移完成
写作不易,刚好你看到,刚好对你有帮助,动动小手,点点赞,有疑问的欢迎留言或者私信讨论
2023年最后一天班,再见2024,祝大家:2024发发发。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。