部署LVS-DR集群

LVS-DR工作原理

1、LVS-DR数据包流向分析

为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4。
2. 部署LVS-DR集群 - 图1

  1. Client向目标VIP发出请求,Director(负载均衡器)接收。此时IP包头及数据帧头信息为:

2. 部署LVS-DR集群 - 图2

  1. Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送。IP包头及数据帧头信息如下:

2. 部署LVS-DR集群 - 图3

  1. RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文。随后重新封装报文,发送到局域网。此时IP包头及数据帧头信息为:

2. 部署LVS-DR集群 - 图4

  1. Client将收到回复报文。Client认为得到正常的服务,而不会知道是哪一台服务器处理的。注意:如果跨网段,那么报文通过路由器经由Internet返回给用户。

2、LVS-DR中的ARP问题

  • 在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址;
  • 在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
    • 当一个ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上的,它们都会接收到ARP广播;
    • 此时只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播;
  • 对节点服务器进行处理,使其不响应针对VIP的ARP请求
    • 使用虚接口lo:0承载VIP地址;
    • 设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求
  • RealServer返回报文(源IP是VIP)经路由器转发,在重新封装报文时,需要先获取路由器的MAC地址
  • 发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口(例如ens33)的IP地址
  • 路由器收到ARP请求后,将更新ARP表项。原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址;此时新来的请求报文,路由器根据ARP表项,会将该报文转发给RealServer,从而导致Director的VIP失效
    • 对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址;

解决ARP的两个问题的设置方法

修改/etc/sysctl.conf文件

  1. net.ipv4.conf.lo.arp_ignore = 1
  2. net.ipv4.conf.lo.arp_announce = 2
  3. net.ipv4.conf.all.arp_ignore = 1
  4. net.ipv4.conf.all.arp_announce = 2

构建LVS-DR群集

案例环境

主机 IP地址 系统
LVS 192.168.100.100/24 CentOS 7.7
web01 192.168.100.110/24 192.168.254.10/24 CentOS 7.7
web02 192.168.100.120/24 192.168.254.20/24 CentOS 7.7
NFS Server 192.168.254.100/24 CentOS 7.7
VIP 192.168.100.254/24

一. 基本环境部署

  • IP地址配置
  • 主机名设置
  • 关闭Selinux

二、LVS配置

安装ipvsadm

  1. [root@lvs ~]# yum install ipvsadm -y

加载ip_vs模块

  1. [root@lvs ~]# modprobe ip_vs
  2. [root@lvs ~]# lsmod | grep ip_vs
  3. ip_vs 145497 0
  4. nf_conntrack 139224 7 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6
  5. libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
  6. [root@lvs ~]# cat /proc/net/ip_vs
  7. IP Virtual Server version 1.2.1 (size=4096)
  8. Prot LocalAddress:Port Scheduler Flags
  9. -> RemoteAddress:Port Forward Weight ActiveConn InActConn

启动服务

  1. [root@lvs ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
  2. [root@lvs ~]# systemctl start ipvsadm.service
  3. [root@lvs ~]# systemctl status ipvsadm.service
  4. ipvsadm.service - Initialise the Linux Virtual Server
  5. Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor preset: disabled)
  6. Active: active (exited) since 2020-01-11 16:07:17 CST; 7min ago
  7. Process: 1186 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited, status=0/SUCCESS)
  8. Main PID: 1186 (code=exited, status=0/SUCCESS)
  9. CGroup: /system.slice/ipvsadm.service
  10. 1 11 16:07:17 lvs systemd[1]: Starting Initialise the Linux Virtual Server...
  11. 1 11 16:07:17 lvs systemd[1]: Started Initialise the Linux Virtual Server.

