暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Centos7.4+LVS+Heartbeat+Ldirectord+Nginx高可用集群方案部署手册

请叫我水哥 2020-08-15
946

前言说明

零、知识点介绍

    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的环境,这里就不多介绍

服务器

地址

应用程序

操作系统

ha01

192.168.48.180

lvs+hearbeat

centos7.4

ha02

192.168.48.181

lvs+hearbeat

centos7.4

LVS

192.168.48.200



web01

192.168.48.182

nginx

centos7.4

web02

192.168.48.183

nginx

centos7.4

二、安装配置 Heartbeat

注意:环境沿用之前文章Hearbeat+Haproxy的环境,这里就不多介绍

2.1 ha.cf配置

[root@ha01 ha.d]# cat ha.cf |egrep -v "^#|^$"
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast ens37
ucast ens37 10.0.0.2
auto_failback on
node ha01
node ha02
ping 192.168.48.2
respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

2.2 authkeys配置

[root@ha01 ha.d]# cat authkeys |egrep -v "^#|^$"
auth 3
3 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]# ls
ldirectord
2)在安装目录中拷贝文件
[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
//指定虚拟ip
virtual=192.168.48.200:80
//gate是lvs的DR模式,ipip表示TUNL模式,masq表示NAT模式
real=192.168.48:182:80 gate
real=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.service
2)启动服务
[root@ha01 init.d]# ./ldirectord start
Starting 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 start
Starting 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 start
Starting 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.xz
2)根据查询出的模块内容,编写脚本
[root@ha01 modules]# cat ipvs.modules
#!/bin/bash
ipvs_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>&1
if [ $? -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
3)确认是否加载成功
[root@ha01 modules]# lsmod |grep ip_vs
ip_vs_wrr 12697 0
ip_vs_wlc 12519 0
ip_vs_sh 12688 0
ip_vs_sed 12519 0
ip_vs_rr 12600 0
ip_vs_pe_sip 12697 0
nf_conntrack_sip 33860 1 ip_vs_pe_sip
ip_vs_lc 12516 0
ip_vs_lblcr 12922 0
ip_vs_lblc 12819 0
ip_vs_ftp 13079 0
nf_nat 26787 1 ip_vs_ftp
ip_vs_dh 12688 0
ip_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_lblc
nf_conntrack 133387 4 ip_vs,nf_nat,nf_conntrack_sip,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack

4.2 安装LVS

