Clannaddada

导航

Lvs负载均衡

Lvs负载均衡

lvs简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。

它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。

官方站点

lvs作用

LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。

它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。

它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。

另外可扩展性也非常好。

lvs体系结构

image

LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用Server Array表示,最底层的数据共享存储层,用Shared Storage表示

Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。

Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。

Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。

从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能

lvs的三种工作模式

基于NAT的LVS模式负载均衡

image

NAT(network address translation) 网络地址转换,其主要原理是修改数据报头,使得位于企业内部的私有ip地址可以访问外王,以及外部用户可以访问位于公司内部的私有的ip主机。

工作过程:

(1):用户通过互联网DNS服务器解析到公司负载均衡设备上的外网地址,相对于真实服务器而言,LVS外网ip又称为vip,用户通过访问vip,即可连接后端的真实服务器,而此时用户对这一切都是不可知的,用户认为自己还在访问真实的后端服务器,也不知道自己访问的vip只是一个调度器。

(2):用户将请求发送至调度器上,此时LVS根据算法选择一个后端的真实服务器,将数据请求包转发给真实服务器,并在转发之前LVS会修改数据包中的目标地址以及目标端口,此时修改为真实的服务器ip地址

(3):真实的服务器将响应的数据包返回给LVS调度器,调度器在响应数据包后会将源地址和源端口修改为vip及调度器相应端口,修改完成后,由调度器响应数据包发送给终端

  • LVS调度器中有一个连接Hash表,该表会记录连接请求及其转发信息,当同一个连接下一个数据包发送给调度器时,该Hash'表可以直接找到之前连接的记录,并根据记录信息选出相同真实服务器及其端口信息。
  • NAT的优点时服务器可以运行在任何支持TCP/IP的操作系统,他只需要在调度器上配置一个ip服务器组可以用私有的ip地址。
  • NAT的缺点时伸缩能力有限,当服务器节点数目上升到20时,调度器本身有可能成为系统的新瓶颈,因为请求和响应的报文都需要经过调度器。

基于TUN模式的负载均衡

image

  • LVS(NAT)模式的集群环境中,所有数据包的请求的回应的哦欧需要经过调度器处理,但是在TUN模式中,将NAT模式中的问题有所解决。因为数据包的请求包往往远远小于响应数据包的大小。因为响应数据包中有包含客户需要的具体数据所以,TUN的原理就是将请求与响应数据分离。,让调度器仅仅处理数据请求,让真实的服务器响应数据包直接返回给客户。
  • IP(隧道)是一种数据包分装技术,他可以经原始的数据包分装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的vip地址的数据包分装,通过隧道转发给真实的后端服务器,通过将客户端发往调度器的原始数据包分装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务的ip地址以及对应端口),lLVS(Tun)模式要求真实的服务器可以与外部网络连接,真实服务器在受到请求数据包后直接给客户端返回响应数据。
  • LVS(Tun)技术对服务器有要求,即所有服务器必须支持"IP Tunneling"或者IP Encapsulation”协议。目前,VS/TUN 的后端服务器主要运行 Linux 操作系统。

基于DR模式的LVS负载均衡

image

  • 在LVS(TUN)模式中,需要LVS调度器与真实的服务器之间创建隧道连接,这样就会增加服务器的负担。DR模式也叫路由模式,该模式中LVS依然仅承担数据的请求以及根据算法调度出合理的后端服务器,最终由后端真实服务器负责响应数据包发送返回给客户端。与隧道模式不同的是,DR模式要求调度器与后端服务器必须在统一个局域网内u,VIP地址需要在调度器与后端所有服务器之间共享,因为最终的真实服务器会给客户端回应数据包时需要设置源IP为VIP,目标IP为客户端IP,这样客户端访问的时调度器VIP地址,回应的源地址也是VIP,这样客户端是感觉不到后端服务器的存在。由于多台计算机都设置了同样的VIP地址,所以在直接路由模式中要求调度器的VIP是对外可见的,客户端将请求数据包发送到调度器主机,而所有的真实服务器的VIP必须配置在Non-ARP的网络上ARP是一个协议。调度器根据算法在选出真实的服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实的MAC地址,通过交换机将该数据帧发给真实的服务器。

LVS管理工具

ipvs:内核中的协议栈上实现

ipvs是LVS软件核心,是允许在LB(负载均衡层)上,这是个基于ip层的负载均衡

ipvs的总体结构主要有ip包处理,负载均衡算法,系统配置和管理三个模块以及虚拟服务器与真实服务器链表组成。

