redis的一些注意点:从单机版到集群版
之前有个项目,人流比较大。然后压测上不去,看监控,发现redis的cpu满了。当时提出一个说法,redis的单线程导致cpu只会用到一核,这样的话,如果连接数太多,没开启aof,导致rdb太多次。大key/value,keys耗时操作。内存太少,导致内存满了以后一直在驱逐无用内存都容易导致cpu打满,然后导致体现在前端的话就是很卡。现在就是要优化访问速度。
当时提出的方案是主从架构,加哨兵。但是这个架构不是只能保证高可用性吗,对性能没提升的。
然后就打算搭redis集群。但是我们没有搭redis集群的经验,那只能去阿里云买了。
然后发现阿里云有两个版本的集群,一种是redis5.0集群版,他的架构其实是通过代理,然后分发到各个分片上,这样的话,对外表现其实还是一个redis,但是内部实现其实扩容了。一个是redis6.0版社区版,他的架构可能是跟redis的自己集群一致的,虽然连接上还是一个节点,但是后续可能是通过这个节点可以获取其他的节点信息。
当时方案是,将生产的数据导入到阿里云5.0,阿里云的导入数据,只能通过他的工具来导入,然后我们测试了下,我们生产的数据是6.0的,然后导入不支持。
然后方案我们切换为阿里云6.0,然后发现连接连不上,然后排错来排错去。1.是白名单的问题。2.是vpc的问题,不同网段是连不上的。3.代码的问题。
阿里云redis6.0的集群连接,跟redis的普通连接一样,要带上一个参数-c,redis-cli -c -h 地址 -p 端口。而我们的普通的代码连接redispool这样的都是不带c的。自然操作不了。然后我修改了代码,改成jediscluster(这个还不和jedis适配,工具类都要大改),redisson的版本还要高一点,不然报错。然后连接和启动的时候,成功连上了,但是集群版不支持keys操作。改代码是不可能了,时间不够。
怎么办呢,然后发现我们有个服务是也用的阿里云的redis集群版,但是代码是没问题的啊,keys也能用啊。然后一看,发现了阿里云的6.0和5.0的架构区别。
那现在方案是我们生产6.0导入到本地5.0,然后本地5.0导入到阿里云5.0,然后测试。
redis6.0降级到本地5.0的话,当时是打算直接rdb直接放入然后启动,然后发现好像代码连接有问题,部分数据结构(zset)读取有问题,其他没问题。(可能是r代码的原因,redisson客户端升级了,导致key的序列化不同了,导致拿不到数据)。
然后怀疑到redis的RDB文件不是向下兼容的,所以不能直接使用RDB文件进行迁移,然后就找工具。找到了rdbtools
https://www.cnblogs.com/gaojinshun/p/15497214.html
然后测试了还是拿不到。
然后又找了,redisdump
https://www.cnblogs.com/yanjieli/p/13085481.html
都不行,都要怀疑人生了,然后发现。emmm,代码的pom依赖没还原,导致redisson的客户端版本不一致 估摸是不同版本的客户端key的序列化不同,不能混用。
后来就还原版本,就没问题了。压测了下,发现确实瓶颈不在redis了,压测的时候cpu打满,redis的cpu才25。现在瓶颈估计是tomcat或者nginx了。
qps1000到4000,能用了。
现在思路就是找个时间,停服。将生产的数据导入到本地5.0,然后导入阿里云5.0。
|