redis-sentinel可以自动切换主从,但是sentinel没有提供proxy的功能,自动切换主从后,redis主的服务器ip会变,对代码来说不是透明的。如果两台内网服务器可以使用keepalived的虚拟ip来解决此问题。我的供应商无法提供多余的内网ip,但是刚好有一台服务闲置,可以专门开一个端口做转发,要实现的功能是该端口始终映射到后端redis主服务器,无论sentinel是否切换主从。我是使用redis-sentinel+xinetd+shell脚本来实现的。

redis主:10.11.15.114
redis从:10.11.15.115
redis-sentinel :10.11.15.123 (xinetd)

一.安装redis

1.下载

官方下载地址:

wget http://download.redis.io/releases/redis-3.0.3.tar.gz

2.编译安装

先安装tcl,版本需要大于8.5,redis本身不依赖tcl,主要是安装好redis后跑测试程序用的:

yum install tcl  

确保安装了最新的jemalloc:

yum install jemalloc jemalloc-devel

进入src代码目录编译并安装:

make PREFIX=/opt/redis install
make test
cd utils
./install_server.sh

编译后只会将redis的执行文件复制到指定目录,其它配置、日志等使用src/utils目灵下的install_server.sh 进行交互生成,依次输入端口、配置文件路径、log路径、data目录、执行文件目录,会自动生成redis的conf文件并启动,init控制脚本也会安装好。

二、主从同步

配置一个从服务器非常简单, 只要在从服务器的配置文件中增加slaveof可以了:

slaveof  10.11.15.114 6379

表示这个redis是10.11.15.114的从服务器,然后先启动主服务器在启动从服务器。
启动之后在两边:

/opt/redis/bin/redis-cli info Replication

看一下主从的状态,随便set个记录测试下。

三、端口映射

linux下实现端口映射的方法很多,可以用iptables,很多第三方工具也提供了此功能,我用的是centos系统的xinetd,可靠性稳定性都比较高

1.安装xinetd

 yum install xinetd
 chkconfig xinetd on

2.配置xinetd映射端口

新建一个/etc/xinetd.d/redis-switch文件,内容为:

service redis-switch
{
 disable = no
 type = UNLISTED
 socket_type = stream
 protocol = tcp
 wait = no
 redirect = 10.11.15.114 6379
 bind = 0.0.0.0
 port = 6379
 user = root
}

启动xinetd服务:

service xinetd start

使用redis-cli或者telnet测试一下本机的6379是否转发到的redis主服务器的6379端口。

四、redis-sentinel配置

在redis 3.0.3中redsi-sentinel的二进制文件就是redis-server,只要在启时指定sentinel的配置文件,并加上--sentinel即可,sentinel的配置文件:

port 26329
daemonize yes
logfile "/opt/redis/log/sentinel.log"
sentinel monitor redis-MS 10.11.15.114 6379 1
sentinel down-after-milliseconds redis-MS 3000
sentinel failover-timeout redis-MS 18000
sentinel parallel-syncs redis-MS 1
sentinel notification-script redis-MS /opt/redis/log.sh
sentinel client-reconfig-script redis-MS /opt/redis/switch.sh

通知脚本log.sh :

#!/bin/bash
echo "master failover at `date +%Y/%m/%d-%H:%M:%S`" > /opt/redis/log/redis_issues.log
cat /opt/redis/log/redis_issues.log |mail  admin@nixops.me
#主从切换,主从服务器上下线,都会触发此脚本,适合用来做邮件通知,随时掌握集群的变化。

映射切换脚本 switch.sh :

#!/bin/bash
log_path=/opt/redis/log/failover.log
xinetd_conf=/etc/xinetd.d/redis-switch
host=`/opt/redis/bin/redis-cli -p 26329 info |grep master0  |awk -F ',' '{ print $3 }'|awk -F '=' '{print $2}'|awk -F ':' '{print $1}'`

echo "master failover at `date +%Y/%m/%d-%H:%M:%S`" >> $log_path
echo "'$host' now be the master host "  >> $log_path
sed  -i  '/redirect/d'  $xinetd_conf
sed  -i  '/bind/ i redirect = '$host' 6379' $xinetd_conf
service xinetd restart >>/dev/null
# echo "master-slave changed " |mail admin@nixops.me  

要注意启动顺序,先启动主redis,在启动从redis,之后启动sentinel,否则可能导致sentinel无法切换。其实可以配置一主二从,用三个sentinel监控,原理都差不多,懒的搞了。随便吐槽一下官方的redis-cluster,架构是去中心化的,不适合小规模,对高可用支持还是不够好

参考文章:
http://segmentfault.com/a/1190000002680804
http://blog.mkfree.com/posts/5257683d479e1dd72e7c1b4e