ipvs管理集群服务管理服务上的RS(real server)。

一个ipvs主机可以同时定义多个cluster server,但可能会影响调度性格。

一个ipvs服务至少应该有一个RS。

LVS的10种调度算法

静态调度算法(4种):

1、轮询调度rr

均等的对待每一台服务器,不管服务器上的实际连接数和系统负载

2、加权论调wrr

调度器可以自动问询真实服务器的负载情况,并动态调整权值

3、源地址散列调度算法 sh
 与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

4、目标地址散列调度算法 dh
 该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

动态调度算法(6种):

5、最少链接 lc
 动态地将网络请求调度到已建立的连接数最少的服务器上
 如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡

6、 加权最少链接 wlc
 调度器可以自动问询真实服务器的负载情况,并动态调整权值
 带权重的谁不干活就给谁分配,机器配置好的权重高

7、 基于局部性的最少连接调度算法 lblc
 这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

8、 复杂的基于局部性最少的连接算法 lblcr
 记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

9、 最少期望延迟 sed
 不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙

10、 永不排队 nq
 无需队列,如果有realserver的连接数为0就直接分配过去

实战:搭建HTTP负载均衡集群

1.搭建lvs-nat模式的httpd负载集群

环境说明

主机名 主机作用 IP/DIP VIP
DR LVS服务器(DR) 192.168.118.137 172.25.0.100
RS1 apache服务器1(RS) 192.168.118.142 网关为DR网关
RS2 apache服务器2(RS) 192.168.118.136 网关为DR网关
client 客户端(用于测试) 192.168.118.141 客户端不需要VIP

配置DR

#关闭防火墙和selinux
[root@DR ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@DR ~]# setenforce 0
[root@DR ~]# systemctl disable --now firewalld

#添加网卡
#我这里添加的是仅主机模式网卡,以便区分,网段为:172.25.0.0
[root@DR ~]# nmcli connection show
NAME                UUID                                  TYPE      DEVICE 
ens33               f3955696-59bd-4aa8-9bd2-9dfc4090f8be  ethernet  ens33  
Wired connection 1  8a8de3c1-4965-393b-866d-36e266cf598a  ethernet  ens37 
[root@DR ~]# nmcli connection modify Wired\ connection\ 1 con-name ens37 ipv4.addresses 172.25.0.100/24 ipv4.dns 114.114.114.114 ipv4.method manual autoconnect yes
[root@DR ~]# nmcli connection up ens37
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)

#开启转发功能
[root@DR ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1

RS1配置

#关闭防火墙和selinux
[root@RS1 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS1 ~]# setenforce 0
[root@RS1 ~]# systemctl disable --now firewalld

#配置ip
[root@RS1 ~]# nmcli connection modify ens33 ipv4.addresses 192.168.118.142/24 ipv4.gateway 172.25.0.100 ipv4.dns 114.114.114.114 ipv4.method manual autoconnect yes
[root@RS1 ~]# nmcli connection up ens33
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)

#配置好httpd,配置网站首页
[root@RS1 ~]# dnf -y install httpd
[root@RS1 ~]# echo "RS1" > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd

RS2配置

#关闭防火墙和selinux
[root@RS2 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS2 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld

#配置ip
[root@RS2 ~]# nmcli connection modify ens33 ipv4.addresses 192.168.118.136/24 ipv4.gateway 172.25.0.100 ipv4.dns 114.114.114.114 ipv4.method manual autoconnect yes
[root@RS2 ~]# nmcli connection up ens33
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)

#配置好httpd,配置网站首页
[root@RS2 ~]# dnf -y install httpd
[root@RS2 ~]# echo "RS2" > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd

配置好好两台web服务器后,最后再安装ipvsadm并添加规则

