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
|