前言说明
零、知识点介绍
0.1 实验内容流程概述
0.2 高可用行为
0.3 拓扑图
一、环境准备
二、安装配置 Heartbeat
2.1 ha.cf配置
2.2 authkeys配置
2.3 haresources配置
三、ldirectord的安装
3.1 下载说明
3.2 配置监控文件ldirectord.cf
3.3 配置启动脚本文件
四、安装配置 LVS (两台HA节点机操作一致)
4.1 首先检查ip_vs模块是否加载
4.2 安装LVS
4.3 LVS启动脚本配置
五、 realserver节点配置(两个后端web节点)
5.1 realserver脚本配置
5.2 关于限制ARP通过说明
5.3 realserver的web配置
5.4 定义两台HA节点上在后端都realserver失效时报警页面
七、故障切换测试
7.1 heartbeat的高可用切换测试
7.2 后端realserver故障测试
前言说明
说明:此实验参考文章如下(如果打不开可能需要翻墙,包括后面提到的linux-ha.org这个网站)
https://www.suse.com/c/load-balancing-howto-lvs-ldirectord-heartbeat-2/
零、知识点介绍
LVS(linux virtual server)概念:LVS将真实的服务器隐藏在虚拟IP的后面,并基于调度算法在所有群集节点之间负载平衡传入的请求。它在Linux内核内部实现了传输层负载平衡,也称为第4层交换。ipvs是工作在linux的内核中(内核态),ipvsadm是工作在用户层(用户态)平时就通过这个命令管理。
LVS使用三种模型中:
网络地址转换(NAT)
传入请求到达虚拟IP,并通过更改目标IP地址转发到真实服务器。真实的服务器将响应发送到负载平衡器,负载平衡器又更改目标IP地址并将响应转发回客户端。当所有流量通过负载平衡器时,通常会成为群集的瓶颈。
IP隧道
LVS通过IP隧道(重定向到另一个IP地址)向真实服务器发送请求,并且真实服务器使用其自己的路由表直接答复客户端。群集成员可以位于不同的子网中。
直接路由DR 此次实验采用此种类型
来自最终用户的数据包直接转发到真实服务器。由于将实际服务器配置为使用虚拟非ARP别名接口接受共享群集虚拟IP地址的流量,因此不会修改IP数据包。来自真实服务器的响应直接发送到客户端。真实服务器和负载平衡器(LVS)必须位于同一物理网络段中。(要在都2层网络)
ldirectord(linux director daemon):用户监视和管理LVS群集中的真实服务器(其实就是通过定期请求一个已知的URL并检查是否包含预期的字符串来监视实际服务器的运行情况,如果检测失败则从服务器池中取出,一旦恢复将重新导入)。本实验中heartbeat是作为ldirectord的故障转移监视器,本实验中的ldirectord用于引用负载均衡服务器LVS(其实lvs没有健康检查的机制,挂了一台检测不了,通常是配置lvs+keepalived这种原生组合)。
Heartbeat:项目是Linux-HA项目的一部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件。Heartbeat的高可用集群采用的通信方式是udp协议和串口通信,而且heartbeat插件技术实现了集群间的串口、多播、广播和组播通信。它实现了HA功能中的核心功能——心跳,将Heartbeat软件同时安装在两台服务器上,用于监视系统的状态,协调主从服务器的工作,维护系统的可用性。它能侦测服务器应用级系统软件、硬件发生的故障,及时地进行错误隔绝、恢复;通过系统监控、服务监控、IP自动迁移等技术实现在整个应用中无单点故障,简单、经济地确保重要的服务持续高可用性。Heartbeat采用虚拟IP地址映射技术实现主从服务器的切换对客户端透明的功能。但是单一的heartbeat是无法提供健壮的服务的,所以这里结合使用lvs进行负载均衡。
0.1 实验内容流程概述
linux控制器和realserve将具有1个具有其IP地址的真实接口和1个共享虚拟VIP192.168.48.200配置的虚拟别名接口
客户端从vip发送一个网页请求
Ldirectord检查ip和端口号。如果他们与虚拟服务匹配,则通过调度算法选择一个realserver,将该连接记录到哈希表中
负载均衡器lvs将数据包(VIP不变)转发到所选的realserver
当realserver接收到数据包时,发现该数据包是其回环接口lo上的地址,将处理该请求并将结果直接返回给客户端
0.2 高可用行为
节点级别监视
如果运行集群的节点之一停止发送心跳信号,则将其声明为死亡,重新启动该节点,然后将所有资源故障转移到另一节点
服务级别监视
如果vip或者ldrectord或者ipvsadm服务失败。将重新启动该节点所有资源故障转移到另外一个节点
服务粘性(此功能本次实验为了测试,是允许故障恢复回切的)
如果死亡节点重新恢复为活动状态,请将资源保留到他现在运行位置,不要进行故障回切
0.3 拓扑图

