redis双机自动failover配置
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
主从切换了 。 业务配置的redis的ip地址这个怎么切换? 要手动么。
通过切换脚本自动切换,不用手动切换ip指向