Redis集群后的高可用性,Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题。虽然使用Twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。不熟悉twemproxy的同学,如果玩过nginx反向代理或者mysql proxy,那么你肯定也懂twemproxy了。其实twemproxy不光实现了redis协议,还实现了memcached协议,什么意思?换句话说,twemproxy不光可以代理redis,还可以代理memcached。

Twemproxy最大的痛点在于,无法平滑地扩容/缩容

Redis之Twemproxy 介绍与使用-yellowcong_当前版本

但是从上面我们可以看到这样以来Twemproxy就成了单点,所以通常会结合keepalived来实现Twemproxy的高可用。架构图如下:

Redis之Twemproxy 介绍与使用-yellowcong_配置文件_02

1 wemproxy 安装

1.1 autoconf 安装

wemproxy的安装要求autoconf的版本在2.64以上,否则提示”error: Autoconf version 2.64 or higher is required”。

Redis之Twemproxy 介绍与使用-yellowcong_配置文件_03

查看自己电脑 上是否安装了autoconf,如果版本高,就不需要重新安装了

#查看当前版本信息
rpm -qf /usr/bin/autoconf  

#卸载2.69 版本,当然你版本高,就不需要卸载重新安装了
rpm -e --nodeps autoconf-2.69

查看暗黄的autoconf的版本信息

Redis之Twemproxy 介绍与使用-yellowcong_redis_04

如果没有,下载最新的版本进行安装

#获取压缩包
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz

#解压
tar -zxvf autoconf-2.69.tar.gz

#进入根目录
cd autoconf-2.69

#安装autoconf
./configure --prefix=/usr 

#编译并安装
make && make install 

#查看当前版本信息 ,V是大写
/usr/bin/autoconf -V

#不带路径,直接这么写也可以
autoconf -V

Redis之Twemproxy 介绍与使用-yellowcong_当前版本_05

编译并安装完成

Redis之Twemproxy 介绍与使用-yellowcong_配置文件_06

/usr/bin/autoconf -V,注意‘V’是大写,查看当前版本

Redis之Twemproxy 介绍与使用-yellowcong_redis_07

1.2twemproxy 安装

项目地址:https://github.com/twitter/twemproxy

#下载安装包(通过github的zip来安装)
wget https://codeload.github.com/twitter/twemproxy/zip/master

#解压文件,这个master是zip文件, 如果没有unzip, 需要安装unzip 
#yum install -y unzip
unzip master -d twemproxy

#到根目录
cd twemproxy/twemproxy-master

#安装工具包(有可能系统 没有安装,执行 autoreconf -fvi时,会报错)
yum install libtool   

#配置
autoreconf -fvi

#配置安装环境,一般都是安装到/usr/local目录下
./configure --prefix=/usr/local/twemproxy

#编译
make -j 8

#安装
make install

#配置环境变量
vim /etc/profile

export TWEM_PROXY_BIN=/usr/local/twemproxy/sbin
export PATH=$PATH:$TWEM_PROXY_BIN

#环境变量生效
source /etc/profile

#查看nutcracker 是否安装成功
nutcracker --help

安装完成后,会生成工具nutcrack

Redis之Twemproxy 介绍与使用-yellowcong_配置文件_08

查看nutcracker 是否安装成功

Redis之Twemproxy 介绍与使用-yellowcong_redis_09

Options:
-h, –help                        : 查看帮助文档,显示命令选项
-V, –version                     : 查看nutcracker版本
-t, –test-conf                   : 测试配置脚本的正确性
-d, –daemonize                   : 以守护进程运行
-D, –describe-stats              : 打印状态描述
-v, –verbosity=N                 : 设置日志级别 (default: 5, min: 0, max: 11)
-o, –output=S                    : 设置日志输出路径,默认为标准错误输出 (default: stderr)
-c, –conf-file=S                 : 指定配置文件路径 (default: conf/nutcracker.yml)
-s, –stats-port=N                : 设置状态监控端口,默认22222 (default: 22222)
-a, –stats-addr=S                : 设置状态监控IP,默认0.0.0.0 (default: 0.0.0.0)
-i, –stats-interval=N            : 设置状态聚合间隔 (default: 30000 msec)
-p, –pid-file=S                  : 指定进程pid文件路径,默认关闭 (default: off)
-m, –mbuf-size=N                 : 设置mbuf块大小,以bytes单位 (default: 16384 bytes)

