实现思路:
将两个redis-server作为后端,然后通过haproxy做为负载均衡器,每个redis-server的机器上配置配置一个用于健康检查的shell,并通过xinetd将这个shell设置为服务监听9981端口并进行管理。
haproxy通过redis-server机器上的9981端口进行健康检查,如果检查失败,就直接移除该redis-server,恢复后又自动添加
haproxy.conf
global maxconn 2# debug quiet user zhxia group zhxia nbproc 1 log 127.0.0.1 local3 spread-checks 2defaults timeout server 3s timeout connect 3s timeout client 60s timeout http-request 3s timeout queue 3sfrontend redis_read bind 192.168.187.140:52020 default_backend cluster_redisbackend cluster_redis mode tcp option tcpka balance static-rr option httpchk server redis_01 192.168.180.101:6380 weight 1 check port 9981 inter 2s rise 2 fall 1 server redis_02 192.168.180.101:6381 weight 1 check port 9981 inter 2s rise 2 fall 1
PS:
check:启用健康检测
inter:健康检测间隔
rise:检测服务可用的连续次数
fall:检测服务不可用的连续次数
安装xinetd,统一对服务进行管理与端口监听
chk_redis.sh
#!/bin/bash#===================================================================================#this script just for check the redis server if it alive#author:zhxia#date:2012-08-09#===================================================================================redis_host=192.168.180.101redis_port=6380redis_client=/usr/local/bin/redis-cliresult=`$redis_client -h $redis_host -p $redis_port -r 1 -i 1 'info' 2>/dev/null`if [ "$result" != "" ];then echo -e "HTTP/1.1 200 OK\r\n" echo -e "Content-Type: Content-Type: text/plain\r\n" echo -e "\r\n" echo -e "redis is running,listening port is:${redis_port}.\r\n" echo -e "\r\n"else echo -e "HTTP/1.1 503 Service Unavailable\r\n" echo -e "Content-Type: Content-Type: text/plain\r\n" echo -e "\r\n" echo -e "redis is down! listen port is:${redis_port}" echo -e "\r\n"fi
/etc/xinetd.d/redischk
service redischk{ flags = REUSE protocol = tcp socket_type = stream port = 9981 wait = no user = haozu server = /home/haozu/bin/chk_redis.sh log_on_failure +=USERID disable =no}
/etc/services
# Local servicesredischk 9981/tcp