使用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
分析 ##主机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,在向多播地址,发送自己的状态信息。
KeepAlived状态转换的通知的设置 keepalived可以判断各Director的状态,一旦发生改变,就调用内建的函数,去执行某个自定义的脚本。 自定义的脚本可以根据自己的需要,作出处理的动作,如发送邮件等。 创建自定义的脚本 vim notify.sh
配置后端RS集群 主机C, 配置httpd服务器,提供测试页。 使用脚本配置为DR模式的RS主机。 bash script/set_lvs_dr.sh start
配置调度器Director 主机A 编辑主配置文件 vim /etc/keepalived/keepalived.conf 添加一个Virtual_server 并定义其中的RS
总结 Keepalved的作用主要是两点:
时间服务器设置 主机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
]# 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掉此主机。
- 当RS1 down机后,调度器自动把RS1删除。同样当RS1上机,调度器自动加上RS1.
- 当调度器1 down机后,调度器2自动上线提供服务。
总结 Keepalved的作用主要是两点:
- 高可用LVS的调度器
- 可以动态监控调度器的状态,实现故障转移和修复。
- 当发现调度器出现状态改变时,可以调用脚本进行告警。如发送邮件。
- 大大简化ipvs规则的设置
- 自身可以生成ipvs规则。
- 动态监控后端RS的状态
- 可以动态监控后端RS主机的状态,实时更新ipvs规则。
- 还可以调用脚本进行告警。