2 启动Twemproxy服务

拷贝配文件/twemproxy-master/conf/ nutcracker.yml 到/usr/local/twemproxy/sbin/目录下

#拷贝配置文件
cp nutcracker.yml /usr/local/twemproxy/sbin/

#编辑配置文件
vim /usr/local/twemproxy/sbin/conf/nutcracker.yml

#我的配置,6个节点,三主三从
alpha:
  listen: 192.168.66.100:22121
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 172.17.97.2:7001:1
   - 172.17.97.2:7002:1
   - 172.17.97.2:7003:1
   - 172.17.97.2:7004:1
   - 172.17.97.2:7005:1
   - 172.17.97.2:7006:1

#测试配置文件是否语法没有错误
nutcracker -t

twemproxy/sbin目录下,有nutcracker 命令 和nutcracker.yml配置文件

Redis之Twemproxy 介绍与使用-yellowcong_配置文件_10

配置文件目录结构,需要注意,nutracker.yml配置文件,是在nutracker执行名利,同级目录下的conf文件夹下

Redis之Twemproxy 介绍与使用-yellowcong_当前版本_11

配置文件

Redis之Twemproxy 介绍与使用-yellowcong_当前版本_12

测试语法是否正确

Redis之Twemproxy 介绍与使用-yellowcong_配置文件_13

3 启动服务

#创建日志文件
touch /usr/local/twemproxy/run/redisproxy.log

#-d 后台启动
#-c 指定配置文件路径,默认是conf/nutcracker.yml
#-p pid文件 这个会自动生成
#-o 日志文件,这个需要先创建好空文件
nutcracker -d -c /usr/local/twemproxy/sbin/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log

#查看环境
ps -ef  |grep nutcracke

#查看端口
netstat -nltp | grep nutcracker

查看启动的配置

Redis之Twemproxy 介绍与使用-yellowcong_当前版本_14

查看端口监听,查看到监听到的是22121端口

Redis之Twemproxy 介绍与使用-yellowcong_配置文件_15

4 测试连接

#连接服务 
# -h 服务器地址
# -p 端口 
# -c 表示连接集群
redis-cli -h 192.168.66.100 -p 22121 -c

Redis之Twemproxy 介绍与使用-yellowcong_当前版本_16

Twemproxy还是非常的靠谱,虽然性能有损失(20%),但是相对来说还是很值得的,而且久经考验,使用非常广泛。后面再进行性能测试。关于更多更加详细的资料请参考官方文档。

问题合集

1 possibly undefined macro: AC_PROG_LIBTOOL

执行 autoreconf -fvi 后,报错,原来缺少一个工具,需要安装依赖 libtool:

yum install libtool

Redis之Twemproxy 介绍与使用-yellowcong_当前版本_17

安装完成后,正常编译,不抱错

Redis之Twemproxy 介绍与使用-yellowcong_redis_18

2 nutcracker: configuration file ‘conf/nutcracker.yml’ syntax is invalid

配置文件存在语法错误,还有可能的问题是配置文件没有找到

Redis之Twemproxy 介绍与使用-yellowcong_redis_19

配置文件目录结构,需要注意,nutracker.yml配置文件,是在nutracker执行名利,同级目录下的conf文件夹下

Redis之Twemproxy 介绍与使用-yellowcong_当前版本_11

3 bind on p 13 to addr ‘172.17.97.2:22121’ failed: Cannot assign requested address

ip绑定失败,这个问题的原因是由于ip绑定有问题,由于虚拟机 的ip是192.168.66.1/24网段的,所以绑定失败了