负载均衡集群lvs

lvs就是Linux虚拟服务器,lvs实现了基于ip的数据请求负载均衡调度方案,它实现了四层交换,客户端从外部访问公司的外部负载均衡服务器,客户端用户的Web请求会发送给lvs调度器,lvs根据自身的调度算法将客户端请求发送给后端主机集群中的某一台主机。lvs分为nat模式、dr模式、tun模式、fullnat模式。

名词解释

名称 缩写 释义
虚拟ip地址(Virtual ip Address) VIP VIP为director用于向客户端计算机提供服务的ip地址。
真实ip地址(Real server ipAddress) RIP 在集群下面节点上使用的ip地址,物理ip地址
director(调度器)的ip地址(director ip Address) DIP director用于连接内外网络的ip地址,物理网卡上的ip地址,是负载均衡器上的ip
客户端主机ip地址(Client ip Address) CIP 客户端用于计算机请求集群服务器的ip地址,该地址用于发送给集群的请求的源ip地址
1.nat模式
工作原理如下图所示

NAT(Network Address Translation)即网络地址转换:用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法 ip 地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。

当用户请求到达 lvs调度器 ,此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源 IP 为 CIP,目标IP为VIP 。
PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至INPUT 链。
IPVS 比对数据包请求的服务是否为集群服务,若是,修改数据包的目标 IP 地址为后端服务器 IP,然后将数据包发至 POSTROUTING 链。 此时报文的源 IP 为 CIP,目标 IP 为 RIP ,在这个过程完成了目标 IP 的转换。
POSTROUTING 链通过选路,将数据包发送给 Real Server。
Real Server 比对发现目标为自己的 IP,开始构建响应报文发回给 Director Server。 此时报文的源 IP 为 RIP,目标 IP 为 CIP 。
Director Server 在响应客户端前,此时会将源IP地址修改为自己的 VIP 地址,然后响应给客户端。 此时报文的源 IP 为 VIP,目标 IP 为 CIP。
优点
集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址,因此可以节省ip地址,能对内部进行伪装。
缺点
扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

2.dr模式
工作原理如下图所示
dr模式也叫直接路由模式:用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式工作在数据链路层上(二层)。

客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
优点
负载均衡器只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
DR模式的效率很高,但是配置稍微复杂一点,因此对于访问量不是特别大的公司可以用haproxy/nginx取代。日1000-2000W PV或者并发请求1万一下都可以考虑用haproxy/nginx。

缺点:
所有 RS 节点和调度器 LB 只能在一个局域网里面。

5.lvs调度算法
在内核中的连接调度算法上,IPVS已实现了以下八种调度算法:

轮询调度(Round-Robin Scheduling)
加权轮询调度(Weighted Round-Robin Scheduling)
最小连接调度(Least-Connection Scheduling)
加权最小连接调度(Weighted Least-Connection Scheduling)
基于局部性的最少链接(Locality-Based Least Connections Scheduling)
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
目标地址散列调度(Destination Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)
固定调度算法:
rr,wrr,dh,sh

动态调度算法:
wlc,lc,lblc,lblcr

应用场景 常用调度算法
http,mail,mysql 基本轮训、加权最小连接、加权轮训
防火墙集群 源地址散列调度SH和目标地址散列调度DH
web cache和DB cache 局部最小、带复制的局部最小
6.配置方法
需求:
分别配置nat模式和dr模式,要求实现http负载均衡集群,Real Server提供通一个私钥和同一个证书。

6.1nat模式

名称 IP
VIP 192.168.6.135
调度器
192.168.89.130
rs1 192.168.6.142
rs2 192.168.6.200
lvs关闭selinux,防火墙,lvs添加一块网卡,配置基础源
[root@localhost ~]# hostnamectl set-hostname lvs
[root@localhost ~]# bash
[root@lvs ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@lvs ~]# setenforce 0
[root@lvs ~]# vi /etc/selinux/config
SELINUX=disabled
[root@lvs network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN groupdefault qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:e2:21:19 brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.135/24 brd 192.168.6.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fee2:2119/64 scope link
       valid_lft forever preferred_lft forever
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:e2:21:23 brd ff:ff:ff:ff:ff:ff
    inet 192.168.89.130/24 brd 192.168.89.255 scope global dynamic noprefixroute ens192
       valid_lft 1786sec preferred_lft 1786sec
    inet6 fe80::dc32:9475:18cb:7cb3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@lvs network-scripts]# cp ifcfg-ens160 ifcfg-ens192    # 复制一个叫192
