Twemproxy又叫nutcraker,是一个由Twitter开源的memcache、Redis协议的轻量级代理。Twemproxy通过引入一个代理层,可以将其后端的多台redis或memcached实例进行统一管理与分配,使应用程序只需要在Twemproxy 上进行操作,而不用关系后面具体有多少个真实的redis或memcached存储。

Twemproxy的特性:

  • 支持失败节点自动删除。可以设置重新连接该节点的时间;可以设置连接多少次之后删除节点
  • 支持设置HashTag。通过HashTag可以自定义将两个key哈希到同一个实例上
  • 减少与redis的直接连接数。保持与Redis的长连接;减少了客户端与服务器连接的链接数量
  • 自动分片到后端多个Redis实例上。支持多种hash算法:MD5,CRC16,CRC32,CRC32a,hsieh,murmur,jenkins;支持多种分片算法:ketama(一致性hash算法的一种实现),modular,random;可以设置后端实例的权重
  • 避免单节点问题。可以平行部署多个代理层,通过HAProxy做负载均衡,将redis的读写分散到多个twemproxy上
  • 支持状态监控。可设置状态监控IP和端口,访问IP和端口可以得到一个JSON格式的状态信息;可设置监控信息刷新间隔时间
  • 使用pipelining处理请求和响应。连接复用,内存复用;将多个连接请求组成redis pipelining统一redis请求
  • 并不支持所有redis命令。不支持redis的事务操作;使用SIDFF,SDIFFSTORE,SINTER,SINTERSTORE,SMOVE,SUNION and SUNIONSTORE命令需要保证key在同一个分片上

哨兵部署

略。哨兵相关部署文章参考Redis安装部署之Sentinel

Twemproxy安装配置

安装依赖包

$ yum install autoconf automake libtool -y 

下载介质
Download Twemproxy

编译安装

$ unzip twemproxy-0.4.1.zip
$ cd twemproxy-0.4.1
$ autoreconf -fvi
$ ./configure --prefix=/usr/local/twemproxy
$ make && make install -j 4

配置参数文件

$ cat >> /usr/local/twemproxy/conf/redis_master.yml << EOF
dba:
distribution: ketama
hash: fnv1a_64
listen: 0.0.0.0:6680
auto_eject_hosts: true
server_retry_timeout: 2000
server_failure_limit: 1
redis: true
redis_auth: Abcd123#
servers:
- 10.240.204.157:4399:1 service_1
- 10.240.204.149:5399:1 service_2
EOF

Tips:参数文件名与哨兵配置的monitor名称有关,例如redis_master_shard1,则配置文件名就为redis_master.yml

切换脚本

$ cat >> /usr/local/twemproxy/scripts/client_reconfig.sh <<EOF
#!/bin/sh
### sentinel call parameters
### <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
#
monitor_name="$1" ##monitor master-group-name
master_old_ip="$4"
master_old_port="$5"
master_new_ip="$6"
master_new_port="$7"
twemproxy_name=$(echo $monitor_name |awk -F'_' '{print $1"_"$2}')
twemproxy_bin="/usr/local/twemproxy/sbin/nutcracker"
twemproxy_conf="/usr/local/twemproxy/conf/${twemproxy_name}.yml"
twemproxy_pid="/service/redis/twemproxy/data/${twemproxy_name}.pid"
twemproxy_log="/service/redis/twemproxy/logs/${twemproxy_name}.log"
twemproxy_cmd="${twemproxy_bin} -c ${twemproxy_conf} -p ${twemproxy_pid} -o ${twemproxy_log} -v 11 -d"

## change master node info
sed -i "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" ${twemproxy_conf}

## restart twemproxy
ps -ef |grep "${twemproxy_cmd}" |grep -v grep |awk '{print $2}'|xargs kill
${twemproxy_cmd}

sleep 1
ps -ef |grep "${twemproxy_cmd}" |grep -v grep
EOF

Tips: 脚本在master异常时自动重写配置文件并重启进程

设置哨兵外部脚本

$ redis-cli -p 26379 sentinel set redis_master_shard1 client-reconfig-script /usr/local/twemproxy/scripts/client_reconfig.sh
$ redis-cli -p 26379 sentinel set redis_master_shard2 client-reconfig-script /usr/local/twemproxy/scripts/client_reconfig.sh

启动Twemproxy

$ /usr/local/twemproxy/sbin/nutcracker -c /usr/local/twemproxy/conf/redis_master.yml -p /service/redis/twemproxy/data/redis_master.pid -o /service/redis/twemproxy/logs/redis_master.log -v 11 -d