Twemproxy 又称 nutcracker ,是一个memcache、redis协议的轻量级代理,一个用于sharding 的中间件。有了Twemproxy,客户端不直接访问Redis服务器,而是通过twemproxy 代理中间件间接访问。 twemproxy 为 twitter 开源产品(参考:https://github.com/twitter/twemproxy)
一个简单的 Twemproxy 分片测试:
本人测试在一台服务器上,启动3个redis实例。
本机已经安装了一个redis 实例(192.168.1.222 6379),现在再开启两个实例。
# 创建新的 redis 目录
[root@centos222 ~]# mkdir -p /var/lib/redis/6380 /var/lib/redis/6381
# 复制2份新的配置文件
[root@centos222 ~]# cp /etc/redis/6379.conf /etc/redis/6380.conf
[root@centos222 ~]# cp /etc/redis/6379.conf /etc/redis/6381.conf
#
分别修改配置端口及文件位置(或者批量替换修改 %s#6379#6380#g %s#6379#6381#g)
[root@centos222 ~]# vi /etc/redis/6380.conf
port 6380
pidfile "/var/run/redis_6380.pid"
logfile "/var/log/redis_6380.log"
dir "/var/lib/redis/6380"
daemonize yes
#requirepass
#masterauth
[root@centos222 ~]# vi /etc/redis/6381.conf
port 6381
pidfile "/var/run/redis_6381.pid"
logfile "/var/log/redis_6381.log"
dir "/var/lib/redis/6381"
daemonize yes
#requirepass
#masterauth
# 启动服务(第一个为默认端口 6379)
[root@centos222 ~]# service redisd start
[root@centos222 ~]# /usr/local/bin/redis-server /etc/redis/6380.conf
[root@centos222 ~]# /usr/local/bin/redis-server /etc/redis/6381.conf
# 访问实例(正常)
[root@centos222 ~]# redis-cli -p 6379
[root@centos222 ~]# redis-cli -p 6380
[root@centos222 ~]# redis-cli -p 6381
# 安装 autoconf
[root@centos222 ~]# mkdir -p /usr/local/autoconf
[root@centos222 ~]# cd /usr/local/src
[root@centos222 ~]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
[root@centos222 ~]# tar -zxvf autoconf-2.69.tar.gz
[root@centos222 ~]# cd autoconf-2.69
[root@centos222 ~]# ./configure --prefix=/usr/local/autoconf/
[root@centos222 ~]# make && make install
# 更改新版本 autoconf 2.69 为默认程序
[root@centos222 ~]# autoconf -V
[root@centos222 ~]# autoreconf -V
[root@centos222 ~]# /usr/local/autoconf/bin/autoconf -V
[root@centos222 ~]# /usr/local/autoconf/bin/autoreconf -V
[root@centos222 ~]# mv /usr/bin/autoconf /usr/bin/autoconf_backup
[root@centos222 ~]# mv /usr/bin/autoreconf /usr/bin/autoreconf_backup
[root@centos222 ~]# ln -s /usr/local/autoconf/bin/autoconf /usr/bin/autoconf
[root@centos222 ~]# ln -s /usr/local/autoconf/bin/autoreconf /usr/bin/autoreconf
# 安装 twemproxy
[root@centos222 ~]# mkdir -p /usr/local/twemproxy
[root@centos222 ~]# cd /usr/local/src
[root@centos222 ~]# wget https://github.com/twitter/twemproxy/archive/master.zip
[root@centos222 ~]# unzip master
[root@centos222 ~]# cd /usr/local/src/twemproxy-master
[root@centos222 ~]# autoreconf -fvi
[root@centos222 ~]# ./configure --prefix=/usr/local/twemproxy/
[root@centos222 ~]# make && make install
# 配置环境变量
[root@centos222 ~]# echo "PATH=$PATH:/usr/local/twemproxy/sbin/" >> /etc/profile
[root@centos222 ~]# source /etc/profile
# 配置文件 nutcracker.yml
[root@centos222 ~]# mkdir -p /etc/nutcracker
[root@centos222 ~]# cp /usr/local/src/twemproxy-master/conf/nutcracker.yml /etc/nutcracker/
[root@centos222 ~]# vi /etc/nutcracker/nutcracker.yml
alpha:
listen: 0.0.0.0:22121 #twemproxy监听的端口
hash: fnv1a_64 #md5/crc16/crc32/crc32a/fnv1_64/fnv1a_64/fnv1_32/fnv1a_32/hsieh/murmur/jenkins
distribution: ketama #ketama/modula/random
auto_eject_hosts: true #自动临时剔除不可用节点
redis: true #监控是否为redis
server_retry_timeout: 10000 #剔除节点尝试恢复时间间隔(毫秒)
server_failure_limit: 2 #节点访问失败N次则被自动剔除
servers: #(IP:端口号:权重)
- 192.168.1.222:6379:1
- 192.168.1.222:6380:1
- 192.168.1.222:6381:1
# 测试配置文件
[root@centos222 ~]# nutcracker -t -c /etc/nutcracker/nutcracker.yml
nutcracker: configuration file '/etc/nutcracker/nutcracker.yml' syntax is ok
# 后台运行,配置完成!
[root@centos222 ~]# nutcracker -d -c /etc/nutcracker/nutcracker.yml
#访问 twemproxy 节点,并设置 3 个键值
[root@centos222 ~]# redis-cli -p 22121
127.0.0.1:22121>
127.0.0.1:22121> set name aaaaa
OK
127.0.0.1:22121> set age 33
OK
127.0.0.1:22121> set value 100000
OK
# 此时分别连接3个实例,查看键值情况:
[root@centos222 ~]# redis-cli -p 6379
127.0.0.1:6379> keys *
1) "age"
[root@centos222 ~]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "name"
[root@centos222 ~]# redis-cli -p 6381
127.0.0.1:6381> keys *
1) "value"
可以看到,代理节点 22121 将数据水平划分到了每个节点。
测试结果如下图:
参考:
基于Twemproxy的Redis集群方案
Redis+twemproxy(nutcracker)实现Redis多集群方案