LVS负载均衡

  • LVS负载均衡已关闭评论
  • 32 次浏览
  • A+
所属分类:linux技术
摘要

LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立。


LVS负载均衡

一、LVS是什么

LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立。

LVS是一种集群(Cluster)技术,现在LVS已经是 Linux标准内核的一部分,采用IP负载均衡技术和基于内容请求分发技术。

lvs官网

二、LVS的作用

  • 高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。

  • 成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。

  • 配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。

  • 支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
    支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。

  • 应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等

三、lvs的三种工作模式

1.基于NAT的LVS模式负载均衡

LVS负载均衡

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时,调度器本身有可能成为系统的新瓶颈,因为请求和响应的报文都需要经过调度器。

2.基于TUN模式的LVS负载均衡

LVS负载均衡

  • LVS(NAT)模式的集群环境中,所有数据包的请求的回应的哦欧需要经过调度器处理,但是在TUN模式中,将NAT模式中的问题有所解决。因为数据包的请求包往往远远小于响应数据包的大小。因为响应数据包中有包含客户需要的具体数据所以,TUN的原理就是将请求与响应数据分离。,让调度器仅仅处理数据请求,让真实的服务器响应数据包直接返回给客户。

  • IP(隧道)是一种数据包分装技术,他可以经原始的数据包分装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的vip地址的数据包分装,通过隧道转发给真实的后端服务器,通过将客户端发往调度器的原始数据包分装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务的ip地址以及对应端口),lLVS(Tun)模式要求真实的服务器可以与外部网络连接,真实服务器在受到请求数据包后直接给客户端返回响应数据。

  • LVS(Tun)技术对服务器有要求,即所有服务器必须支持"IP Tunneling"或者IP Encapsulation”协议。目前,VS/TUN 的后端服务器主要运行 Linux 操作系统。

3.LVS(DR)负载模式

LVS负载均衡

  • 在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调度算法

静态调度算法(4种):

1、轮询调度rr  均等的对待每一台服务器,不管服务器上的实际连接数和系统负载  2、加权论调wrr  调度器可以自动问询真实服务器的负载情况,并动态调整权值  3、源地址散列调度算法 sh  与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。  4、目标地址散列调度算法 dh  该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。 

动态调度算法(6种)

1、最少链接 lc  动态地将网络请求调度到已建立的连接数最少的服务器上 如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡  2、加权最少链接 wlc  调度器可以自动问询真实服务器的负载情况,并动态调整权值带权重的谁不干活就给谁分配,机器配置好的权重高  3、基于局部性的最少连接调度算法 lblc 这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器  4、复杂的基于局部性最少的连接算法 lblcr  记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。  5、最少期望延迟 sed  不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙  6、永不排队 nq 无需队列,如果有realserver的连接数为0就直接分配过去 

六、搭建HTTP负载均衡集群

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

环境说明:

主机名 主机作用 IP/DIP VIP
DR LVS服务器(DR) 192.168.111.141 172.25.0.100
RS1 apache服务器1(RS) 192.168.111.142 网关为DR网关
RS2 apache服务器2(RS) 192.168.111.143 网关为DR网关
client 客户端(用于测试) 192.168.111.144 客户端不需要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               d169a480-a2e3-4fe5-89ba-f1f0e022a80f  ethernet  ens33   Wired connection 1  d0f7070b-e2d8-324b-b396-d3d13b0c3c4c  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.111.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.111.143/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 ~]# dnf -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.111.142:80 -m [root@DR ~]# ipvsadm -a -t 172.25.0.100:80 -r 192.168.111.143: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.111.141 lo:192.168.111.200
RS1 apache服务器1(RS) 192.168.111.142 lo:192.168.111.200
RS2 apache服务器2(RS) 192.168.111.143 lo:192.168.111.200
client 客户端 (用于测试) 192.168.111.144 客户端不需要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.111.200/32 broadcast 192.168.111.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.111.200/32 broadcast 192.168.111.200 netmask 255.255.255.255 up  #永久生效lo网卡配置 [root@RS2 ~]# 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@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 [root@RS2 ~]# echo "RS2" > /var/www/html/index.html [root@RS2 ~]# systemctl enable --now httpd 

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

[root@RS2 ~]# ipvsadm -A -t 192.168.111.200:80 -s rr [root@RS2 ~]# ipvsadm -a -t 192.168.111.200:80 -r 192.168.111.142:80 -g [root@RS2 ~]# ipvsadm -a -t 192.168.111.200:80 -r 192.168.111.143: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.111.200 RS1 [root@client ~]# curl 192.168.111.200 RS2 [root@client ~]# curl 192.168.111.200 RS1 [root@client ~]# curl 192.168.111.200 RS2 

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

环境说明:

主机名 主机作用 IP/DIP VIP
DR LVS服务器(DR) 192.168.111.141 lo:192.168.111.200
RS1 apache服务器1(RS) 192.168.111.142 lo:192.168.111.200
RS2 apache服务器2(RS) 192.168.111.143 lo:192.168.111.200
client 客户端 (用于测试) 192.168.111.144 客户端不需要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.111.200/32 broadcast 192.168.111.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 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.wxh.com Email Address []:111@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.wxh.com, emailAddress = 111@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.111.142 RS1  [root@RS1 ssl]# scp /etc/httpd/ssl/* root@192.168.111.143:/root/ root@192.168.111.143's password:  httpd.crt                               100% 1249     1.5MB/s   00:00     httpd.csr                               100% 1021     1.4MB/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.111.200/32 broadcast 192.168.111.200 netmask 255.255.255.255 up  #永久生效lo网卡配置 [root@RS2 ~]# 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@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.111.143 RS2 

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

[root@DR ~]# dnf -y install ipvsadm [root@DR ~]# ipvsadm -A -t 192.168.111.200:443 -s rr [root@DR ~]# ipvsadm -a -t 192.168.111.200:443 -r 192.168.111.142:443 -g [root@DR ~]# ipvsadm -a -t 192.168.111.200:443 -r 192.168.111.143: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.111.142:443          Route   1      0          0            -> 192.168.111.143: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.111.141 tunl0:192.168.111.200
RS1 apache服务器1(RS) 192.168.111.142 tunl0:192.168.111.200
RS2 apache服务器2(RS) 192.168.111.143 tunl0:192.168.111.200
client 客户端 (用于测试) 192.168.111.144 客户端不需要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.111.200 broadcast 192.168.111.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.111.200/32 brd 192.168.111.200 scope global tunl0      #永久生效 [root@DR ~]# echo "ifconfig tunl0 192.168.111.200 broadcast 192.168.111.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.111.200 broadcast 192.168.111.200 netmask 255.255.255.255  #永久生效 [root@RS1 ~]# echo "ifconfig tunl0 192.168.111.200 broadcast 192.168.111.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.111.200 broadcast 192.168.111.200 netmask 255.255.255.255  #永久生效 [root@RS1 ~]# echo "ifconfig tunl0 192.168.111.200 broadcast 192.168.111.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.111.200:80 -s rr [root@DR ~]# ipvsadm -a -t 192.168.111.200:80 -r 192.168.111.142:80 -i [root@DR ~]# ipvsadm -a -t 192.168.111.200:80 -r 192.168.111.143: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.111.200:80 rr   -> 192.168.111.142:80           Tunnel  1      0          0            -> 192.168.111.143: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.111.200 RS2 [root@client ~]# curl http://192.168.111.200 RS1 [root@client ~]# curl http://192.168.111.200 RS2 [root@client ~]# curl http://192.168.111.200 RS1