使用KeepAlived搭建高可用的LVS_调度器以及实时监控后端服务器集群


实验环境: 主机A: 作为调度器,DIP:129,VIP:127 安装ipvsadm,开启核心转发,配置成lvs-dr模式 安装keepalived,高可用Director,并实时监控后端RS。 主机B: 作为调度器2,DIP:132,VIP:127 安装ipvsadm,开启核心转发,配置成lvs-dr模式。 安装keepalived,高可用Director,并实时监控后端RS。 主机C: 作为R1,RIP:137,VIP:127 提供web服务。 安装httpd,php,php-mysql 需要修改内核参数,设置VIP为lo:0别名。   主机D: 作为RS2,RIP:138,VIP:127 提供web服务。 安装httpd,php,php-mysql 需要修改内核参数,设置VIP为lo:0别名。   事前准备
时间服务器设置 主机A:作为内部的时间服务器 安装chrony 编辑配置文件 vim /etc/chrony.conf allow 192.168.60.0/24        #允许本地网络的主机过来同步时间 保存配置文件并重启服务 查看时间同步状态 chronyc sources -V 与远程服务器已经同步成功了。 MS Name/IP address         Stratum Poll Reach LastRx Last sample ^* ntp5.flashdance.cx            2   6     7     1   -110us[-7518us] +/-  180ms 主机B,C,D:作为时间同步客户端,向服务器同步时间 安装chrony 编辑配置文件 vim /etc/chrony.conf 禁用其他时间服务器,只添加129主机作为时间服务器。 #server 0.rhel.pool.ntp.org iburst #server 1.rhel.pool.ntp.org iburst #server 2.rhel.pool.ntp.org iburst #server 3.rhel.pool.ntp.org iburst server 192.168.60.129 iburst 重启服务 查看时间同步状态 chronyc sources -V 可见已经同步成功了。 MS Name/IP address         Stratum Poll Reach LastRx Last sample =============================================================================== ^* www.ilinux.io                 3   6   373    41   -374us[  -19ms] +/-  198ms  
  配置KeepAlived 修改hosts文件 主机A,B vim /etc/hosts 192.168.60.129 node1   192.168.60.132 node1   确保多播功能已经打开 ~]# ifconfig eth0      Link encap:Ethernet  HWaddr 00:0C:29:6F:05:0C             inet addr:192.168.60.132  Bcast:192.168.60.255  Mask:255.255.255.0           inet6 addr: fe80::20c:29ff:fe6f:50c/64 Scope:Link           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1   安装keepalived yum install -y keepalived 备份配置文件 cp keepalived.conf{,.bak} 主机A 主配置文件的内容 vim /etc/keepalived/keepalived.conf   
global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
    vrrp_mcast_group4 224.1.101.33
}
 
 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.60.127/24 dev ens33 label ens33:0
    }
}
  主机B 主配置文件的内容 vim /etc/keepalived/keepalived.conf     
global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2
    vrrp_mcast_group4 224.1.101.33
}
 
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.60.127/24 dev eth0 label eth0:0
    }
}
    保存配置文件   启动keepAlived 主机B 启动keepalived service keepalived start 查看ip,已配置了虚拟ip
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:6F:05:0C  
          inet addr:192.168.60.127  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    主机A 启动keepalived systemctl start keepalived
分析 ##主机A启动之后 #会把VIP抢过来,而主机B会down掉自己的VIP。 ens33:0: flags=4163  mtu 1500         inet 192.168.60.127  netmask 255.255.255.0  broadcast 0.0.0.0         ether 00:0c:29:84:30:a0  txqueuelen 1000  (Ethernet)   抓包分析 主机A tcpdump -i eth1 -nn host 224.1.101.33 此时主机A,在向多播地址,发送自己的状态信息。  
]# tcpdump -i ens33 -nn host 224.1.101.33
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:41.802780 IP 192.168.60.129 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
10:24:42.822797 IP 192.168.60.129 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
10:24:43.842762 IP 192.168.60.129 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
  一旦主机Adown掉,就会触发选举。转为主机B,向多播地址,发送自己的通告信息。  