LVS在网卡子接口上配置vip,配置DR转发的ipvs规则。提高配置效率,将这些操作编写为shell脚本如下:

  1. [root@lvs ~]# vim /root/lvs_dr.sh
  2. #!/bin/bash
  3. VIP='192.168.100.254'
  4. VIP_MASK='255.255.255.255'
  5. VIP_PORT='80'
  6. IFACE='ens34:1'
  7. RS1='192.168.100.110'
  8. RS2='192.168.100.120'
  9. case $1 in
  10. start)
  11. ifconfig $IFACE $VIP netmask $VIP_MASK broadcast $VIP up
  12. iptables -F
  13. #配置IPVS规则
  14. ipvsadm -C
  15. ipvsadm -A -t ${VIP}:${VIP_PORT} -s wrr
  16. ipvsadm -a -t ${VIP}:${VIP_PORT} -r ${RS1} -g -w 1
  17. ipvsadm -a -t ${VIP}:${VIP_PORT} -r ${RS2} -g -w 1
  18. ;;
  19. stop)
  20. ipvsadm -C
  21. ifconfig $IFACE down
  22. ;;
  23. *)
  24. echo "Usage $(basename $0) start|stop"
  25. exit 1
  26. ;;
  27. esac

三、配置真实web服务器

Realserver的vip配置在lo口,与arp_ignore、arp_announce参数的修改相配套,抑制了RealServer不应答vip的arp请求,而接受lvs-dr转发过来的报文。提高配置效率,将这些操作编写为shell脚本如下:

  1. [root@web01 ~]# vim lvs_dr_rs.sh
  2. #!/bin/bash
  3. VIP='192.168.100.254'
  4. VIP_MASK='255.255.255.255'
  5. case $1 in
  6. start)
  7. echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
  8. echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore
  9. echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
  10. echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce
  11. ifconfig lo:0 $VIP netmask $VIP_MASK broadcast $VIP up
  12. route add -host $VIP dev lo:0
  13. ;;
  14. stop)
  15. ifconfig lo:0 down
  16. echo '0' > /proc/sys/net/ipv4/conf/all/arp_ignore
  17. echo '0' > /proc/sys/net/ipv4/conf/lo/arp_ignore
  18. echo '0' > /proc/sys/net/ipv4/conf/all/arp_announce
  19. echo '0' > /proc/sys/net/ipv4/conf/lo/arp_announce
  20. ;;
  21. *)
  22. echo "Usage:$(basename $0) start|stop"
  23. exit 1
  24. ;;
  25. esac

四. 配置网站

设置web01的网站界面为:

  1. [root@web01 ~]# cat /usr/share/nginx/html/index.html
  2. <h1>web01</h1>

设置web02的网站界面:

  1. [root@web02 ~]# cat /usr/share/nginx/html/index.html
  2. <h1>web02</h1>

五. 访问测试

使用客户端电脑进行测试:

2. 部署LVS-DR集群 - 图5

2. 部署LVS-DR集群 - 图6

六. 配置NFS服务器

安装nfs-utils软件包

  1. [root@nfs-server ~]# yum install nfs-utils -y
  2. [root@nfs-server ~]# firewall-cmd --add-service=nfs --add-service=mountd --add-service=rpc-bind --permanent
  3. [root@nfs-server ~]# firewall-cmd --reload
  4. [root@nfs-server ~]# systemctl restart nfs-server.service
  5. [root@nfs-server ~]# systemctl enable nfs-server.service

配置共享目录

  1. [root@nfs-server ~]# mkdir /webroot
  2. [root@nfs-server ~]# cat /etc/exports
  3. /webroot 192.168.254.0/24(sync,rw,no_root_squash)
  4. [root@nfs-server ~]# vim /webroot/index.html
  5. <h1>this is test!</h1>

七. 网站挂载NFS目录

也需要安装nfs-utils软件包,然后挂载

  1. [root@web01 yum.repos.d]# mount 192.168.254.100:/webroot /usr/share/nginx/html/
  2. [root@web02 yum.repos.d]# mount 192.168.254.100:/webroot /usr/share/nginx/html/

设置永久挂载

  1. [root@web02 yum.repos.d]# vim /etc/fstab
  2. 192.168.254.100:/webroot /usr/share/nginx/html nfs defaults 0 0

这样所有的网站页面统一,实现负载分担

八. 总结

1. 为什么所有RS上都要配置VIP

因为当调度器把请求转发给对应RS时,并没有修改报文目的IP,因此请求报文目的IP仍为VIP,所以如果RS没有配置VIP,那么报文到达RS后就会被丢弃。

2. 为什么所有RS要设置arp_ignore=1和arp_announce=2

arp_ignore=1:只响应目的IP地址为接收网卡上的本地地址的arp请求