一、环境准备
1.1 服务器准备
环境沿用之前文章Hearbeat+Haproxy的环境,这里就不多介绍
二、安装配置 Heartbeat
注意:环境沿用之前文章Hearbeat+Haproxy的环境,这里就不多介绍
2.1 ha.cf配置
[root@ha01 ha.d]# cat ha.cf |egrep -v "^#|^$"debugfile /var/log/ha-debuglogfile /var/log/ha-loglogfacility local0keepalive 2deadtime 30warntime 10initdead 120udpport 694bcast ens37ucast ens37 10.0.0.2auto_failback onnode ha01node ha02ping 192.168.48.2respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfailapiauth ipfail gid=haclient uid=hacluster
2.2 authkeys配置
[root@ha01 ha.d]# cat authkeys |egrep -v "^#|^$"auth 33 md5 Hello!
2.3 haresources配置
[root@ha01 ha.d]# cat haresources |egrep -v "^#|^$"ha01 IPaddr::192.168.48.200/24/ens33 ipvsadm ldirectord//这里VIP地址192.168.48.200//托管的服务ipvsadm ldirectorerd。托管就是当heartbeat启动的时候会自动启动后面的两个服务
三、ldirectord的安装
3.1 下载说明
官网主页:
projects.horms.net/projects/ldirectord/download.shtml下面的话是官网上面说的,目前ldirectord已经集成到了Linux-ha项目中的resource-agents/ldirectord/
The Latest Released Version
The latest release of ldirectord is included in the latest release of Linux-HA, which can be obtained from The Linux-HA Download Software Page.
The Latest Un-Released Version
ldirectord is part of the clustering agents tree and as such the latest and greatest versions of ldirectord is available from http://hg.linux-ha.org/agents/.
项目地址:
https://github.com/ClusterLabs/resource-agents/tree/master/ldirectord
配置文件手册可参考:
http://manpages.ubuntu.com/manpages/trusty/man8/ldirectord.8.html
3.2 配置监控文件ldirectord.cf
ldirectord是和heartbeat相结合的一个服务,可以作为heartbeat的一个启动服务。Ldirectord的作用是监测Real Server,当Real Server失效时,把它从Load Balancer列表中删除,恢复时重新添加。
1)ldirectord说明//前面搭建的实验环境heartbeat已经安装了resource-agents,ldirectord命令在此目录下[root@ha01 init.d]# pwd/usr/local/heartbeat/etc/init.d[root@ha01 init.d]# lsldirectord2)在安装目录中拷贝文件[root@ha01 ldirectord]# pwd/opt/resource-agents-3.9.6/ldirectord[root@ha01 ldirectord]# cp ldirectord.cf /usr/local/heartbeat/etc/ha.d/3)修改配置文件[root@ha01 ha.d]# cat ldirectord.cf |egrep -v "^$|^#"//判定连接检查在超时时间失败后,realserver将宣告死亡checktimeout=3//ldirectord两次检查之间的间隔时间,即主从切换的时间间隔checkinterval=1//是否自动重新加载配置文件autoreload=yes//指定日志文件路径logfile="/var/log/ldirectord.log"//如果一个realserver节点在checktimeout=3周期内没有响应,将会剔除,中断现有客户端连接。//设置yes则出现问题不会剔除,只是客户端发起的新连接不能到达quiescent=no//指定虚拟ipvirtual=192.168.48.200:80//gate是lvs的DR模式,ipip表示TUNL模式,masq表示NAT模式real=192.168.48:182:80 gatereal=192.168.48.183:80 gate//所有realserver全挂,则将web服务重定向到紧急页面。一般公司网站都会有个错误提醒fallback=127.0.0.1:80 gate//指定对协议http进行负载均衡service=http//调度算法,必须要和ipvsadm指定的算法一致scheduler=rr//持久性链接在默认值600s内会将同一个客户端的ip访问引导到同一台realserver,除非这个realserver故障persistent=600#netmask=255.255.255.255//指定协议类型protocol=tcp//检查类型为自动协商checktype=negotiate//监控的端口号checkport=80//请求监控的地址,这个文件一定要放到后端realserver的网站根目录下。request="lvs_index.html"//指定请求和应答的字符串,也就是上面index.html的内容receive="Test Page"//虚拟服务器的名称,可以任意指定virtualhost=www.x.y.z
3.3 配置启动脚本文件
1)拷贝启动脚本模版,如果没有可以安装目录拷贝cp /opt/resource-agents-3.9.6/ldirectord/systemd/ldirectord.service /usr/lib/systemd/system/ldirectord.service2)启动服务[root@ha01 init.d]# ./ldirectord startStarting ldirectord... Can't locate Socket6.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/heartbeat/sbin/ldirectord line 847.BEGIN failed--compilation aborted at /usr/local/heartbeat/sbin/ldirectord line 847.failure//居然有错,明显且少perl包[root@ha01 init.d]# yum install perl-Socket6 perl-IO-Socket-INET6 perl-Email-Date-Format perl-TimeDate perl-Pod-Escapes perl-Pod-Simple perl-Test-Pod perl-MailTools perl-libwww-perl//再次启动,还是报错,不过报错有变化了[root@ha01 init.d]# ./ldirectord startStarting ldirectord... Can't locate Sys/Syslog.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/heartbeat/sbin/ldirectord line 855.BEGIN failed--compilation aborted at /usr/local/heartbeat/sbin/ldirectord line 855.failure//实在不知道缺少哪个包了。直接yum -y install perl-*了[root@ha01 init.d]# ./ldirectord startStarting ldirectord...success[root@ha01 init.d]#
四、安装配置 LVS (两台HA节点机操作一致)
4.1 首先检查ip_vs模块是否加载
1)先查询出系统支持ip_vs模块[root@ha01 ha.d]# find / -name ip_vs*/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_dh.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_ftp.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_lblc.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_lblcr.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_lc.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_nq.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_rr.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_sed.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_sh.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_wlc.ko.xz/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_wrr.ko.xz2)根据查询出的模块内容,编写脚本[root@ha01 modules]# cat ipvs.modules#!/bin/bashipvs_modules="ip_vs ip_vs_dh ip_vs_ftp ip_vs_lblc ip_vs_lblcr ip_vs_lc ip_vs_ng ip_vs_pe_sip ip_vs_rr ip_vs_sed ip_vs_sh ip_vs_wlc ip_vs_wrr nf_conntrack_ipv4"for kernel_module in ${ipvs_modules}; do/sbin/modinfo ${kernel_module} > /dev/null 2>&1if [ $? -eq 0 ]; then/sbin/modprobe ${kernel_module}fidone3)确认是否加载成功[root@ha01 modules]# lsmod |grep ip_vsip_vs_wrr 12697 0ip_vs_wlc 12519 0ip_vs_sh 12688 0ip_vs_sed 12519 0ip_vs_rr 12600 0ip_vs_pe_sip 12697 0nf_conntrack_sip 33860 1 ip_vs_pe_sipip_vs_lc 12516 0ip_vs_lblcr 12922 0ip_vs_lblc 12819 0ip_vs_ftp 13079 0nf_nat 26787 1 ip_vs_ftpip_vs_dh 12688 0ip_vs 141092 22 ip_vs_dh,ip_vs_lc,ip_vs_rr,ip_vs_sh,ip_vs_ftp,ip_vs_sed,ip_vs_wlc,ip_vs_wrr,ip_vs_pe_sip,ip_v_lblcr,ip_vs_lblcnf_conntrack 133387 4 ip_vs,nf_nat,nf_conntrack_sip,nf_conntrack_ipv4libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
4.2 安装LVS
1)yum安装ipvsadm[root@ha01 modules]# yum install ipvsadm2)确认是否安装正常[root@ha01 modules]# ipvsadm -L -n //可以看到当前还没有配置IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
4.3 LVS启动脚本配置
[root@ha01 ha.d]# cat /etc/sysconfig/ipvsadm#!/bin/bash#定义变量VIP=192.168.48.200VIP_GW=192.168.48.2WEB01=192.168.48.182WEB02=192.168.48.183logger $0 called with $1case "$1" instart)#清空ipvsadm规则/sbin/ipvsadm -C/sbin/ipvsadm --set 30 5 60#将VIP地址绑定到ens33网卡上面,并指定路由出口使ens33:0/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 up/sbin/route add -host $VIP dev ens33:0#配置LVS规则,如果没有-p参数,会发现VIP地址会在后端两台web上轮询切换。这里的调度算法一定要和后面ldirectord的一致/sbin/ipvsadm -A -t $VIP:80 -s rr -p 120/sbin/ipvsadm -a -t $VIP:80 -r $WEB01:80 -g/sbin/ipvsadm -a -t $VIP:80 -r $WEB02:80 -g#开启路由转发echo "1" > /proc/sys/net/ipv4/ip_forward#增加锁文件,主要使给status进行判断touch /var/lock/subsys/ipvsadm > /dev/null 2>&1#启动ipvsadm/sbin/ipvsadmecho "ipvsadm running";;stop)#清空规则/sbin/ipvsadm -C#禁用路由转发echo "0" > /proc/sys/net/ipv4/ip_forward#停止ens33:0网卡,及删除路由规则ifconfig ens33:0 downroute del $WEB_VIP > /dev/null 2>&1#删除锁文件rm -rf /var/lock/subsys/ipvsadm > /dev/null 2>&1echo "ipvsadm stoped";;status)if [ ! -e /var/lock/subsys/ipvsadm ];thenecho "ipvsadm is stoped"exit 1elseipvsadm -Lnecho "ipvsadm is Runing!!"fi;;*)echo "Usage: $0 {start|stop|status}"exit 1esacexit 0//权限配置[root@ha01 ha.d]# chmod 755 /etc/sysconfig/ipvsadm[root@ha01 ha.d]# chmod +x /etc/sysconfig/ipvsadm//拷贝启动脚本到heartbeat的resource.d目录下,进行托管[root@ha01 resource.d]# cp /etc/sysconfig/ipvsadm .//脚本启动测试。脚本没问题后就关闭服务。有heartbeat进行托管[root@ha01 ha.d]# /etc/sysconfig/ipvsadm startipvsadm runningIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:http rr persistent 120-> web01:http Route 1 0 0-> web02:http Route 1 0 0注意:这里还是要关注下速率这个选项。实际中会经常用到[root@ha01 ha.d]# ipvsadm -l --rateIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS-> RemoteAddress:PortTCP ha01:http 0 0 0 0 0-> web01:http 0 0 0 0 0-> web02:http 0 0 0 0 0说明:CPS (current connection rate) 每秒连接数InPPS (current in packet rate) 每秒的入包个数OutPPS (current out packet rate) 每秒的出包个数InBPS (current in byte rate) 每秒入流量(字节)OutBPS (current out byte rate) 每秒入流量(字节)
五、 realserver节点配置(两个后端web节点)
5.1 realserver脚本配置
#!/bin/bashVIP=192.168.48.200case $1 instart)#配置lo:0网卡,绑定虚拟ip。并添加路由ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP/sbin/route add -host $VIP dev lo:0#设定ARP抑制echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/lo/arp_announceecho "1" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/all/arp_announcesysctl -p > /dev/null 2>&1echo "RealServer is Running";;stop)#禁用lo:0网卡ifconfig lo:0 downroute del $VIP > /dev/null 2>&1#关闭APP抑制echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" > /proc/sys/net/ipv4/conf/lo/arp_announceecho "0" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" > /proc/sys/net/ipv4/conf/all/arp_announceecho "RealServer is Stoped";;status)LOADDR=`/sbin/ifconfig lo:0 | grep "$VIP"`PSADDR=`/bin/netstat -rn | grep "$VIP"`if [ "$LOADDR" == "" -a "$PSADDR" == "" ];thenecho "LVS-DR real server not running"elseecho "LVS-DR real server Running"fiexit 1;;*)echo "Usage: $0 {start|stop|status}"exit 2;;esacexit 0//修改权限[root@web01 ~]# chmod 755 /etc/init.d/realserver[root@web01 ~]# chmod +x /etc/init.d/realserver//开机启动[root@web01 ~]# chmod 777 /etc/rc.local[root@web01 ~]# echo "/etc/init.d/realserver" >> /etc/rc.local//运行脚本[root@web01 ~]# /etc/init.d/realserver startRealServer is Running//检查是否正常。是否lo网卡多了一个192.168.48.200的虚拟ip[root@web01 ~]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.48.200/32 brd 192.168.48.200 scope global lo:0 //这里多了vip地址valid_lft forever preferred_lft forever
5.2 关于限制ARP通过说明
客户端会将所有HTTP请求发送到VIP 192.168.48.200。在他们可以连接到IP之前,先进行ARP请求,以将MAC地址与请求的IP地址进行匹配。由于linux-director和真实服务器都具有配置有相同虚拟IP地址的接口,因此它们中的每一个都可以随机答复192.168.0.200的ARP请求。这将破坏群集的负载平衡。要解决此问题,必须禁用虚拟接口的ARP答复。(这里就是只准前端arp响应,后端realserver禁止响应)
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "1" > /proc/sys/net/ipv4/conf/all/arp_ignore如果在lo网络接口设备或任何网络接口设备上配置了请求的IP地址,不响应ARP请求。(只响应目的IP地址为接收网卡上的本地地址的arp请求。)//解释:在实验环境中考虑如下://当ens33 lo ens37 收到客户端的请求。比如ens33和ens37发现不是自己网卡上的ip,是不会回应arp请求的echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announceecho "2" > /proc/sys/net/ipv4/conf/all/arp_announce由于将ARP请求的源IP地址输入到目标的ARP缓存中,因此具有宣布该地址的作用。对于真实服务器的本地接口或任何其他虚拟接口,这是不希望的。使用此设置,每当真实服务器发出ARP请求时,它就会尝试使用真实IP作为ARP请求的源IP。//解释:在实验环境中考虑如下://当ens33 lo ens37 收到客户端的请求。比如ens33和ens37发现不是自己网卡上的ip,是不会回应arp请求的//realserver在最后收到的包是包含:源ip:192.168.48.2(客户端ip),目的ip:vip(192.168.48.200),RS mac(web01mac)//配置为2后回应则应该是:(真实ip作为回应)//realserver响应的包是包含:源vip:192.168.48.200,目的ip:192.168.48.2(客户端ip)作为响应
5.3 realserver的web配置
前面实验中已经安装了nginx,这里不再重述
//制作配置文件[root@web01 ~]# cat /usr/share/nginx/html/index.htmlweb01: 192.168.48.182[root@web02 ~]# cat /usr/share/nginx/html/index.htmlweb01: 192.168.48.183//制作ldirectord配置文件中指定的lvs[root@web01 ~]# cat /usr/share/nginx/html/lvs_index.htmlTest Page[root@web02 ~]# cat /usr/share/nginx/html/lvs_index.htmlTest Page
5.4 定义两台HA节点上在后端都realserver失效时报警页面
1)两个HA上面安装web[root@ha01 ha.d]# rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.8.0-1.el7.ngx.x86_64.rpm2)错误页面配置[root@ha01 ha.d]# cat /usr/share/nginx/html/index.htmlthis is error page[root@ha02 ha.d]# cat /usr/share/nginx/html/index.htmlthis is error page3)启动nginx服务[root@ha01 ha.d]# systemctl start nginx && systemctl enable nginx[root@ha02 ha.d]# systemctl start nginx && systemctl enable nginx4)访问测试下C:\Users\cs>curl 192.168.48.180this is error pageC:\Users\cs>curl 192.168.48.181this is error page
六、启动Heartbeat服务
说明:前面已经配置并测试了ipvsadm,ldirectord都能够正常启动停止。现在启动heartbeat服务,就会自动启动ipvsadm和ldirectord。在haresource中已经做了配置了(vip在哪里,服务就在哪里启动)1)启动主节点的heartbeat//检查服务运行状态[root@ha01 ha.d]# systemctl status heartbeat● heartbeat.service - Heartbeat High Availability Cluster Communication and MembershipLoaded: loaded (/usr/lib/systemd/system/heartbeat.service; disabled; vendor preset: disabled)Active: active (running) since Fri 2020-08-14 23:03:04 EDT; 31s agoMain PID: 10183 (heartbeat)Tasks: 8CGroup: /system.slice/heartbeat.service├─10183 heartbeat: master control process├─10185 heartbeat: FIFO reader├─10186 heartbeat: write: bcast ens37├─10187 heartbeat: read: bcast ens37├─10188 heartbeat: write: ucast ens37├─10189 heartbeat: read: ucast ens37├─10190 heartbeat: write: ping 192.168.48.2└─10191 heartbeat: read: ping 192.168.48.2Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: set SO_REUSEPORT(w)Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: set SO_REUSEADDRAug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: bound receive socket to device: ens37Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: set SO_REUSEPORTAug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: started on port 694 interface ens37 to 10.0.0.2Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ping heartbeat started.Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: Local status now set to: 'up'Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: Link ha01:ens37 up.Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: Link 192.168.48.2:192.168.48.2 up.Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: Status update for node 192.168.48.2: status ping//检查进程是否启动[root@ha01 ha.d]# ps -ef |grep heartbeatroot 10183 1 0 23:03 ? 00:00:00 heartbeat: master control processroot 10185 10183 0 23:03 ? 00:00:00 heartbeat: FIFO readerroot 10186 10183 0 23:03 ? 00:00:00 heartbeat: write: bcast ens37root 10187 10183 0 23:03 ? 00:00:00 heartbeat: read: bcast ens37root 10188 10183 0 23:03 ? 00:00:00 heartbeat: write: ucast ens37root 10189 10183 0 23:03 ? 00:00:00 heartbeat: read: ucast ens37root 10190 10183 0 23:03 ? 00:00:00 heartbeat: write: ping 192.168.48.2root 10191 10183 0 23:03 ? 00:00:00 heartbeat: read: ping 192.168.48.2haclust+ 10212 10183 0 23:04 ? 00:00:00 /usr/local/heartbeat/libexec/heartbeat/ipfailroot 10233 1122 0 23:04 pts/0 00:00:00 grep --color=auto heartbeat//检查心跳的udp端口是否启动[root@ha01 ha.d]# lsof -i:694COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEheartbeat 10186 root 10u IPv4 120683 0t0 UDP *:ha-clusterheartbeat 10187 root 10u IPv4 120683 0t0 UDP *:ha-clusterheartbeat 10188 root 10u IPv4 120689 0t0 UDP *:ha-clusterheartbeat 10189 root 10u IPv4 120689 0t0 UDP *:ha-cluster//检查vip[root@ha01 ha.d]# ip addr |grep ens332: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000inet 192.168.48.180/24 brd 192.168.48.255 scope global ens33inet 192.168.48.200/24 brd 192.168.48.255 scope global secondary ens33:1 //记住这里的ens33:1是heartbeat提供的//检查是否自动托管了ldirectord服务[root@ha01 ha.d]# ps -ef |grep ldirectordroot 10626 1 1 23:04 ? 00:00:00 /usr/bin/perl -w /usr/local/heartbeat/etc/ha.d//resource.d/ldirectord startroot 10638 1122 0 23:05 pts/0 00:00:00 grep --color=auto ldirectord//检查是否自动托管了ipvsadm服务[root@ha01 ha.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 0 0-> 192.168.48.183:80 Route 1 0 0调度算法:rr 轮询persistent:持久性连接600(默认值),客户端和服务端建立会话保持的连接时间,客户端会持续访问同一个页面-----------------------------------------------------------------------------------------------------------------------------------------------------2)启动备节点。备节点正常情况下,是不可能启动ipvsadm和ldirectord的。除非主节点故障。(只需记住vip在哪里,哪里就提供服务)//根据说的,实际检查下[root@ha02 ~]# ip addr |grep 192.168.48.200 |wc -l0[root@ha02 ~]# ps -ef |grep ldirector |grep -v grep|wc -l0[root@ha02 ~]# ipvsadm -LIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn//监听的心跳端口肯定在的[root@ha02 ~]# lsof -i:694COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEheartbeat 44682 root 10u IPv4 131542 0t0 UDP *:ha-clusterheartbeat 44683 root 10u IPv4 131542 0t0 UDP *:ha-clusterheartbeat 44684 root 10u IPv4 131548 0t0 UDP *:ha-clusterheartbeat 44685 root 10u IPv4 131548 0t0 UDP *:ha-cluster3)访问测试下。//浏览器打开,可以看到有两个活跃链接[root@ha01 ha.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 0 0-> 192.168.48.183:80 Route 1 2 0//由于持续时间太久了直接停掉183的web服务[root@web02 ~]# systemctl stop nginx[root@ha01 ha.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 0 1[root@web02 ~]# systemctl start nginx[root@ha01 ha.d]# ipvsadm -Ln //可以看到已经恢复了IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 0 0-> 192.168.48.183:80 Route 1 0 0上面启动heartbeat时候托管的ldirectord错误如下:[root@ha01 ha.d]# tailf /var/log/ldirectord.log[Fri Aug 14 23:11:42 2020|ldirectord|11655] Invoking ldirectord invoked as: /usr/local/heartbeat/etc/ha.d/resource.d/ldirectord start[Fri Aug 14 23:11:42 2020|ldirectord|11655] Starting Linux Director v1.186-ha as daemon[Fri Aug 14 23:11:42 2020|ldirectord|11657] Changed virtual server: 192.168.48.200:80[Fri Aug 14 23:11:42 2020|ldirectord|11657] Purged real server (start): 192.168.48.182:80 (192.168.48.200:80)[Fri Aug 14 23:11:42 2020|ldirectord|11657] system(/sbin/ipvsadm -a -t 192.168.48.200:80 -r 0.0.0.182:80 -g -w 1) failed:[Fri Aug 14 23:11:42 2020|ldirectord|11657] Added real server: 0.0.0.182:80 (192.168.48.200:80) (Weight set to 1)//发现后端的web02这台realserver地址获取的是0.0.0.182???然后不用heartbeat托管,重启了下ldirectord.log,然后关闭,在启动heartbeat居然恢复了。。。不知道是不是虚拟机环境的问题