10:25:56.592852 IP 192.168.60.129 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
10:25:56.885660 IP 192.168.60.129 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 0, authtype simple, intvl 1s, length 20
10:25:57.518427 IP 192.168.60.132 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 95, authtype simple, intvl 1s, length 20
10:25:58.522799 IP 192.168.60.132 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 95, authtype simple, intvl 1s, length 20
10:25:59.524474 IP 192.168.60.132 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 95, authtype simple, intvl 1s, length 20
10:26:00.527112 IP 192.168.60.132 > 224.1.101.33: VRRPv2, Advertisement, vrid 51, prio 95, authtype simple, intvl 1s, length 20
  #当主机Adown时,把自己的优先级设为0,然后主机B发动选举,向多播地址,发送自己的通告信息。并把自己的VIP启用。 #注意:此时广播的vrid为51,如果有多个虚拟路由器,这里就会显示其他的ID。
KeepAlived状态转换的通知的设置 keepalived可以判断各Director的状态,一旦发生改变,就调用内建的函数,去执行某个自定义的脚本。 自定义的脚本可以根据自己的需要,作出处理的动作,如发送邮件等。 创建自定义的脚本 vim notify.sh
#!/bin/bash
#
contact='root@localhost'  
notify() {            
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac           
给自定义脚本文件添加执行权限。 chmod +x notify.sh 编辑主配置文件 vim keepalived.conf
global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
    vrrp_mcast_group4 224.1.101.33
}
 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.60.127/24 dev ens33 label ens33:0
    }
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
#当检测到状态转为master/backup/fault时,就会执行notify.sh脚本。 重启keepalived服务 主机B同样如此设置。   主机A查看 systemctl status keepalived May 30 11:43:12 node1 Keepalived_vrrp[7788]: Sending gratuitous ARP on ens33 for 192.168.60.127 May 30 11:43:12 node1 Keepalived_vrrp[7788]: Sending gratuitous ARP on ens33 for 192.168.60.127 May 30 11:43:12 node1 Keepalived_vrrp[7788]: Sending gratuitous ARP on ens33 for 192.168.60.127 May 30 11:43:12 node1 Keepalived_vrrp[7788]: Opening script file /etc/keepalived/notify.sh May 30 11:43:16 node1 Keepalived_vrrp[7788]: Sending gratuitous ARP on ens33 for 192.168.60.1 #当状态改变时,启动了脚本。
配置后端RS集群 主机C, 配置httpd服务器,提供测试页。 使用脚本配置为DR模式的RS主机。 bash script/set_lvs_dr.sh start
#?/bin/bash
#用作RS主机上配置DR模式。
vip='192.168.60.127'
mask='255.255.255.255'
iface='lo:0'
case $1 in
start)
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $iface $vip netmask $mask broadcast $vip up
route add -host $vip dev $iface
;;
stop)
    ifconfig $iface down
 
 
 
 
echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac
    主机D,也是如上方法配置。
配置调度器Director 主机A 编辑主配置文件 vim /etc/keepalived/keepalived.conf 添加一个Virtual_server 并定义其中的RS
virtual_server 192.168.60.127 80 {
delay_loop 1
lb_algo wrr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.60.137 80 {
    weight 1
    HTTP_GET {
    url {
        path /index.html
        status_code 200
        }
    nb_get_retry 3
    delay_before_retry 2
    connect_timeout 3
}
}
real_server 192.168.60.138 80 {
    weight 1
    HTTP_GET {
    url {
        path /index.html
        status_code 200
        }
    nb_get_retry 3
    delay_before_retry 2
    connect_timeout 3
}
}
}
#格式需要注意
  • 配置项的英文不能写错
  • 大括号左侧要有空格隔开,如,HTTP_GET {
  • 注意权重设置为0时,表示down掉此主机。
  主机A也要配置一个Sorry Server。 停止keepalievd 启动keepalievd #注意keepalived不支持重启服务。 通过ifconfig查看,可知vip已经启用。 通告ipvsadm命令,得知ipvs规则以及启用。   主机B做同样的设置   使用客户端测试   for %i in (1,2,3,4,5,6,7,8,9,10) do curl http://192.168.60.127/index.html
  • 当RS1 down机后,调度器自动把RS1删除。同样当RS1上机,调度器自动加上RS1.
  • 当调度器1 down机后,调度器2自动上线提供服务。
     
  总结 Keepalved的作用主要是两点:
  • 高可用LVS的调度器
    • 可以动态监控调度器的状态,实现故障转移和修复。
    • 当发现调度器出现状态改变时,可以调用脚本进行告警。如发送邮件。
  • 大大简化ipvs规则的设置
    • 自身可以生成ipvs规则。
  • 动态监控后端RS的状态
    • 可以动态监控后端RS主机的状态,实时更新ipvs规则。
    • 还可以调用脚本进行告警。
缺点:其配置文件没有格式检测功能,出现问题无法定位错误。