因为我们在RS上都配置了VIP,因此此时是存在IP冲突的,当外部客户端向VIP发起请求时,会先发送arp请求,此时调度器和RS都会响应这个请求。如果某个RS响应了这个请求,则之后该客户端的请求就都发往该RS,并没有经过LVS,因此也就没有真正的负载均衡,LVS也就没有存在的意义。因此我们需要设置RS不响应对VIP的arp请求,这样外部客户端的所有对VIP的arp请求才会都解析到调度器上,然后经由LVS的调度器发往各个RS。

系统默认arp_ignore=0,表示响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。也就是说,如果机器上有两个网卡设备A和B,即使在A网卡上收到对B的IP的arp请求,也会回应。而arp_ignore设置成1,则不会对B的IP的arp请求进行回应。由于lo肯定不会对外通信,所以如果只有一个对外网口,其实只要设置这个对外网口即可,不过为了保险,很多时候都对all也进行设置。

arp_announce=2:网卡在发送arp请求时使用出口网卡IP作为源IP

当RS处理完请求,想要将响应发回给客户端,此时想要获取目的IP对应的目的MAC地址,那么就要发送arp请求。arp请求的目的IP就是想要获取MAC地址的IP,那arp请求的源IP呢?自然而然想到的是响应报文的源IP地址,但也不是一定是这样,arp请求的源IP是可以选择的,而arp_announce的作用正是控制这个地址如何选择。系统默认arp_announce=0,也就是源ip可以随意选择。这就会导致一个问题,如果发送arp请求时使用的是其他网口的IP,达到网络后,其他机器接收到这个请求就会更新这个IP的mac地址,而实际上并不该更新,因此为了避免arp表的混乱,我们需要将arp请求的源ip限制为出口网卡ip,因此需要设置arp_announce=2。

3. 为什么RS上的VIP要配置在lo上

由上可知,只要RS上的VIP不响应arp请求就可以了,因此不一定要配置在lo上,也可以配置在其他网口。由于lo设备不会直接接收外部请求,因此只要设置机器上的出口网卡不响应非本网卡上的arp请求接口。但是如果VIP配置在其他网口上,除了上面的配置,还需要配置该网口不响应任何arp请求,也就是arp_ignore要设置为8。

4. 为什么RS上lo配置的VIP掩码为32位

这是由于lo设备的特殊性导致,如果lo绑定192.168.0.200/24,则该设备会响应该网段所有IP(192.168.0.1~192.168.0.254)的请求,而不是只响应192.168.0.200这一个地址。

5. 为什么调度器与RS要在同一网段中

根据DR模式的原理,调度器只修改请求报文的目的mac,也就是转发是在二层进行,因此调度器和RS需要在同一个网段,从而ip_forward也不需要开启。

LVS+Keepalived群集

一、Keepalived

keepalived软件介绍

Keepalived是一个用C语言编写的路由软件。 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。

keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)
  • 官方网站: http://www.keepalived.org/

BFD(BidirectionalForwardingDetection)双向转发检测。BFD是一种双向转发检测机制,可以提供毫秒级的检测,可以实现链路的快速检测,BFD通过与上层路由协议联动,可以实现路由的快速收敛,确保业务的永续性。为了提供最快的网络故障检测,Keepalived实现了BFD协议。

Keepalived高可用故障切换转移原理

Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

Keepalived的多数核心功能模块均位于用户空间,而仅有IPVS和NETLINK模块位于内核空间,但是这两个内核模块正是Keepalived实现负载均衡和路由高可用的核心模块,其中的NETLINK主要用于提供高级路由及其相关的网络功能。Keepalived的大部分功能模块位于用户空间,其中几个核心功能模块的介绍如下。

