若新增后端 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 的数据。