redis高可用

redis容量达到90%,通过slave导入master数据,进行扩容。

新开一个redis实例,redis.conf配置slave-read-only yes,当作为slave时开启只读模式保证数据只从主服务器写入同步到从服务器。
启动redis后进入redis-cli,通过命令把当前redis设置为另一个redis的slave。

1
2
127.0.0.1:5000> slaveof 127.0.0.1 6379
OK

然后用info命令查看状态:

1
2
3
4
5
6
7
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
# Memory
used_memory:90260000

看到已经是slave状态,根据use_memory判断数据同步是否完成。

新增加slave扩容,虽然可以提高空闲容量,但是master中无效的数据同样会被同步到slave中,造成存储浪费。因此要清除master中已经无效的key(先把数据同步到slave,再从slave中导出key,避免影响master的线上服务):

1
$./redis-cli -h host -p port keys '*'|grep xxx > keys.dat

同样为了避免删除数据时,影响redis的线上服务,应对删除速度做限制。可以用jedis写一个java程序去跑,但是为了这么一个简单地操作,要弄一个java程序出来,有种牛刀杀鸡的感觉。这种时候就应该想到python,通过redis-py写一个简单地脚本就可以搞定了。安装redis-py:

1
$sudo pip install redis

读文件中的key逐个删除,放慢速度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# !/usr/bin/env python
# coding: utf-8

import redis
import time

if __name__ == '__main__':
i=0
r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)
for key in open('/Users/lc/keys.dat'):
print 'delete:', key.strip(), r.delete(key.strip())
if i % 20 == 0:
time.sleep(0.01)
i += 1

清楚完master的数据,然后查看slave中是否同步完成,完成后关闭slave模式,并把新的redis节点加入nutcracker配置。

1
2
127.0.0.1:5000> slaveof no one
OK