Redis + Twemproxy(三)之新增 Redis 节点

若新增后端 Redis:
1、Twemproxy 必须重启才能生效;
2、新增前存储在各 Redis 中的数据,不会自动重新分布。若需分布均匀,则须人工写脚本来实现,否则会出现找不到 key 值的情况。

至于为什么会出现 key 值找不到,最简单的理解就是“取模运算”。

假设一开始只有1个 Redis 节点,由于 Twemproxy 读/取数据,是对相同的 Redis 节点数、采用相同的 hash 算法,所以每次取操作都可以从正确的 Redis 节点取到正确的值。
现在新增了一个 Redis 节点后,虽然 Twemproxy 所采用的 hash 算法一样,但参与运算的 Redis 节点数已经发生变化。那么会出现哪一种错误?
新增前,Twemproxy 存储 key 值,是根据的 key 对 1 取模运算,找到 key 将被存储的 Redis,然后将数据存储在对应的 Redis 中。
新增后,Twemproxy 想获取之前的 key,是根据的 key 对 2 取模运算,那么会有一大批 key 被定位到新 Redis。而这些旧 key 实际存储在之前的 Redis 中,自然无法从新 Redis 取到数据。

下面将测试新增或删除 Redis 节点,对数据的影响有多大。

1、修改 Twemproxy 配置,只保留1台 Redis在这里插入图片描述

2、使用 py 脚本,通过 Twemproxy 新增1万数据

import redis

r = redis.Redis(host = '192.168.255.128', password = 'www.wave.com', db = 0, port = 22121)

for _i in range(0, 10000):
	key_str = 'key_%d' % _i	
	r.set(key_str, _i)

直连 Redis,查看 key 数量:
在这里插入图片描述

3、修改 Twemproxy 配置,新增1台 Redis 并重启 Twemproxy

在这里插入图片描述

4、使用 py 脚本,通过 Twemproxy 取出所写入的1万数据

import redis

r = redis.Redis(host = '192.168.255.128', password = 'www.wave.com', db = 0, port = 22121)
num = 0
for _i in range(0, 10000):
	key_str = 'key_%d' % _i
	_value = r.get(key_str)
	
	if _value != None:
		num+=1

print num

输出结果:
在这里插入图片描述
由此可见,当新增1个 Redis 节点后,只成功读取到将近 1/2 的数据。

发布了112 篇原创文章 · 获赞 22 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u010601662/article/details/104710686
今日推荐