keepalived最初是为了ipvs设计的,实现HA功能。是工作在linux上,实现vrrp协议的软件。
vrrp:Virtual Router Redundancy Protocol,虚拟路由冗余协议,解决局域网中配置静态网关出现单点失效现象的路由协议
ipvs实际上是一系列规则,配置即可不需要转移。

轻量级,不需要共享存储时使用。

keepalived+nginx
keepalived+harproxy

ipvs HA
环境:director server :CentOS 6.7
1 yum安装keepalived
yum install -y keepalived ipvsadm

2 配置文件
说明:主从上只有两处不同
1)state MASTER --> stare BACKUP
2)priority 100 --> priority 90
# vim /etc/keepalived/keepalived.conf
  1. global_defs {
  2.    notification_email {
  3. root@localhost    # 设置报警邮件地址,可以设置多个,每行一个。
                        # 需开启本机的sendmail服务
  4.    }
  5.    notification_email_from keepalived@localhost    # 邮件发出邮箱
  6.    smtp_server 127.0.0.1     # 设置smtp server地址
  7.    smtp_connect_timeout 30    # 设置连接smtp server的超时时间
  8.    router_id LVS_DEVEL     # 表示运行keepalived服务器的一个标识。
  9. }                          # 发邮件时显示在邮件主题的信息
  10. # 结合track_scrpit做测试使用
    vrrp_script chk_down {
            script "[ -e /etc/keepalived/down ] && exit 1 || exit 0"
            inerval 1
            weight -20
            fall 2
            rise 1
    }

  1. vrrp_instance VI_1 {
  2.     state MASTER         # HA主节点,备节点为BACKUP
  3.     interface eth0       # HA健康状况检查使用的网络端口
  4.     virtual_router_id 51    # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。
  5.                             # 即同一vrrp_instance下,MASTER和BACKUP必须是一致的
  6.     priority 100    # 主节点优先级,高于备节点即可
  7.     advert_int 1        # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
  8.     authentication {
  9.         auth_type PASS     # 设置验证类型,主要有PASS和AH两种
  10.         auth_pass 1111    # 设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
  11.     }
  12.     virtual_ipaddress {
  13. 192.168.8.110/24 dev eth0 lable eth0:0 # 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
  14.     }
  15. # 结合vrrp_scrpit做测试使用
  16. track_script {         chk_down }
  17. # HA状态邮件通知
  18.         
    notify_master "/etc/keepalived/notify.sh master 192.168.8.110 add"
            notify_backup "/etc/keepalived/notify.sh backup 192.168.8.110 remove"
            notify_fault "/etc/keepalived/notify.sh fault 192.168.8.110 remove"

        
    nopreempt # 当重新上线后,不抢夺master,默认是抢夺。注意这个配置只能设置
            
          
    # 在state为BACKUP的主机上,而起这个主机的priority必须必另一台高
        
    debug     # 日志级别
  19. }
  20. virtual_server 192.168.8.110 80 {    # 设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
  21.     delay_loop 6     # 设置运行情况检查时间,单位是秒
  22.     lb_algo rr    # 采取的调度方法
  23.     lb_kind DR    # LVS模型
  24.     nat_mask 255.255.255.0    # RIP的掩码
  25.     persistence_timeout 0    # 持久连接,测试时设置为0
  26.     protocol TCP    #协议
  27.     sorry_server 127.0.0.1 80 # 当两个realserver都宕机时,转向维护页面

  28.     real_server 192.168.8.101 80 { # 配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
  29.         weight 1     # 调度方法的权重
  30.         HTTP_GET {    # 采取HTTP_GET方式对Realserver进行健康状况检查
  31.             url {
  32.               path /
  33.          status_code 200  # 检测状态返回值为健康判断标准
  34.             }
  35.             connect_timeout 3   # 3s未响应,则连接超时时间
  36.             nb_get_retry 3     # 重试次数
  37.             delay_before_retry 3    # 重试间隔时间
  38.         }
  39.     }
  40.    
  41.    real_server 192.168.8.102 80 {
  42.         weight 1
  43.         HTTP_GET {
  44.             url {
  45.               path /
  46.          status_code 200
  47.             }
  48.             connect_timeout 3
  49.             nb_get_retry 3
  50.             delay_before_retry 3
  51.         }
  52.     }
  53. }
更详细的配置文件说明参考:# man keepalived.conf

3 测试
1、所有realserver都宕机
    两个realserver的httpd服务后停止,请求被转发到HA上,返回维护页面
    
2、写监控脚本,完成切换?
    测试脚本见配置文件
    主要检测/etc/keepalived/down是否存在,若存在,则转为BACKUP
    可手动创建down文件,测试MASTER --> BACKUP是否正常

3、HA状态邮件通知
在配置文件中配置
notify_master、
notify_backup、
notify_fault选项
MASTER <--> BACKUP会有邮件通知

通知脚本,接受3个参数
  1. #!/bin/bash
  2. contact='root@localhost'
  3. function usage(){
  4.         echo -e "\nusage `basename $0` [master|backup|fault] vip\n"
  5. }
  6. function notify(){
  7.         subject="$HOSTNAME's status change to $1"
  8.         mailbody="`date +"%F %T"`:HA $HOSTNAME's status change $1,VIP $vip $state."
  9.         echo "$mailbody" | mail -s "$subject" $contact
  10. }
  11. [ $# -gt 3 ] && usage && exit 1
  12. vip=$2
  13. state=$3
  14. case $1 in
  15.         master)
  16.                 notify master;;
  17.         backup)
  18.                 notify backup;;
  19.         fault)
  20.                 notify fault;;
  21.         *)
  22.         usage;;
  23. esac