2. 部署LVS-DR集群 - 图7

  • WatchDog :其主要负责监控Checkers和VRRP子进程的运行状况。
  • Checkers :此功能模块主要负责真实服务器的健康检查( HealthChecking ),是Keepalived最主要的功能之一,因为HealthChecking是负载均衡功能稳定运行的基础,LVS集群节点的故障隔离和重新加入均依赖于HealthChecking的结果。
  • VRRPStack :此功能模块主要负责负载均衡器之间的故障切换,如果集群架构中仅使用一个LVS负载均衡器,由于本身不具备故障切换的条件,则VRRPStack不是必须的。
  • IPVS Wrapper :此模块主要用来发送设定的规则到内核IPVS代码。Keepalived的设计目标是构建高可用的LVS负载均衡群集,Keepalived在运行中将会通过IPVS Wrapper模块调用IPVSAdmin工具来创建虚拟服务器,检查和管理LVS集群物理服务器池。
  • Netlink Reflector :此功能模块主要用来设定VRRP的VIP地址并提供相关的网络功能,该模块通过与内核中的NETLINK模块交互,从而为Keepalived 提供路由高可用功能。

从Keepalived 的实现原理和功能来看,Keepalived是开源负载均衡项目LVS的增强和虚拟路由协议VRRP实现的集合,即Keepalived通过整合和增强LVS与VRRP来提供高可用的负载均衡系统架构。

VRRP协议

VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议的出现很好的解决了这个问题。VRRP能够在不改变组网的情况下,采用将多台路由设备组成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现默认网关的备份。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。

2. 部署LVS-DR集群 - 图8

VRRP协议的基本概念:

  • VRRP路由器(VRRP Router):运行VRRP协议的设备,它可能属于一个或多个虚拟路由器,如SwitchA和SwitchB。
  • 虚拟路由器(Virtual Router):又称VRRP备份组,由一个Master设备和多个Backup设备组成,被当作一个共享局域网内主机的缺省网关。如SwitchA和SwitchB共同组成了一个虚拟路由器。
  • Master路由器(Virtual Router Master):承担转发报文任务的VRRP设备,如SwitchA。
  • Backup路由器(Virtual Router Backup):一组没有承担转发任务的VRRP设备,当Master设备出现故障时,它们将通过竞选成为新的Master设备,如SwitchB。
  • VRID:虚拟路由器的标识。如SwitchA和SwitchB组成的虚拟路由器的VRID为1。
  • 虚拟IP地址(Virtual IP Address):虚拟路由器的IP地址,一个虚拟路由器可以有一个或多个IP地址,由用户配置。如SwitchA和SwitchB组成的虚拟路由器的虚拟IP地址为10.1.1.10/24。
  • IP地址拥有者(IP Address Owner):如果一个VRRP设备将虚拟路由器IP地址作为真实的接口地址,则该设备被称为IP地址拥有者。如果IP地址拥有者是可用的,通常它将成为Master。如SwitchA,其接口的IP地址与虚拟路由器的IP地址相同,均为10.1.1.10/24,因此它是这个VRRP备份组的IP地址拥有者。
  • 虚拟MAC地址(Virtual MAC Address):虚拟路由器根据虚拟路由器ID生成的MAC地址。一个虚拟路由器拥有一个虚拟MAC地址,格式为:00-00-5E-00-01-{VRID}(VRRP for IPv4);00-00-5E-00-02-{VRID}(VRRP for IPv6)。当虚拟路由器回应ARP请求时,使用虚拟MAC地址,而不是接口的真实MAC地址。如SwitchA和SwitchB组成的虚拟路由器的VRID为1,因此这个VRRP备份组的MAC地址为00-00-5E-00-01-01。

VRRP协议报文用来将Master设备的优先级和状态通告给同一备份组的所有Backup设备。

VRRP协议报文封装在IP报文中,发送到分配给VRRP的IP组播地址。在IP报文头中,源地址为发送报文接口的主IP地址(不是虚拟IP地址),目的地址是224.0.0.18,TTL是255,协议号是112。

目前,VRRP协议包括两个版本:VRRPv2和VRRPv3。VRRPv2仅适用于IPv4网络,VRRPv3适用于IPv4和IPv6两种网络。VRRPv3不支持认证功能,而VRRPv2支持认证功能。VRRP认证方式有3种:无认证、简单字符认证、MD5认证。

