一.问题描述
项目中使用了一个Redis分片集群,一共设置了5个分片。在观察其监控信息时发现5个分片的访问量极其不均匀。
85%的调用量都集中在分片1上,13%的调用量集中在分片2上,1%的调用量集中在分片3上。另外两个分片的调用量都不到整体的1%。
二.问题分析
看到这个现象感觉非常奇怪,设置分片的目的是为了将流量均匀地分布到多台机器上以减轻单台机器的压力,提高性能。
目前的情况是大部分流量都集中在一台机器上了,不符合分片集群设置的初衷。
通过排查项目对此Redis集群的使用,发现主要有3处读写Redis的地方,同时每处只涉及一个key的读写。
到这里就基本猜到是怎么回事了:在我们的case中,只有3个key被频繁访问,其它的key访问量
很少。
而每一个key都由固定的分片存储,所以存储这3个key的机器就会接受大部分的请求,造成请求分配均衡。
三.解决方案
(1)方案一:改用主从集群
其实在这个场景下使用分片集群不是很合适。如果改成主从集群,所有key在master和salve上都有存储,就不会有这种分配不均的问题了。
(2)方案二:改用更合适的数据结构
要想发挥分片集群的优势需要尽量地让key均匀地分布到所有的机器上。
通过对上文中提到的3个key的使用进行分析,发现这3个key对应的value都使用了hash结构。
如果我们这样改造:使用字符串代替hash,具体来说使用old_key+hash结构中的key做为新的key,value还是之前hash中的value。
这样就把一个大的hash结构变成了多个key和与之对应的value。理论上就能更均匀地分布Redis中的key,进而解决上述问题。
文章首发于公众号【第四单元】,欢迎关注,一起学习进步