[root@lvs network-scripts]# ls
ifcfg-ens160 ifcfg-ens192
[root@lvs network-scripts]# vi ifcfg-ens192       # 对其修改

TYPE=Ethernet
BOOTPROTO=static
NAME=ens192
DEVICE=ens192
ONBOOT=yes
IPADDR=192.168.89.130              # 网关和DNS取消修改ip
NETMASK=255.255.255.0
[root@lvs ~]# cd /etc/yum.repos.d/
[root@lvs yum.repos.d]# ls
CentOS-Stream-AppStream.repo  CentOS-Stream-HighAvailability.repo
CentOS-Stream-BaseOS.repo     CentOS-Stream-Media.repo
CentOS-Stream-Debuginfo.repo  CentOS-Stream-PowerTools.repo
CentOS-Stream-Extras.repo     CentOS-Stream-RealTime.repo
[root@lvs yum.repos.d]# rm -rf *
[root@lvs yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--100  2495  100  2495    0     0  11340      0 --:--:-- --:--:-- --:--:-- 11392
[root@lvs yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@lvs yum.repos.d]# ls
CentOS-Base.repo
[root@lvs yum.repos.d]# dnf clean all
21 文件已删除
[root@lvs yum.repos.d]# dnf makecache
CentOS-8.5.2111 - Base - mirrors.aliyun.c 4.2 MB/s | 4.6 MB     00:01
CentOS-8.5.2111 - Extras - mirrors.aliyun  62 kB/s |  10 kB     00:00
CentOS-8.5.2111 - AppStream - mirrors.ali 4.3 MB/s | 8.4 MB     00:01
元数据缓存已建立。
# rs1关闭防火墙,关闭selinux
[root@localhost ~]# hostnamectl set-hostname rs1
[root@localhost ~]# bash
[root@rs1 ~]# systemctl disable --now firewalld
[root@rs1 ~]# setenforce 0
[root@rs1 ~]# vi /etc/selinux/config
SELinux=disabled
[root@rs1 ~]# cd /etc/yum.repos.d/
[root@rs1 yum.repos.d]# ls
CentOS-Base.repo   epel.repo                  epel-testing.repo
epel-modular.repo  epel-testing-modular.repo
# rs1关闭防火墙,关闭selinux
[root@localhost ~]# hostnamectl set-hostname rs1
[root@localhost ~]# bash
[root@rs2 ~]# systemctl disable --now firewalld
[root@rs2~]# setenforce 0
[root@rs2 ~]# vi /etc/selinux/config
SELinux=disabled
[root@rs2~]# cd /etc/yum.repos.d/
[root@rs2 yum.repos.d]# ls
CentOS-Base.repo   epel.repo                  epel-testing.repo
epel-modular.repo  epel-testing-modular.repo
#配置RS网卡
[root@rs1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens160

TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.6.142
NETMASK=255.255.255.0
GATEWAY=192.168.6.135    #网关指向DIP
DNS1=114.114.114.114

[root@rs2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.6.200
NETMASK=255.255.255.0
GATEWAY=192.168.6.135
DNS1=114.114.114.114
# 配置rs1 rs2的apache页面
[root@rs1 ~]# dnf -y install httpd
#配置页面
[root@rs1 ~]# cd /var/www/html/
[root@rs1 html]# ls
[root@rs1 html]# echo 'xixi rs1' > index.html
#修改配置文件
[root@rs1 html]# vi /etc/httpd/conf/httpd.conf
ServerName www.example.com:80   # 取消注释
[root@rs1 html]# systemctl enable --now httpd  #重启服务
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service→ /usr/lib/systemd/system/httpd.service.
#下载网页服务
[root@rs2 ~]# dnf -y install httpd
#修改网页内容
[root@rs2 ~]# cd /var/www/html/
[root@rs2 html]# ls
[root@rs2 html]# echo 'xixi rs2' > index.html
[root@rs2 html]# ls
index.html
#修改配置文件
[root@rs2 html]# vi /etc/httpd/conf/httpd.conf
ServerName www.example.com:80
# 重启服务
[root@rs2 html]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service→ /usr/lib/systemd/system/httpd.service.
#开启DR转发功能
[root@lvs ~]# vi /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward = 1   # 添加规则,开启转发功能

[root@lvs ~]# sysctl -p   #让转发功能生效
net.ipv4.ip_forward = 1
#在DR上添加并保存规则
[root@lvs ~]# ipvsadm -A -t 192.168.89.130:80 -s rr
-bash: ipvsadm: 未找到命令
[root@lvs ~]# yum list all|grep ipvsadm
ipvsadm.x86_64                                         1.31-1.el8                                    AppStream
[root@lvs ~]# dnf -y install ipvsadm
[root@lvs ~]# ipvsadm -a -t 192.168.89.130:80 -r 192.168.6.142:80 -m
[root@lvs ~]# ipvsadm -a -t 192.168.89.130:80 -r 192.168.6.200:80 -m
[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.89.130:80 rr
  -> 192.168.6.142:80             Masq    1      0          0
  -> 192.168.6.200:80             Masq    1      0          0
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm  #生成这个文件把内容覆盖进去
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.89.130:80 -s rr
-a -t 192.168.89.130:80 -r 192.168.6.142:80 -m -w 1
-a -t 192.168.89.130:80 -r 192.168.6.200:80 -m -w 1
#重启3个网卡
[root@lvs network-scripts]# ifdown ens192;ifup ens192
[root@rs1 network-scripts]# ifdown ens160;ifup ens160
[root@rs2 network-scripts]# ifdown eth0;ifup eth0
[root@lvs network-scripts]#  curl http://192.168.89.130
xixi rs1
[root@lvs network-scripts]#  curl http://192.168.89.130
xixi rs2

 

 

#在调度器上配置VIP和DIP
[root@lvs network-scripts]# ls
ifcfg-ens160  ifcfg-ens192
[root@lvs network-scripts]# vi ifcfg-ens160

TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR0=192.168.6.135
NETMASK=255.255.255.0
GATEWAY=192.168.6.2
DNS1=114.114.114.114
IPADDR1=192.168.6.180
NETMASK=255.255.255.0
[root@localhost ~]# ifdown ens160;ifup ens160
#在R1和R2上配置RIP
[root@rs1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens160

TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.6.142
NETMASK=255.255.255.0
GATEWAY=192.168.6.2    #改回来
DNS1=114.114.114.114 
[root@rs1 ~]# ifdown ens160;ifup ens160 [root@rs2 network
-scripts]# vi ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=192.168.6.200 NETMASK=255.255.255.0 GATEWAY=192.168.6.2 DNS1=114.114.114.114

[root@rs2 network-scripts]# ifdown eth0;ifup eth0

 

[root@rs1 ~]# vi /etc/sysctl.conf

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@rs1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@rs2 ~]# vi /etc/sysctl.conf

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@rs2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

 

#在RS1和RS2上配置VIP
[root@rs1 ~]# yum -y install net-tools
[root@rs1 ~]# ifconfig lo:0 192.168.6.180/32 broadcast 192.168.6.180 up
[root@rs1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN groupdefault qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.6.180/0 brd 192.168.6.180 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:14:c6:36 brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.142/24 brd 192.168.6.255 scope global noprefixroute ens160

[root@rs1 ~]# route add -host 192.168.6.180 dev lo
[root@rs1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.6.2     0.0.0.0         UG    100    0        0 ens160
192.168.6.0     0.0.0.0         255.255.255.0   U     100    0        0 ens160
192.168.6.180   0.0.0.0         255.255.255.255 UH    0      0      0 lo
[root@rs2 ~]# yum list all|grep ifconfig
[root@rs2 ~]# dnf -y install net-tools [root@rs2
~]# ifconfig lo:0 192.168.6.180/32 broadcast 192.168.6.180 up [root@rs2 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN groupdefault qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 192.168.6.180/0 brd 192.168.6.180 scope global lo:0 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:50:56:26:e5:2b brd ff:ff:ff:ff:ff:ff inet 192.168.6.200/24 brd 192.168.6.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever [root@rs2 ~]# route add -host 192.168.6.180 dev lo [root@rs2 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.6.2 0.0.0.0 UG 100 0 0 eth0 192.168.6.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 192.168.6.180 0.0.0.0 255.255.255.255 UH 0 0 0 lo
# 添加规则并且保存
[root@lvs ~]# yum -y install ipvsadm
root@lvs ~]# ipvsadm -A -t 192.168.6.180:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.6.180:80 -r 192.168.6.142:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.6.180:80 -r 192.168.6.200:80 -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
TCP  192.168.6.180:80 rr
  -> 192.168.6.142:80             Route   1      0          0
  -> 192.168.6.200:80             Route   1      0          0
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl enable ipvsadm
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
[root@lvs ~]# echo "ipvsadm -R < /etc/sysconfig/ipvsadm" >>/etc/rc.d/rc.local

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




 

posted @ 2022-08-15 08:28  孙一鸣  阅读(209)  评论(0)    收藏  举报