VRRP的工作过程如下:

  1. VRRP备份组中的设备根据优先级选举出Master。Master设备通过发送免费ARP报文,将虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务。
  2. Master设备周期性向备份组内所有Backup设备发送VRRP通告报文,以公布其配置信息(优先级等)和工作状况。
  3. 如果Master设备出现故障,VRRP备份组中的Backup设备将根据优先级重新选举新的Master。
  4. VRRP备份组状态切换时,Master设备由一台设备切换为另外一台设备,新的Master设备会立即发送携带虚拟路由器的虚拟MAC地址和虚拟IP地址信息的免费ARP报文,刷新与它连接的主机或设备中的MAC表项,从而把用户流量引到新的Master设备上来,整个过程对用户完全透明。
  5. 原Master设备故障恢复时,若该设备为IP地址拥有者(优先级为255),将直接切换至Master状态。若该设备优先级小于255,将首先切换至Backup状态,且其优先级恢复为故障前配置的优先级。
  6. Backup设备的优先级高于Master设备时,由Backup设备的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。
    • 抢占模式:在抢占模式下,如果Backup设备的优先级比当前Master设备的优先级高,则主动将自己切换成Master。
    • 非抢占模式:在非抢占模式下,只要Master设备没有出现故障,Backup设备即使随后被配置了更高的优先级也不会成为Master设备。

Keepalived 本质上是提供数据流转发与服务器健康检查并具备故障切换的高可用路由,而数据转发与健康检查是对LVS功能的扩展和增强,因此也可以认为Keepalived是运行在用户空间的LVS 路由(LVS Router) 进程。在实际应用中,Keepalived通常部署在两台主备或一主多备的服务器上,即Keepalived进程既运行在Active/Master状态的LVS Router中,也运行在Passive/Slave状态的LVS Router中,而所有运行Keepalived进程的LVS Router都遵循虚拟路由冗余协议VRRP。在VRRP的协议框架下,作为Master的Router将会处理两个主要任务,即转发客户端访问请求到后端物理服务器以进行负载均衡和周期性的发送VRRP协议报文,而作为Slave的Routers则负责接收VRRP报文,如果某一时刻作为Slave的Routers接收VRRP报文失败,则认为Master Router故障, 并从Slave Routers中重新选举产生一个新的Master Router 。

在Failover 的过程中, Keepalived创建的虚拟服务器会被清除,新的Master Router将接管VIP 发送ARP信息、设置IPVS Table记录条目(Virtual Server)以及物理服务器的健康检查和发送VRRP报文。Keepalived的Failover操作针对的是四层TCP/IP协议,即传输层,因为TCP在传输层上进行的是基于链路连接的数据传输。所以,当服务器在响应TCP请求时,如果出现设置时间段的Timeout,则Keepalived的健康检查机制将会监测到该情况并认为该服务器故障,然后将其从服务器池中移除(故障服务器隔离) 。

构建LVS+Keepalived集群

案例环境

主机 IP地址 系统
LVS01 192.168.100.100/24 CentOS 7.7
LVS02 192.168.100.101/24 CentOS 7.7
web01 192.168.100.110/24 192.168.254.10/24 CentOS 7.7
web02 192.168.100.120/24 192.168.254.20/24 CentOS 7.7
NFS Server 192.168.254.100/24 CentOS 7.7
VIP 192.168.100.254/24

一. 基本环境部署

  • IP地址配置
  • 主机名设置
  • 关闭Selinux

二. LVS配置

安装ipvsadm

  1. [root@lvs ~]# yum install ipvsadm -y

加载ip_vs模块

  1. [root@lvs ~]# modprobe ip_vs
  2. [root@lvs ~]# lsmod | grep ip_vs
  3. ip_vs 145497 0
  4. nf_conntrack 139224 7 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6
  5. libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
  6. [root@lvs ~]# cat /proc/net/ip_vs
  7. IP Virtual Server version 1.2.1 (size=4096)
  8. Prot LocalAddress:Port Scheduler Flags
  9. -> RemoteAddress:Port Forward Weight ActiveConn InActConn

启动服务

  1. [root@lvs ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
  2. [root@lvs ~]# systemctl start ipvsadm.service
  3. [root@lvs ~]# systemctl status ipvsadm.service
  4. ipvsadm.service - Initialise the Linux Virtual Server
  5. Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor preset: disabled)
  6. Active: active (exited) since 2020-01-11 16:07:17 CST; 7min ago
  7. Process: 1186 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited, status=0/SUCCESS)
  8. Main PID: 1186 (code=exited, status=0/SUCCESS)
  9. CGroup: /system.slice/ipvsadm.service
  10. 1 11 16:07:17 lvs systemd[1]: Starting Initialise the Linux Virtual Server...
  11. 1 11 16:07:17 lvs systemd[1]: Started Initialise the Linux Virtual Server.

