lvs负载均衡
Lvs
一.Lvs简介
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
官方站点是:http://www.linuxvirtualserver.org
二. 体系结构
使用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功能,而FreeBSD作为 Director Server的应用还不是很多,性能也不是很好。对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
三. Lvs管理工具
1. ipvs
ipvs:内核中的协议栈上实现
ipvs是LVS软件核心,是允许在LB(负载均衡层)上,这是个基于ip层的负载均衡
ipvs的总体结构主要有ip包处理,负载均衡算法,系统配置和管理三个模块以及虚拟服务器与真实服务器链表组成。
ipvs管理集群服务管理服务上的RS(real server)。
一个ipvs主机可以同时定义多个cluster server,但可能会影响调度性格。
一个ipvs服务至少应该有一个RS。
2. ipvsadm
ipvsadm:用户空间的命令行工具,用于管理集群服务器
参数 | 用法 |
---|---|
-A | 添加一个集群服务 |
-E | 修改已添加的集群服务 |
-D | 删除虚拟服务 |
-C | 清空整个表 |
-R | 从标准输入重载 |
-S | 保存值到标准输出 |
-a | 向指定的client server中添加real server |
-e | 修改RS |
-d | 删除真实服务 |
-L/-l | 列出表 |
-t | 服务器地址是host[:port],tcp协议 |
-u | 服务器地址是host[:port],udp协议 |
-r | 服务器地址主机和端口,只支持端口映射的LVS类型才允许此处使用和集群服务中的不同端口 |
-g | dr(direct routing)(default)模式 |
-i | tun模式 |
-m | nat模式 |
-w | 实际服务器容器,指定权重 |
-n | 数字格式显示ip和port,注意-n只能写在-L之后 |
Ipvsadm核心功能
集群服务管理:增、删、改
集群服务的RS管理:增、删、改
查看
语法:
ipvsadm -A -t ip:port -s rr
ipvsadm -a -t ip:port -r ip:port -g/m/i
Ipvsadm -Ln
保存:
建议保存在/etc/sysconfig/ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
ipvsadm -Sn > /etc/sysconfig/ipvsadm
重载
ipvsadm -R < /etc/sysconfig/ipvsadm
systemctl restart ipvsadm
四.lvs工作模式及原理
1.NAT模式
通过网络地址转换实现的虚拟服务器
大并发访问时,调度器的性能成为瓶颈
NAT模式原理:
这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
注意事项:
在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
特点:
- 1、NAT 技术将请求的报文和响应的报文都需要通过 LB 进行地址改写,因此网站访问量比较大的时候 LB 负载均衡调度器有比较大的瓶颈,一般要求最多只能 10-20 台节点
- 2、只需要在 LB 上配置一个公网 IP 地址就可以了。
- 3、每台内部的 realserver 服务器的网关地址必须是调度器 LB 的内网地址。
- 4、NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
NAT模式的优缺点:
- 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址
- 缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
2. DR模式
直接使用路由技术实现虚拟服务器
节点服务器需要配置VIP,注意MAC地址广播
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
特点
- 1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- 2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS
- 3.RS发现请求报文中的目的MAC是自己,就会将此报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意事项:
需要设置lo接口的VIP不能响应本地网络内的arp请求,这个IP就直接设置为32位的网络位即可。
3.TUN模式(隧道模式)
通过隧道方式实现虚拟服务
LVS/TUN的工作流程图如下所示,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器
-
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
-
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
-
- RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
优缺点:
- 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
- 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
五. LVS调度算法
-
静态调度算法(4种):
- 1.轮询调度rr
均等的对待每一台服务器,不管服务器上的实际连接数和系统负载 -
- 加权论调wrr
调度器可以自动问询真实服务器的负载情况,并动态调整权值
- 加权论调wrr
-
- 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
- 源地址散列调度算法 sh
-
- 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
- 目标地址散列调度算法 dh
- 1.轮询调度rr
-
动态调度算法(6种)
-
- 最少链接 lc动态地将网络请求调度到已建立的连接数最少的服务器上如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡
-
- 加权最少链接 wlc调度器可以自动问询真实服务器的负载情况,并动态调整权值带权重的谁不干活就给谁分配,机器配置好的权重高
-
- 基于局部性的最少连接调度算法 lblc这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
-
- 复杂的基于局部性最少的连接算法 lblcr记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
-
- 最少期望延迟 sed不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙
-
- 永不排队 nq无需队列,如果有realserver的连接数为0就直接分配过去
-
六、配置lvs-nat模式的httpd负载集群---http
环境说明:
主机名称 | 网卡信息(ens160为nat、ens192为仅主机) | 安装应用 | 系统 |
---|---|---|---|
Client客户端 | 192.168.29.138(ens33) | 无 | RHEL8 |
DR | DIP:192.168.29.137(ens33)---VIP:192.168.149.140(ens37) | ipvsadm | RHEL8 |
RS1 | RIP:192.168.29.142(ens33)---gw:192.168.29.150 | httpd | RHEL8 |
RS2 | RIP:192.168.29.143(ens33)---gw:192.168.29.150 | httpd | RHEL8 |
1.DR、RS1、RS2三台主机都关闭防火墙和selinux和配置ip信息
[root@DR ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendo>
Active: inactive (dead)
Docs: man:firewalld(1)
[root@DR ~]# getenforce
Disabled
[root@RS1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@RS1 ~]# systemctl restart NetworkManager
[root@RS1 ~]# nmcli connection up ens33
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@RS1 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendo>
Active: inactive (dead)
Docs: man:firewalld(1)
[root@RS1 ~]# getenforce
Disabled
[root@RS1 ~]#
[root@RS2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@RS2 ~]# systemctl restart NetworkManager
[root@RS2 ~]# nmcli connection up ens33
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@RS2 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendo>
Active: inactive (dead)
Docs: man:firewalld(1)
[root@RS2 ~]# getenforce
Disabled
[root@RS2 ~]#
2.后端RS1和RS2部署web服务器
[root@RS1 ~]# mount /dev/cdrom /mnt/
mount: /mnt: /dev/sr0 already mounted on /mnt.
[root@RS1 ~]# yum -y install httpd
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 3:07:50 ago on Wed Sep 28 02:21:27 2022.
Package httpd-2.4.37-30.module_el8.3.0+462+ba287492.0.1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@RS1 ~]# echo RS1 > /var/www/html/index.html
[root@RS1 ~]# cd /var/www/html/
[root@RS1 html]# ls
index.html
[root@RS1 html]# cat index.html
RS1
[root@RS1 html]# systemctl restart httpd
[root@RS1 html]# systemctl enable httpd
[root@RS1 html]#
[root@RS2 ~]# mount /dev/cdrom /mnt/
mount: /mnt: /dev/sr0 already mounted on /mnt.
[root@RS2 ~]# yum -y install httpd
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 1 day, 4:01:09 ago on Tue Sep 27 01:29:28 2022.
Package httpd-2.4.37-30.module_el8.3.0+462+ba287492.0.1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@RS2 ~]# echo RS2 > /var/www/html/index.html
[root@RS2 ~]# cd /var/www/html/
[root@RS2 html]# ls
index.html
[root@RS html]# cat index.html
RS2
[root@RS2 html]# systemctl restart httpd
[root@RS2 html]# systemctl enable httpd
[root@RS2 html]#
DR添加网卡
[root@DR network-scripts]# ls
ifcfg-ens33 ifcfg-ens37
[root@DR network-scripts]# nmcli connection modify ens37 ipv4.addresses 192.168.149.140/24 ipv4.method manual connection.autoconnect yes
[root@DR network-scripts]# nmcli connection up ens37
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
NAME UUID TYPE DEVICE
ens33 9bfb173e-cee4-46a2-ac04-38c42b5574b3 ethernet ens33
ens37 5bb03271-6d2b-4ee3-b656-e721045eca20 ethernet ens37
Wired connection 1 d823eadf-7078-3b8f-b0f2-31707d95f9dc ethernet --
3.配置DR
(1)开启IP转发功能
[root@DR ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@DR ~]#
(2)安装ipvsadm并添加规则
[root@DR ~]#yum -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 192.168.149.140:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.149.140:80 -r 192.168.29.137:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.149.140:80 -r 192.168.29.137: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 192.168.149.140:80 rr
-> 192.168.29.137:80 Masq 1 0 0
-> 192.168.29.137:80 Masq 1 0 0
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# systemctl restart ipvsadm
[root@DR ~]# systemctl enable ipvsadm
[root@client ~]# curl http://192.168.149.140
RS2
[root@client ~]# curl http://192.168.149.140
RS1
[root@client ~]# curl http://192.168.149.140
RS2
[root@client ~]# curl http://192.168.149.140
RS1
2.搭建lvs-dr模式的http负载均衡
主机名 | 主机作用 | ip/dip | vip |
---|---|---|---|
DR | lvs服务器 | 192.168.29.137 | lo:192.168.29.200 |
RS1 | Apache服务器1 | 192.168.29.142 | lo:192.168.29.200 |
RS2 | Apache服务器2 | 192.168.29.143 | lo:192.168.29.200 |
client | 客户端 | 192.168.29.138 | 客户端不需要vip |
关闭防火墙和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.29.200/32 broadcast 192.168.29.200 netmask 255.255.255.255 up
[root@DR ~]# ip a |grep lo1: 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.29.200/0 brd 192.168.29.200 scope global lo
#永久生效lo网卡配置
[root@DR ~]# echo "ifconfig lo 192.168.29.200/32 broadcast 192.168.29.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local
[root@DR ~]# chmod +x /etc/rc.d/rc.local
[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 = 1net.ipv4.conf.lo.arp_announce = 2net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.lo.arp_announce = 2net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2
#配置VIP
[root@RS1 ~]# dnf -y install net-tools
[root@RS1 ~]# ifconfig lo
192.168.29.200/32 broadcast 192.168.29.200 netmask 255.255.255.255 up
#永久生效lo网卡配置
[root@RS1 ~]# echo "ifconfig lo 192.168.29.200/32 broadcast 192.168.29.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.29.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配置
[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.29.200/32 broadcast 192.168.111.200 netmask 255.255.255.255 up
#永久生效lo网卡配置
[root@RS2 ~]# echo "ifconfig lo 192.168.29.200/32 broadcast 192.168.29.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.29.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
添加并保存规则
[root@RS2 ~]# ipvsadm -A -t 192.168.29.200:80 -s rr
[root@RS2 ~]# ipvsadm -a -t 192.168.29.200:80 -r 192.168.29.142:80 -g
[root@RS2 ~]# ipvsadm -a -t 192.168.29.200:80 -r 192.168.29.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.29.200:80 rr
-> 192.168.29.142:80 Route 1 0 0
-> 192.168.291.143:80 Route 1 0 0
[root@RS2 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@RS2 ~]# systemctl restart ipvsadm
[root@RS2 ~]# systemctl enable ipvsadm
客户端进行测试
[root@client ~]# curl 192.168.29.200
RS1
[root@client ~]# curl 192.168.29.200
RS2
[root@client ~]# curl 192.168.29.200
RS1
[root@client ~]# curl 192.168.29.200
RS2
3.搭建lvs-dr模式的http负载集群
主机名 | 主机作用 | ip/dip | vip |
---|---|---|---|
DR | lvs服务器 | 192.168.29.137 | lo:192.168.29.200 |
RS1 | Apache服务器1 | 192.168.29.142 | lo:192.168.29.200 |
RS2 | Apache服务器2 | 192.168.29.143 | lo:192.168.29.200 |
client | 客户端 | 192.168.29.138 | 客户端不需要vip |
关闭防火墙和selinux
[root@DR ~]# dnf -y install net-tools
[root@DR ~]# ifconfig lo 192.168.29.200/32 broadcast 192.168.29.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.29.200/0 brd 192.168.29.200 scope global lo
#永久生效lo网卡配置
[root@DR ~]# echo "ifconfig lo 192.168.29.200/32 broadcast 192.168.29.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local
[root@DR ~]# chmod +x /etc/rc.d/rc.local
[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.29.200/32 broadcast 192.168.29.200 netmask 255.255.255.255 up
#永久生效lo网卡配置
[root@RS1 ~]# echo "ifconfig lo 192.168.29.200/32 broadcast 192.168.29.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.29.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]:mr
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.123.com
Email Address []:3215547886@qq.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.mr.com, emailAddress = 3215547886@qq.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.29.142
RS1
[root@RS1 ssl]# scp /etc/httpd/ssl/* root@192.168.29.143:/root/
root@192.168.29.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
[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.29.200/32 broadcast 192.168.29.200 netmask 255.255.255.255 up
#永久生效lo网卡配置
[root@RS2 ~]# echo "ifconfig lo 192.168.29.200/32 broadcast 192.168.29.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.29.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.29.143
RS2
添加规则
[root@DR ~]# dnf -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 192.168.29.200:443 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.29.200:443 -r 192.168.29.142:443 -g
[root@DR ~]# ipvsadm -a -t 192.168.29.200:443 -r 192.168.29.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.29.200:443 rr
-> 192.168.29.142:443 Route 1 0 0
-> 192.168.29.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服务器 | 192.168.29.137 | tunl0:192.168.29.200 |
RS1 | Apache服务器1 | 192.168.29.142 | tunl0:192.168.29.200 |
RS2 | Apache服务器2 | 192.168.29.143 | tunl0:192.168.29.200 |
client | 客户端 | 192.168.29.138 | 客户端不需要vip |
关闭防火墙和selinux
DR配置
#修改内核参数,开启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.29.200 broadcast 192.168.29.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.29.200/32 brd 192.168.29.200 scope global tunl0
#永久生效
[root@DR ~]# echo "ifconfig tunl0 192.168.29.200 broadcast 192.168.29.200 netmask 255.255.255.255" >> /etc/rc.d/rc.local
[root@DR ~]# chmod +x /etc/rc.d/rc.local
RS1配置
#启用ipip模块,配置VIP
[root@RS1 ~]# dnf -y install net-tools
[root@RS1 ~]# modprobe ipip
[root@RS1 ~]# ifconfig tunl0 192.168.29.200 broadcast 192.168.29.200 netmask 255.255.255.255
#永久生效
[root@RS1 ~]# echo "ifconfig tunl0 192.168.29.200 broadcast 192.168.29.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配置
#启用ipip模块,配置VIP
[root@RS2 ~]# dnf -y install net-tools
[root@RS2 ~]# modprobe ipip
[root@RS2 ~]# ifconfig tunl0 192.168.29.200 broadcast 192.168.29.200 netmask 255.255.255.255
#永久生效
[root@RS2 ~]# echo "ifconfig tunl0 192.168.29.200 broadcast 192.168.29.200 netmask 255.255.255.255" >> /etc/rc.d/rc.local
[root@RS2 ~]# 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
添加规则
[root@DR ~]# dnf -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 192.168.29.200:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.29.200:80 -r 192.168.29.142:80 -i
[root@DR ~]# ipvsadm -a -t 192.168.29.200:80 -r 192.168.29.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.29.200:80 rr
-> 192.168.29.142:80 Tunnel 1 0 0
-> 192.168.29.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
客户端测试
[root@client ~]# curl http://192.168.29.200
RS2
[root@client ~]# curl http://192.168.29.200
RS1
[root@client ~]# curl http://192.168.29.200
RS2
[root@client ~]# curl http://192.168.29.200
RS1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通