七、故障切换测试
7.1 heartbeat的高可用切换测试
1)停止主节点heartbeat[root@ha01 ha.d]# systemctl stop heartbeat//已经切换到了备节点[root@ha02 ha.d]# ip addr|grep ens332: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000inet 192.168.48.181/24 brd 192.168.48.255 scope global ens33inet 192.168.48.200/24 brd 192.168.48.255 scope global secondary ens33:2//检查托管的ipvsam和ipvsadm是否启动[root@ha02 ha.d]# ps -ef |grep ldirector |grep -v greproot 45168 1 0 14:39 ? 00:00:01 /usr/bin/perl -w /usr/local/heartbeat/etc/ha.d//resource.d/ldirectord start[root@ha02 ~]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 0 0-> 192.168.48.183:80 Route 1 0 0//网页测试C:\Users\cs>curl 192.168.48.200web02: 192.168.48.1832) 切回到主节点[root@ha01 ha.d]# systemctl start heartbeat[root@ha01 ha.d]# ip addr|grep 192.168.48.200inet 192.168.48.200/24 brd 192.168.48.255 scope global secondary ens33:1[root@ha01 ha.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 0 0-> 192.168.48.183:80 Route 1 0 0C:\Users\cs>curl 192.168.48.200web02: 192.168.48.183
7.2 后端realserver故障测试
//停止web02的nginx[root@web02 ~]# systemctl stop nginx//客户端访问测试,切换到了web01C:\Users\cs>curl 192.168.48.200web01: 192.168.48.182//客户看到有两个活跃链接[root@ha01 ha.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 2 0//在停止web01的nginx[root@web01 ~]# systemctl stop nginx//见证奇迹了[root@ha01 ha.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 127.0.0.1:80 Route 1 0 0( 前面在ldirectord里面配置的如果后端realserver都挂了,将会使用配置文件定义的默认告警页面)//客户端访问下效果。见图片。说明配置生效。//现在把两个realserver节点都恢复[root@ha01 ha.d]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.48.200:80 rr persistent 600-> 192.168.48.182:80 Route 1 0 0 //又回来了-> 192.168.48.183:80 Route 1 0 0//再次访问页面如下图说明实验已经成功