三. 安装keepalived服务

安装软件

  1. [root@lvs01 ~]# yum install keepalived -y
  2. [root@lvs02 ~]# yum install keepalived -y

配置防火墙:(2台均要配置)

  1. [root@lvs01 ~]# firewall-cmd --permanent --add-service=http
  2. [root@lvs01 ~]# firewall-cmd --permanent --add-rich-rule="rule protocol value='vrrp' accept"
  3. [root@lvs01 ~]# firewall-cmd --reload

四. 配置keepalived

配置keepalived主配置文件

  1. #主负载平衡器的配置
  2. [root@lvs01 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  3. [root@lvs01 ~]# vim /etc/keepalived/keepalived.conf
  4. ! Configuration File for keepalived
  5. #全局配置
  6. global_defs {
  7. notification_email {
  8. acassen@firewall.loc
  9. failover@firewall.loc
  10. sysadmin@firewall.loc
  11. }
  12. notification_email_from Alexandre.Cassen@firewall.loc
  13. smtp_server 127.0.0.1
  14. smtp_connect_timeout 30
  15. router_id lvs01 #路由器ID,一般配置为主机名
  16. }
  17. vrrp_instance VI_1 {
  18. state MASTER #初始状态
  19. #绑定vip的网卡为ens33,你的网卡的名字可能不一样,这里需要你改一下
  20. interface ens34
  21. virtual_router_id 100
  22. priority 150 #优先级
  23. advert_int 1
  24. authentication {
  25. auth_type PASS
  26. auth_pass 123.com
  27. }
  28. virtual_ipaddress {
  29. 192.168.100.254/32 dev ens34 label ens34:254
  30. }
  31. }
  32. virtual_server 192.168.100.254 80 {
  33. delay_loop 6 #每隔6秒查询realserver状态
  34. lb_algo rr #负载平衡算法
  35. lb_kind DR #负载平衡模式
  36. persistence_timeout 50 #同一IP的连接50秒内被分配到同一台realserver
  37. protocol TCP #用TCP协议检查realserver状态
  38. real_server 192.168.100.110 80 {
  39. weight 1
  40. TCP_CHECK {
  41. connect_timeout 8 #8秒无响应超时
  42. nb_get_retry 3
  43. delay_before_retry 3
  44. connect_port 80
  45. }
  46. }
  47. real_server 192.168.100.120 80 {
  48. weight 1
  49. TCP_CHECK {
  50. connect_timeout 8
  51. nb_get_retry 3
  52. delay_before_retry 3
  53. connect_port 80
  54. }
  55. }
  56. }

备用负载平衡器的配置

  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 127.0.0.1
  10. smtp_connect_timeout 30
  11. router_id lvs02
  12. }
  13. vrrp_instance VI_1 {
  14. state BACKUP
  15. interface ens34
  16. virtual_router_id 100
  17. priority 120
  18. advert_int 1
  19. authentication {
  20. auth_type PASS
  21. auth_pass 123.com
  22. }
  23. virtual_ipaddress {
  24. 192.168.100.254/32 dev ens34 label ens34:254
  25. }
  26. }
  27. virtual_server 192.168.100.254 80 {
  28. delay_loop 6
  29. lb_algo rr
  30. lb_kind DR
  31. persistence_timeout 50
  32. protocol TCP
  33. real_server 192.168.100.110 80 {
  34. weight 1
  35. TCP_CHECK {
  36. connect_timeout 8
  37. nb_get_retry 3
  38. delay_before_retry 3
  39. connect_port 80
  40. }
  41. }
  42. real_server 192.168.100.120 80 {
  43. weight 1
  44. TCP_CHECK {
  45. connect_timeout 8
  46. nb_get_retry 3
  47. delay_before_retry 3
  48. connect_port 80
  49. }
  50. }
  51. }

五. 启动keepalived

