两个配置:
    1.粗粒度的
    2.细粒度的

    1. global
    2. log 127.0.0.1 local0 #日志输出配置,所有日志都记录在本机,通过local0输出
    3. maxconn 4096 #最大连接数
    4. chroot /usr/local/haproxy #改变当前工作目录
    5. user haproxy #所属运行的用户
    6. group haproxy #所属运行的用户组
    7. daemon #以后台形式运行ha-proxy
    8. nbproc 4 #启动4个ha-proxy实例
    9. pidfile /usr/local/haproxy/log/haproxy.pid #pid文件位置
    10. defaults
    11. log 127.0.0.1 local3 #日志文件的输出定向
    12. mode tcp #{ tcp|http|health } 设定启动的实例的协议类型,此处要选择tcp,因为redis是基于tcp协议运行的
    13. option dontlognull #保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包
    14. option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    15. retries 2 #重试2次连接失败就认为服务器不可用,主要通过后面的check检查
    16. maxconn 2000 #最大连接数
    17. balance roundrobin #负载均衡算法,roundrobin表示轮询,source表示按照IP
    18. contimeout 5000 #连接超时时间
    19. clitimeout 50000 #客户端连接超时时间
    20. srvtimeout 50000 #服务器端连接超时时间
    21. listen proxy 192.168.1.168:6300
    22. server redis_192.168.1.168_6378 192.168.1.168:6378 check inter 2000 rise 2 fall 5 #你的均衡节点
    23. server redis_192.168.1.168_6379 192.168.1.168:6379 check inter 2000 rise 2 fall 5

    实现思路:

    将两个redis-server作为后端,然后通过haproxy做为负载均衡器,每个redis-server的机器上配置配置一个用于健康检查的shell,并通过xinetd将这个shell设置为服务监听9981端口并进行管理。

    haproxy通过redis-server机器上的9981端口进行健康检查,如果检查失败,就直接移除该redis-server,恢复后又自动添加

    haproxy.conf

    1. global
    2. maxconn 2
    3. # debug
    4. quiet
    5. user zhxia
    6. group zhxia
    7. nbproc 1
    8. log 127.0.0.1 local3
    9. spread-checks 2
    10. defaults
    11. timeout server 3s
    12. timeout connect 3s
    13. timeout client 60s
    14. timeout http-request 3s
    15. timeout queue 3s
    16. frontend redis_read
    17. bind 192.168.187.140:52020
    18. default_backend cluster_redis
    19. backend cluster_redis
    20. mode tcp
    21. option tcpka
    22. balance static-rr
    23. option httpchk
    24. server redis_01 192.168.180.101:6380 weight 1 check port 9981 inter 2s rise 2 fall 1
    25. 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

    1. #!/bin/bash
    2. #===================================================================================
    3. #this script just for check the redis server if it alive
    4. #author:zhxia
    5. #date:2012-08-09
    6. #===================================================================================
    7. redis_host=192.168.180.101
    8. redis_port=6380
    9. redis_client=/usr/local/bin/redis-cli
    10. result=`$redis_client -h $redis_host -p $redis_port -r 1 -i 1 'info' 2>/dev/null`
    11. if [ "$result" != "" ];then
    12. echo -e "HTTP/1.1 200 OK\r\n"
    13. echo -e "Content-Type: Content-Type: text/plain\r\n"
    14. echo -e "\r\n"
    15. echo -e "redis is running,listening port is:${redis_port}.\r\n"
    16. echo -e "\r\n"
    17. else
    18. echo -e "HTTP/1.1 503 Service Unavailable\r\n"
    19. echo -e "Content-Type: Content-Type: text/plain\r\n"
    20. echo -e "\r\n"
    21. echo -e "redis is down! listen port is:${redis_port}"
    22. echo -e "\r\n"
    23. fi

    /etc/xinetd.d/redischk

    1. service redischk
    2. {
    3. flags = REUSE
    4. protocol = tcp
    5. socket_type = stream
    6. port = 9981
    7. wait = no
    8. user = haozu
    9. server = /home/haozu/bin/chk_redis.sh
    10. log_on_failure +=USERID
    11. disable =no
    12. }

    /etc/services

    1. # Local services
    2. redischk 9981/tcp