目录
3.在VS主机和RS主机添加vip(临时添加,关机重启后需要重新添加)
<1>.在RS1和RS2中安装mod_ssl并重启apache
<2>.在vs调度器中设定端口标签,人为80和443是一个整体
一.LVS简介
LVS(Linux Virtual Server)是Linux虚拟服务器的简称,是一种基于Linux内核的开源负载均衡技术。
<1>.工作原理
LVS(Linux Virtual Server)的工作原理可以概括为通过负载均衡技术将客户端的请求分发到多个后端服务器上,以实现高可用性、高性能和可伸缩性。
<2>.相关术语
VS: Virtual Server ,负责调度
RS: RealServer ,负责真正提供服务
CIP: Client IP
VIP: Virtual serve IP VS外网的IP
DIP: Director IP VS内网的IP
RIP: Real server IP
访问流程: CIP <--> VIP == DIP <--> RIP
<3>.lvs集群的 常用转发类型
- LVS-NAT(Network Address Translation):修改请求报文的目标IP地址,实现多目标IP的DNAT(Destination Network Address Translation)。
- LVS-DR(Direct Routing):通过为请求报文重新封装一个MAC首部进行转发,源IP/PORT以及目标IP/PORT均保持不变,是LVS的默认模式,应用最广泛。
- LVS-TUN(Tunneling):在原请求IP报文之外新加一个IP首部,实现两级IP的隧道逻辑转发。
- LVS-FULLNAT:通过同时修改请求报文的源IP地址和目标IP地址进行转发,类似于LVS-NAT的增强版。
1. LVS-NAT
LVS-NAT是LVS集群中一种基于网络地址转换技术的负载均衡模式。它通过修改请求报文的目标IP地址和端口,将请求转发到后端真实服务器,并将响应报文中的源IP地址修改为虚拟服务器的IP地址,实现客户端和真实服务器之间的无缝通信。然而,由于所有请求和响应都必须经过LVS调度器,可能导致调度器成为系统瓶颈。
2. LVS-DR
LVS-DR模式是一种高效的负载均衡方式,它允许客户端直接与后端真实服务器通信,而不需要经过LVS调度器转发响应数据。在这种模式下,LVS调度器只负责接收客户端的请求,并根据负载均衡算法选择一个合适的真实服务器,然后将请求转发给该服务器。真实服务器处理请求后,直接将响应返回给客户端,而不需要经过LVS调度器。
3. LVS-TUN
LVS-TUN模式通过在网络层之上增加一个IP隧道,将客户端的请求封装在一个新的IP包中,然后转发给后端真实服务器。真实服务器处理完请求后,直接将响应返回给客户端,而不经过LVS调度器。这种方式使得LVS调度器成为无状态的,只需要处理请求的分发,而不必关心响应的返回,从而提高了系统的可扩展性和性能。
4. LVS-FULLNAT
LVS-FULLNAT模式与NAT模式类似,但它在处理请求和响应报文时都进行了源地址和目标地址的转换。在NAT模式下,只有请求报文的目标地址被转换为RS的地址,而响应报文则直接返回给客户端,无需再次转换。但在FULLNAT模式下,请求报文的源地址和目标地址都会被转换,响应报文在返回给客户端之前,其源地址和目标地址也会进行相应的转换。
二.部署NAT模式集群实验
<1>.实验环境
一台客户机、一台调度器、两台真实服务器
VMVare网络设置NAT模式子网IP为172.25.254.0,仅主机模式子网IP为192.168.0.0
1.调度器
VMVare设置eth0网卡为NAT模式,eth1为仅主机模式
XML
[root@LVS ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@LVS ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-namw=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
2.真实服务器
VMVare设置eth0网卡为仅主机模式
XML
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
XML
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
3.客户端
VMVare设置eth0网卡为NAT模式
XML
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=172.25.254.200/24,172.25.254.2
method=manual
dns=114.114.114.114;
<2>.实验配置
1.VS中启用内核路由器功能
XML
[root@LVS boot]# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
XML
[root@LVS boot]# sysctl -p
net.ipv4.ip_forward = 1
2.RS装上http服务
XML
[root@webserver1 ~]# yum install httpd -y
3.VS安装ipvsadm软件
XML
[root@LVS boot]# dnf install ipvsadm -y
4.在RS上输入测试内容
XML
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd
XML
[root@webserver2 ~]# echo webserver2 - 192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
5.在VS进行测试
XML
[root@LVS boot]# curl 192.168.0.10
webserver1 - 192.168.0.10
[root@LVS boot]# curl 192.168.0.20
webserver2 - 192.168.0.20
6.在VS中添加调度策略
XML
[root@LVS boot]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@LVS boot]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@LVS boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@LVS boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@LVS boot]# 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.254.100:80 rr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0
<3>.客户端测试
XML
[root@client ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
三.部署DR模式集群实验
<1>.实验环境
一台客户端、一台路由器、一台调度器、两台真实服务器
VMVare网络设置NAT模式子网IP为172.25.254.0,仅主机模式子网IP为192.168.0.0
1.路由器
VMVare设置eth0网卡为NAT模式,eth1为仅主机模式
XML
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-namw=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
2.调度器
VMVare设置eth1网卡为仅主机模式
XML
[root@LVS ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-namw=eth1
[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
3.真实服务器
VMVare设置eth0网卡为仅主机模式
XML
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
XML
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
4.客户端
VMVare设置eth0网卡为仅主机模式
XML
[root@client ~]# curl 192.168.0.200
webserver2 - 192.168.0.20
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-namw=eth0
[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
<2>.实验配置
1.路由器中启用内核路由器功能
XML
[root@router ~]# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
XML
[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
2.RS主机中使vip不对外响应
XML
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
XML
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
3.在VS主机和RS主机添加vip(临时添加,关机重启后需要重新添加)
XML
[root@LVS ~]# ip a a 192.168.0.200/32 dev lo
XML
[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo
XML
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo
4.在VS中添加调度策略
XML
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@LVS ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@LVS ~]# 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.0.200:80 wrr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80
<3>.测试
根据DR模式的工作原理,用wearshark抓包能明显看到实验结果,便于理解
XML
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
三.防火墙标签解决轮询错误
以 http 和 https 为例,当我们在 RS 中同时开放 80 和 443 端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题 。 当第一次访问 80 被轮询到 RS1 后下次访问 443 仍然可能会被轮询到 RS1 上。
<1>.在RS1和RS2中安装mod_ssl并重启apache
XML
[root@webserver2 ~]# yum install mod_ssl -y
[root@webserver2 ~]# systemctl restart httpd
<2>.在vs调度器中设定端口标签,人为80和443是一个整体
XML
[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 813
[root@LVS ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK 6 -- 0.0.0.0/0 192.168.0.200 multiport dports 80,443 MARK set 0x32d
<3>.设定调度规则
XML
[root@LVS ~]# ipvsadm -A -f 813 -s rr
[root@LVS ~]# ipvsadm -a -f 813 -r 192.168.0.10 -g
[root@LVS ~]# ipvsadm -a -f 813 -r 192.168.0.20 -g
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 813 rr
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
<4>.测试
XML
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
四.lvs持久化链接
LVS(Linux Virtual Server)持久化连接是一种机制,用于确保来自同一客户端的请求被持续发送到同一台后端真实服务器(Real Server,简称RS),以保持会话的连续性和一致性。
<1>.设定调度规则
XML
[root@LVS ~]# ipvsadm -E -f 813 -s rr -p
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 813 rr persistent 360
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
<2>.测试
XML
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20