[root@DR ~]# yum -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 172.25.0.100:80 -s rr
[root@DR ~]# ipvsadm -a -t 172.25.0.100:80 -r 192.168.118.142:80 -m
[root@DR ~]# ipvsadm -a -t 172.25.0.100:80 -r 192.168.118.136:80 -m
[root@DR ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.0.100:80 rr
  -> 192.168.111.142:80           Masq    1      0          0         
  -> 192.168.111.143:80           Masq    1      0          0         
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# systemctl restart ipvsadm
[root@DR ~]# systemctl enable ipvsadm

客户端进行测试,因为选择的是轮询(rr)

[root@client ~]# curl http://172.25.0.100
RS2
[root@client ~]# curl http://172.25.0.100
RS1
[root@client ~]# curl http://172.25.0.100
RS2
[root@client ~]# curl http://172.25.0.100
RS1

2.搭建搭建lvs-dr模式的http负载集群

环境说明:

主机名 主机作用 IP/DIP VIP
DR LVS服务器(DR) 192.168.118.137 lo:192.168.118.200
RS1 apache服务器1(RS) 192.168.118.142 lo:192.168.118.200
RS2 apache服务器2(RS) 192.168.118.136 lo:192.168.118.200
client 客户端 (用于测试) 192.168.118.141 客户端不需要VIP

配置DR

#关闭防火墙和selinux
[root@DR ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@DR ~]# setenforce 0
[root@DR ~]# systemctl disable --now firewalld

#配置lo网卡ip
[root@DR ~]# dnf -y install net-tools
[root@DR ~]# ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up
[root@DR ~]# ip a |grep lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 192.168.118.200/0 brd 192.168.118.200 scope global lo

#永久生效lo网卡配置
[root@DR ~]# echo "ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local 
[root@DR ~]# chmod +x /etc/rc.d/rc.local

RS1配置

#关闭防火墙和selinux
[root@RS1 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS1 ~]# setenforce 0
[root@RS1 ~]# systemctl disable --now firewalld

#RS1上配置内核参数
[root@RS1 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

#配置VIP
[root@RS1 ~]# dnf -y install net-tools
[root@RS1 ~]# ifconfig lo 192.168.111.200/32 broadcast 192.168.111.200 netmask 255.255.255.255 up

#永久生效lo网卡配置
[root@RS1 ~]# echo "ifconfig lo 192.168.111.200/32 broadcast 192.168.111.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local
[root@RS1 ~]# chmod +x /etc/rc.d/rc.local

#添加路由
[root@RS1 ~]# route add -host 192.168.111.200/32 dev lo

#安装httpd服务,然后配置好网站首页
[root@RS1 ~]# dnf -y install httpd
[root@RS1 ~]# echo "RS1" > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd

RS2配置

#关闭防火墙和selinux
[root@RS2 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS2 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld

#RS2上配置内核参数
[root@RS2 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS2 ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

#配置VIP
[root@RS2 ~]# dnf -y install net-tools
[root@RS2 ~]# ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up

#永久生效lo网卡配置
[root@RS2 ~]# echo "ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local
[root@RS2 ~]# chmod +x /etc/rc.d/rc.local

#添加路由
[root@RS2 ~]# route add -host 192.168.118.200/32 dev lo

#安装httpd服务,然后配置好网站首页
[root@RS2 ~]# dnf -y install httpd
[root@RS2 ~]# echo "RS2" > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd

配置好好两台web服务器后,最后再安装ipvsadm并添加规则

[root@RS2 ~]# ipvsadm -A -t 192.168.118.200:80 -s rr
[root@RS2 ~]# ipvsadm -a -t 192.168.118.200:80 -r 192.168.118.142:80 -g
[root@RS2 ~]# ipvsadm -a -t 192.168.118.200:80 -r 192.168.118.136:80 -g
[root@RS2 ~]# 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.111.200:80 rr
  -> 192.168.111.142:80           Route   1      0          0         
  -> 192.168.111.143:80           Route   1      0          0         
[root@RS2 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@RS2 ~]# systemctl restart ipvsadm
[root@RS2 ~]# systemctl enable ipvsadm

客户端进行测试,因为选择的是轮询(rr)

[root@client ~]# curl 192.168.118.200
RS1
[root@client ~]# curl 192.168.118.200
RS2
[root@client ~]# curl 192.168.118.200
RS1
[root@client ~]# curl 192.168.118.200
RS2

3.搭建搭建lvs-dr模式的https负载集群

环境说明:

主机名 主机作用 IP/DIP VIP
DR LVS服务器(DR) 192.168.118.137 lo:192.168.118.200
RS1 apache服务器1(RS) 192.168.118.142 lo:192.168.118.200
RS2 apache服务器2(RS) 192.168.118.136 lo:192.168.118.200
client 客户端 (用于测试) 192.168.118.141 客户端不需要VIP

DR配置

#关闭防火墙和selinux
[root@DR ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@DR ~]# setenforce 0
[root@DR ~]# systemctl disable --now firewalld

#配置lo网卡ip
[root@DR ~]# dnf -y install net-tools
[root@DR ~]# ifconfig lo 192.168.111.200/32 broadcast 192.168.111.200 netmask 255.255.255.255 up
[root@DR ~]# ip a |grep lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 192.168.111.200/0 brd 192.168.111.200 scope global lo

#永久生效lo网卡配置
[root@DR ~]# echo "ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local 
[root@DR ~]# chmod +x /etc/rc.d/rc.local

RS1配置

#关闭防火墙和selinux
[root@RS1 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS1 ~]# setenforce 0
[root@RS1 ~]# systemctl disable --now firewalld

#RS1上配置内核参数
[root@RS1 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

#配置VIP
[root@RS1 ~]# dnf -y install net-tools
[root@RS1 ~]# ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up

#永久生效lo网卡配置
[root@RS1 ~]# echo "ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local
[root@RS1 ~]# chmod +x /etc/rc.d/rc.local

#添加路由
[root@RS1 ~]# route add -host 192.168.118.200/32 dev lo

#安装httpd服务,然后配置好网站首页
[root@RS1 ~]# dnf -y install httpd mod_ssl
[root@RS1 ~]# vim /etc/httpd/conf.modules.d/00-base.conf 
LoadModule ssl_module modules/mod_ssl.so
[root@RS1 ~]# mkdir /etc/httpd/ssl
[root@RS1 ~]# cd /etc/httpd/ssl
[root@RS1 ssl]# openssl genrsa -out httpd.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
................................................+++++
e is 65537 (0x010001)
[root@RS1 ssl]# openssl req -new -key httpd.key -out httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:hb
Locality Name (eg, city) [Default City]:wh
Organization Name (eg, company) [Default Company Ltd]:rt
Organizational Unit Name (eg, section) []:alg
Common Name (eg, your name or your server's hostname) []:www.dxy.com
Email Address []:118@11.com
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@RS1 ssl]# openssl x509 -req -days 365 -in httpd.csr -signkey httpd.key -out httpd.crt
Signature ok
subject=C = cn, ST = hb, L = wh, O = rt, OU = alg, CN = www.dxy.com, emailAddress = 118@11.com
Getting Private key
[root@RS1 ssl]# ls
httpd.crt  httpd.csr  httpd.key
[root@RS1 ssl]# vi /etc/httpd/conf.d/ssl.conf 
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
 
[root@RS1 ~]# echo "RS1" > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd

#检查https是否可用
[root@RS1 ssl]# curl -k https://192.168.118.142
RS1

[root@RS1 ssl]# scp /etc/httpd/ssl/* root@192.168.118.136:/root/
root@192.168.118.136's password: 
httpd.crt                               100% 1249     1.5MB/s   00:00    
httpd.csr                               100% 1021     1.7MB/s   00:00    
httpd.key                               100% 1679     2.0MB/s   00:00   

RS2配置

#关闭防火墙和selinux
[root@RS2 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS2 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld

#RS2上配置内核参数
[root@RS2 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS2 ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

#配置VIP
[root@RS2 ~]# dnf -y install net-tools
[root@RS2 ~]# ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up

#永久生效lo网卡配置
[root@RS2 ~]# echo "ifconfig lo 192.168.118.200/32 broadcast 192.168.118.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local
[root@RS2 ~]# chmod +x /etc/rc.d/rc.local

#添加路由
[root@RS2 ~]# route add -host 192.168.111.200/32 dev lo

#安装httpd服务,然后配置好网站首页
[root@RS2 ~]# dnf -y install httpd mod_ssl
[root@RS2 ~]# vim /etc/httpd/conf.modules.d/00-base.conf 
LoadModule ssl_module modules/mod_ssl.so
 
[root@RS2 ~]# mkdir /etc/httpd/ssl
[root@RS2 ~]# ls
anaconda-ks.cfg  httpd.crt  httpd.csr  httpd.key
[root@RS2 ~]# mv httpd.* /etc/httpd/ssl/
[root@RS2 ~]# ls /etc/httpd/ssl/
httpd.crt  httpd.csr  httpd.key
[root@RS2 ~]# vim /etc/httpd/conf.d/ssl.conf 
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
 
[root@RS2 ~]# echo "RS2" > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd
 
//检查https是否可用
[root@RS2 ~]# curl -k https://192.168.118.136
RS2

配置好好两台web服务器后,最后再安装ipvsadm并添加规则

[root@DR ~]# dnf -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 192.168.118.200:443 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.118.200:443 -r 192.168.118.142:443 -g
[root@DR ~]# ipvsadm -a -t 192.168.118.200:443 -r 192.168.118.136:443 -g
[root@DR ~]# 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.202.200:443 rr
  -> 192.168.118.142:443          Route   1      0          0         
  -> 192.168.118.136:443          Route   1      0          0     
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# systemctl restart ipvsadm.service 
[root@DR ~]# systemctl enable ipvsadm.service 

4.搭建搭建lvs-tun模式的http负载集群

环境说明:

主机名 主机作用 IP/DIP VIP
DR LVS服务器(DR) 192.168.118.137 tunl0:192.168.118.200
RS1 apache服务器1(RS) 192.168.118.142 tunl0:192.168.118.200
RS2 apache服务器2(RS) 192.168.118.136 tunl0:192.168.118.200
client 客户端 (用于测试) 192.168.118.141 客户端不需要VIP

DR配置

#关闭selinux和防火墙
[root@DR ~]# systemctl disable --now firewalld.service 
[root@DR ~]# setenforce 0
[root@DR ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
 
#修改内核参数,开启IP转发
[root@DR ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
 
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
 
#配置VIP
[root@DR ~]# dnf -y install net-tools
[root@DR ~]# ifconfig tunl0 192.168.118.200 broadcast 192.168.118.200 netmask 255.255.255.255
[root@DR ~]# ip a |grep tunl0
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 192.168.118.200/32 brd 192.168.118.200 scope global tunl0
    
#永久生效
[root@DR ~]# echo "ifconfig tunl0 192.168.118.200 broadcast 192.168.118.200 netmask 255.255.255.255" >> /etc/rc.d/rc.local 
[root@DR ~]# chmod +x /etc/rc.d/rc.local 

RS1配置

#关闭selinux和防火墙
[root@RS1 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS1 ~]# setenforce 0
[root@RS1 ~]# systemctl disable --now firewalld.service 
 
#启用ipip模块,配置VIP
[root@RS1 ~]# dnf -y install net-tools
[root@RS1 ~]# modprobe ipip 
[root@RS1 ~]# ifconfig tunl0 192.168.118.200 broadcast 192.168.118.200 netmask 255.255.255.255

#永久生效
[root@RS1 ~]# echo "ifconfig tunl0 192.168.118.200 broadcast 192.168.118.200 netmask 255.255.255.255" >> /etc/rc.d/rc.local 
[root@RS1 ~]# chmod +x /etc/rc.d/rc.local
 
#修改内核参数
[root@RS1 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
 
[root@RS1 ~]# sysctl -p
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
 
#安装httpd服务,然后配置好网站首页
[root@RS1 ~]# dnf -y install httpd
[root@RS1 ~]# echo "RS1" > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd

RS2配置

#关闭selinux和防火墙
[root@RS2 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS2 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld.service 
 
#启用ipip模块,配置VIP
[root@RS1 ~]# dnf -y install net-tools
[root@RS1 ~]# modprobe ipip 
[root@RS1 ~]# ifconfig tunl0 192.168.118.200 broadcast 192.168.118.200 netmask 255.255.255.255

#永久生效
[root@RS1 ~]# echo "ifconfig tunl0 192.168.118.200 broadcast 192.168.118.200 netmask 255.255.255.255" >> /etc/rc.d/rc.local 
[root@RS1 ~]# chmod +x /etc/rc.d/rc.local
 
#修改内核参数
[root@RS2 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
 
[root@RS2 ~]# sysctl -p
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
 
#安装httpd服务,然后配置好网站首页
[root@RS2 ~]# dnf -y install httpd
[root@RS2 ~]# echo "RS2" > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd.service 

配置好好两台web服务器后,最后再安装ipvsadm并添加规则

[root@DR ~]# dnf -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 192.168.118.200:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.118.200:80 -r 192.168.118.142:80 -i
[root@DR ~]# ipvsadm -a -t 192.168.118.200:80 -r 192.168.118.136:80 -i
[root@DR ~]# 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.118.200:80 rr
  -> 192.168.118.142:80           Tunnel  1      0          0         
  -> 192.168.118.136:80           Tunnel  1      0          0         
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# systemctl restart ipvsadm.service 
[root@DR ~]# systemctl enable ipvsadm.service 

客户端进行测试,因为选择的是轮询(rr)

[root@client ~]# curl http://192.168.118.200
RS2
[root@client ~]# curl http://192.168.118.200
RS1
[root@client ~]# curl http://192.168.118.200
RS2
[root@client ~]# curl http://192.168.118.200
RS1

posted on 2022-09-27 20:10  linux-ada  阅读(169)  评论(0编辑  收藏  举报