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最大的痛点在于,无法平滑地扩容/缩容
但是从上面我们可以看到这样以来Twemproxy就成了单点,所以通常会结合keepalived来实现Twemproxy的高可用。架构图如下:
1 wemproxy 安装
1.1 autoconf 安装
wemproxy的安装要求autoconf的版本在2.64以上,否则提示”error: Autoconf version 2.64 or higher is required”。
查看自己电脑 上是否安装了autoconf,如果版本高,就不需要重新安装了
#查看当前版本信息
rpm -qf /usr/bin/autoconf
#卸载2.69 版本,当然你版本高,就不需要卸载重新安装了
rpm -e --nodeps autoconf-2.69
查看暗黄的autoconf的版本信息
如果没有,下载最新的版本进行安装
#获取压缩包
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
编译并安装完成
/usr/bin/autoconf -V
,注意‘V’是大写,查看当前版本
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
查看nutcracker 是否安装成功
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配置文件
配置文件目录结构,需要注意,nutracker.yml配置文件,是在nutracker执行名利,同级目录下的conf文件夹下
配置文件
测试语法是否正确
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
查看启动的配置
查看端口监听,查看到监听到的是22121端口
4 测试连接
#连接服务
# -h 服务器地址
# -p 端口
# -c 表示连接集群
redis-cli -h 192.168.66.100 -p 22121 -c
Twemproxy还是非常的靠谱,虽然性能有损失(20%),但是相对来说还是很值得的,而且久经考验,使用非常广泛。后面再进行性能测试。关于更多更加详细的资料请参考官方文档。
问题合集
1 possibly undefined macro: AC_PROG_LIBTOOL
执行 autoreconf -fvi
后,报错,原来缺少一个工具,需要安装依赖 libtool:
yum install libtool
安装完成后,正常编译,不抱错
2 nutcracker: configuration file ‘conf/nutcracker.yml’ syntax is invalid
配置文件存在语法错误,还有可能的问题是配置文件没有找到
配置文件目录结构,需要注意,nutracker.yml配置文件,是在nutracker执行名利,同级目录下的conf文件夹下
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网段的,所以绑定失败了