启动服务

  1. [root@lvs01 ~]# systemctl start keepalived.service
  2. [root@lvs01 ~]# systemctl enable keepalived.service
  3. [root@lvs02 ~]# systemctl start keepalived.service
  4. [root@lvs02 ~]# systemctl enable keepalived.service

查看虚拟地址是否生成在主负载平衡器上

  1. [root@lvs01 ~]# ip addr show ens34
  2. 2: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  3. link/ether 00:0c:29:9a:61:44 brd ff:ff:ff:ff:ff:ff
  4. inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens34
  5. valid_lft forever preferred_lft forever
  6. inet 192.168.100.254/32 scope global ens34:254
  7. valid_lft forever preferred_lft forever
  8. inet6 fe80::20f2:635a:5528:d422/64 scope link noprefixroute
  9. valid_lft forever preferred_lft forever
  10. #备份负载平衡器上没有,如果有的话,要检查防火墙的配置

如果在主上停止keepalived服务,发现备份上会生成虚拟IP地址

  1. [root@lvs01 ~]# systemctl stop keepalived.service
  2. [root@lvs02 ~]# ip addr show ens34
  3. 2: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  4. link/ether 00:0c:29:90:81:0e brd ff:ff:ff:ff:ff:ff
  5. inet 192.168.100.101/24 brd 192.168.100.255 scope global noprefixroute ens34
  6. valid_lft forever preferred_lft forever
  7. inet 192.168.100.254/32 scope global ens34:254
  8. valid_lft forever preferred_lft forever
  9. inet6 fe80::4363:18ed:9ead:787c/64 scope link noprefixroute
  10. valid_lft forever preferred_lft forever

六. 在web服务器上运行脚本

  1. [root@web02 ~]# cat lvs_dr_rs.sh
  2. #!/bin/bash
  3. VIP='192.168.100.254'
  4. VIP_MASK='255.255.255.255'
  5. case $1 in
  6. start)
  7. echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
  8. echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore
  9. echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
  10. echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce
  11. ifconfig lo:0 $VIP netmask $VIP_MASK broadcast $VIP up
  12. route add -host $VIP dev lo:0
  13. ;;
  14. stop)
  15. ifconfig lo:0 down
  16. echo '0' > /proc/sys/net/ipv4/conf/all/arp_ignore
  17. echo '0' > /proc/sys/net/ipv4/conf/lo/arp_ignore
  18. echo '0' > /proc/sys/net/ipv4/conf/all/arp_announce
  19. echo '0' > /proc/sys/net/ipv4/conf/lo/arp_announce
  20. ;;
  21. *)
  22. echo "Usage:$(basename $0) start|stop"
  23. exit 1
  24. ;;
  25. esac

七. 在客户端访问网站服务的集群地址

  1. [root@test ~]# curl http://192.168.100.254
  2. <h1>web01 test</h1>

停止主负载平衡器的keepalived服务,依然可以访问

八. 配置NFS服务器

安装nfs-utils软件包

  1. [root@nfs-server ~]# yum install nfs-utils -y
  2. [root@nfs-server ~]# firewall-cmd --add-service=nfs --add-service=mountd --add-service=rpc-bind --permanent
  3. [root@nfs-server ~]# firewall-cmd --reload
  4. [root@nfs-server ~]# systemctl restart nfs-server.service
  5. [root@nfs-server ~]# systemctl enable nfs-server.service

配置共享目录

  1. [root@nfs-server ~]# mkdir /webroot
  2. [root@nfs-server ~]# cat /etc/exports
  3. /webroot 192.168.254.0/24(sync,rw,no_root_squash)
  4. [root@nfs-server ~]# vim /webroot/index.html
  5. <h1>this is test!</h1>

九. 网站挂载NFS目录

也需要安装nfs-utils软件包,然后挂载

  1. [root@web01 yum.repos.d]# mount 192.168.254.100:/webroot /usr/share/nginx/html/
  2. [root@web02 yum.repos.d]# mount 192.168.254.100:/webroot /usr/share/nginx/html/

设置永久挂载

  1. [root@web02 yum.repos.d]# vim /etc/fstab
  2. 192.168.254.100:/webroot /usr/share/nginx/html nfs defaults 0 0

这样所有的网站页面统一,实现负载分担。