1)yum安装ipvsadm
[root@ha01 modules]# yum install ipvsadm
2)确认是否安装正常
[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.200
VIP_GW=192.168.48.2
WEB01=192.168.48.182
WEB02=192.168.48.183


logger $0 called with $1


case "$1" in
start)
#清空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/ipvsadm
echo "ipvsadm running"
;;
stop)
#清空规则
/sbin/ipvsadm -C
#禁用路由转发
echo "0" > /proc/sys/net/ipv4/ip_forward
#停止ens33:0网卡,及删除路由规则
ifconfig ens33:0 down
route del $WEB_VIP > /dev/null 2>&1
#删除锁文件
rm -rf /var/lock/subsys/ipvsadm > /dev/null 2>&1
echo "ipvsadm stoped"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm is stoped"
exit 1
else
ipvsadm -Ln
echo "ipvsadm is Runing!!"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 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 start
ipvsadm running
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 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/bash
VIP=192.168.48.200
case $1 in
start)
#配置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_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p > /dev/null 2>&1
echo "RealServer is Running"
;;
stop)
#禁用lo:0网卡
ifconfig lo:0 down
route del $VIP > /dev/null 2>&1
#关闭APP抑制
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer is Stoped"
;;
status)
LOADDR=`/sbin/ifconfig lo:0 | grep "$VIP"`
PSADDR=`/bin/netstat -rn | grep "$VIP"`
if [ "$LOADDR" == "" -a "$PSADDR" == "" ];then
echo "LVS-DR real server not running"
else
echo "LVS-DR real server Running"
fi
exit 1
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 2
;;
esac
exit 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 start
RealServer is Running
//检查是否正常。是否lo网卡多了一个192.168.48.200的虚拟ip
[root@web01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 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_ignore
echo "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_announce
echo "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.html
web01: 192.168.48.182
[root@web02 ~]# cat /usr/share/nginx/html/index.html
web01: 192.168.48.183
//制作ldirectord配置文件中指定的lvs
[root@web01 ~]# cat /usr/share/nginx/html/lvs_index.html
Test Page
[root@web02 ~]# cat /usr/share/nginx/html/lvs_index.html
Test 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.rpm
2)错误页面配置
[root@ha01 ha.d]# cat /usr/share/nginx/html/index.html
this is error page
[root@ha02 ha.d]# cat /usr/share/nginx/html/index.html
this is error page
3)启动nginx服务
[root@ha01 ha.d]# systemctl start nginx && systemctl enable nginx
[root@ha02 ha.d]# systemctl start nginx && systemctl enable nginx
4)访问测试下
C:\Users\cs>curl 192.168.48.180
this is error page
C:\Users\cs>curl 192.168.48.181
this 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 Membership
Loaded: loaded (/usr/lib/systemd/system/heartbeat.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2020-08-14 23:03:04 EDT; 31s ago
Main PID: 10183 (heartbeat)
Tasks: 8
CGroup: /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.2


Aug 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_REUSEADDR
Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: bound receive socket to device: ens37
Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: set SO_REUSEPORT
Aug 14 23:03:05 ha01 heartbeat[10183]: [10183]: info: glib: ucast: started on port 694 interface ens37 to 10.0.0.2
Aug 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 heartbeat
root 10183 1 0 23:03 ? 00:00:00 heartbeat: master control process
root 10185 10183 0 23:03 ? 00:00:00 heartbeat: FIFO reader
root 10186 10183 0 23:03 ? 00:00:00 heartbeat: write: bcast ens37
root 10187 10183 0 23:03 ? 00:00:00 heartbeat: read: bcast ens37
root 10188 10183 0 23:03 ? 00:00:00 heartbeat: write: ucast ens37
root 10189 10183 0 23:03 ? 00:00:00 heartbeat: read: ucast ens37
root 10190 10183 0 23:03 ? 00:00:00 heartbeat: write: ping 192.168.48.2
root 10191 10183 0 23:03 ? 00:00:00 heartbeat: read: ping 192.168.48.2
haclust+ 10212 10183 0 23:04 ? 00:00:00 /usr/local/heartbeat/libexec/heartbeat/ipfail
root 10233 1122 0 23:04 pts/0 00:00:00 grep --color=auto heartbeat
//检查心跳的udp端口是否启动
[root@ha01 ha.d]# lsof -i:694
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
heartbeat 10186 root 10u IPv4 120683 0t0 UDP *:ha-cluster
heartbeat 10187 root 10u IPv4 120683 0t0 UDP *:ha-cluster
heartbeat 10188 root 10u IPv4 120689 0t0 UDP *:ha-cluster
heartbeat 10189 root 10u IPv4 120689 0t0 UDP *:ha-cluster
//检查vip
[root@ha01 ha.d]# ip addr |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.48.180/24 brd 192.168.48.255 scope global ens33
inet 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 ldirectord
root 10626 1 1 23:04 ? 00:00:00 /usr/bin/perl -w /usr/local/heartbeat/etc/ha.d//resource.d/ldirectord start
root 10638 1122 0 23:05 pts/0 00:00:00 grep --color=auto ldirectord
//检查是否自动托管了ipvsadm服务
[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 InActConn
TCP 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 -l
0
[root@ha02 ~]# ps -ef |grep ldirector |grep -v grep|wc -l
0
[root@ha02 ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
//监听的心跳端口肯定在的
[root@ha02 ~]# lsof -i:694
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
heartbeat 44682 root 10u IPv4 131542 0t0 UDP *:ha-cluster
heartbeat 44683 root 10u IPv4 131542 0t0 UDP *:ha-cluster
heartbeat 44684 root 10u IPv4 131548 0t0 UDP *:ha-cluster
heartbeat 44685 root 10u IPv4 131548 0t0 UDP *:ha-cluster


3)访问测试下。
//浏览器打开,可以看到有两个活跃链接
[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 InActConn
TCP 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 -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 InActConn
TCP 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 ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.48.181/24 brd 192.168.48.255 scope global ens33
inet 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 grep
root 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 -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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.200
web02: 192.168.48.183
2) 切回到主节点
[root@ha01 ha.d]# systemctl start heartbeat
[root@ha01 ha.d]# ip addr|grep 192.168.48.200
inet 192.168.48.200/24 brd 192.168.48.255 scope global secondary ens33:1
[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 InActConn
TCP 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.200
web02: 192.168.48.183

7.2 后端realserver故障测试

//停止web02的nginx
[root@web02 ~]# systemctl stop nginx
//客户端访问测试,切换到了web01
C:\Users\cs>curl 192.168.48.200
web01: 192.168.48.182
//客户看到有两个活跃链接
[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 InActConn
TCP 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 -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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 -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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
//再次访问页面如下图
说明实验已经成功


文章转载自请叫我水哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论