目录
5.1、添加一个虚拟服务,使用轮询调度算法 (rr) 将请求分发到后端服务器
官网:LVS中文官网
一、概念
LVS(Linux Virtual Server) 是 Linux Virtual Server 的简写,意即Linux虚拟服务器,是一个基于Linux操作系统的虚拟服务器技术,用于实现负载均衡和高可用性。1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一
二、组成及软件工作层次图
LVS由2部分程序组成,包括ipvs和ipvsadm adm=admin
IPVS:LVS 是一个负载均衡框架,它定义了如何使用负载均衡器来分发网络请求的基本规则和架构。IPVS 是 LVS 中实现负载均衡的核心模块,它负责具体的负载均衡任务。 安装于 Director Server(相当于代理服务器) 上,并在 Director Server 上虚拟出一个 VIP(Virtual IP)。 用户的访问请求通过 VIP 到达负载调度器,然后由负载调度器从 Real Server 列表中选取一个服务节点响应用户的请求。
ipvsadm:是一个Linux内核中的IP负载均衡工具,它对应的用户控制程序也是ipvsadm。ipvsadm是IPVS(IP Virtual Server)的管理器,用于配置和管理Linux内核中的IPVS负载均衡器。
三、整体架构
LVS的整体架构主要包括负载均衡器(Load Balancer)、后端服务器(Real Server)和客户端三部分。客户端的请求首先到达负载均衡器,然后由负载均衡器根据一定的调度算法将请求转发到后端服务器进行处理,处理结果再返回给客户端
四、名词解释
VIP:虚拟IP地址(Virtual Ip Address)
RIP:真实IP地址(Real Server Ip Address)
DIP:Director的IP地址(Director Ip Address)用于连接内外网络的IP地址,物理网卡上的P地址。是负载均衡器上的IP。
CIP:客户端主机P地址(Client Ip Address)
五、三种工作模式
官网:三种工作模式
1、LVS-NAT
LVS-NAT(Network Address Translation):在该模式下,负载均衡器不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址,适用于小规模集群
详解:
客户端发起请求
1)客户端 发送一个请求到虚拟服务 IP (VIP) 地址,例如 192.168.1.10。
2)负载均衡器 收到这个请求后,将数据包的目标 IP 地址从 192.168.1.10 修改为其中一个真实服务器的 IP 地址,比如 192.168.1.21。同时,负载均衡器还会记录这次修改,以便后续处理响应时能够正确地将数据包发回给客户端。
3)真实服务器 收到请求后处理数据并生成响应。
服务器响应
1)真实服务器 将响应发回给负载均衡器,此时响应数据包的源 IP 地址是 192.168.1.21。
2)负载均衡器 收到响应后,将数据包的源 IP 地址从 192.168.1.21 修改为虚拟服务 IP 地址 192.168.1.10。
3)负载均衡器 最后将修改后的响应转发给原始的客户端。
总结
请求阶段:客户端 -> 负载均衡器 -> 真实服务器
请求时负载均衡器修改目标 IP 地址。
响应阶段:真实服务器 -> 负载均衡器 -> 客户端
响应时负载均衡器修改源 IP 地址
lvs可以处于公网 Real Server 可以是内网
2、LVS-TUN
LVS-TUN(IP Tunneling):又叫隧道模式。该模式通过IP隧道将请求转发到后端服务器,后端服务器直接将响应报文发回客户端,适用于地理位置分散的集群
请求过程和NAT一样,响应过程不再走LVS,直接给客户端。LVS的压力就降低。上行大,下行小,大大提高并发和吞吐量。但Real Server的IP需要暴露给公网,有安全隐患
3、LVS-DR
LVS-DR(Direct Routing):在该模式下,负载均衡器只修改请求报文的目标MAC地址,而不修改IP地址,后端服务器直接将响应报文发回客户端,适用于大规模集群。
和TUN相比,Real Server不会直接返回结果给客户端,而是通过Router中转后给客户端,这样Real Server的真实IP就不会暴露给公网 即支持高并发和解决了安全隐患问题。
下面就演示最好的DR模式
六、DR模式的实现
实现LVS对nginx的负载均衡,因为当时当时nginx对tomcat实现了负载均衡,为了体现LVS的负载均衡,就和nginx使用,这样,就是可以实现对tomcat1-6的轮询,如果直接演示对tomcat的负载均衡的话,可能效果看不出来,因为当时为了方便1-3部署在了tomcat1,4-6部署在了tomcat2,并且端口不一样,所以显示不出来效果
1、克隆出LVS,配置虚拟IP
关闭网络管理服务
systemctl stop NetworkManager
systemctl disable NetworkManager
配置虚拟IP(虚拟ip为:192.168.37.189)
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:1
vim /etc/sysconfig/network-scripts/ifcfg-ens33:1
#保留5行:
BOOTPROTO="static"
DEVICE="ens33:1"
ONBOOT="yes"
IPADDR=192.168.37.189
NETMASK=255.255.255.0
#重启网络服务
service network restart
ip a
让多出来的IP作为VIP
2、配置Nginx的虚拟IP
Nginx1的配置
cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:1
vim /etc/sysconfig/network-scripts/ifcfg-lo:1
#刷新lo网卡
ifup lo
#查看
ip a
Nginx2的配置
和上面一样
3、配置ARP行为
在Nginx1和Nginx2上同时进行
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
#让配置生效
sysctl -p
3.1、什么是 ARP?
ARP (Address Resolution Protocol) 是一种网络协议,用于将 IP 地址解析为物理地址(MAC 地址)。当你尝试与另一台设备通信时,如果只知道它的 IP 地址而不知道它的 MAC 地址,ARP 协议就会帮助你找到这个 MAC 地址
3.2、什么是 arp_ignore?
arp_ignore 是 Linux 内核中的一个配置参数,用于控制系统如何处理接收到的 ARP 请求。简单来说,它可以帮助系统决定是否应该忽略某些 ARP 请求,以提高安全性
arp_ignore 的类型:arp_ignore = 0:
这是默认设置,意味着系统会正常处理所有接收到的 ARP 请求。
arp_ignore = 1:
当系统收到一个 ARP 请求时,如果这个请求的目标 IP 地址是本机的一个 IP 地址,但这个请求不是通过与该 IP 地址关联的接口接收到的,那么这个请求将被忽略。
通俗说:请求的目标地址到达对应的网络接口,才会响应请求。
例如,如果你的电脑有两个网络接口 eth0 和 eth1,eth0 上有一个 IP 地址 192.168.1.10。如果一个 ARP 请求的目标 IP 地址是 192.168.1.10 但这个请求是通过 eth1 接收的,那么这个请求将会被忽略。
其他两个忽略
3.3、什么是 arp_announce?
arp_announce 是 Linux 内核中的一个配置参数,用于控制系统的 ARP 行为,特别是系统何时发送 ARP 应答。简而言之,它告诉系统在什么情况下应该发送 ARP 应答,以提高网络的安全性和稳定性。
arp_announce 的类型
arp_announce = 0:
这是默认设置,意味着系统会正常发送 ARP 应答。
arp_announce = 1:
当系统收到一个 ARP 请求时,如果这个请求的目标 IP 地址是本机的一个 IP 地址,只有当这个请求是通过与该 IP 地址关联的接口接收到的,才会发送 ARP 应答。
通俗说:避免本网卡与不匹配的目标进行通告
例如,如果你的电脑有两个网络接口 eth0 和 eth1,eth0 上有一个 IP 地址 192.168.1.10。如果一个 ARP 请求的目标 IP 地址是 192.168.1.10 且这个请求是通过 eth0 接收的,那么系统会发送 ARP 应答。但如果这个请求是通过 eth1 接收的,则不会发送 ARP 应答。
arp_announce = 2:
在 arp_announce = 1 的基础上进一步增强了安全性。
除了要求 ARP 请求必须通过正确的接口接收到以外,还要求请求中的源 MAC 地址必须与接收该请求的接口的 MAC 地址相匹配,才会发送 ARP 应答。
通俗说:只在本网卡通告
继续上面的例子,如果一个 ARP 请求的目标 IP 地址是 192.168.1.10 并且是通过 eth0 接收的,但是如果这个请求中的源 MAC 地址与 eth0 的 MAC 地址不匹配,那么系统也不会发送 ARP 应答
4、添加路由
route 命令用于查看和管理系统的路由表。route 命令非常强大,可以让你查看当前的路由表、添加新路由、删除现有路由等
现代 Linux 系统通常使用ip
命令来管理路由使用旧版route的话,需要先通过yun安装一个
yum install net-tools
Nginx1和Nginx2上都操作
查看路由表
route -n
结果详解:
Destination: 目标网络地址。这是路由的目的地。如果是:0.0.0.0: 这个 IP 地址通常表示“任何”或“所有”目的地。
Gateway: 网关地址。这是到达目的地的下一跳地址。如果目的地是在同一子网内,则网关为 0.0.0.0。
Genmask: 子网掩码。用于确定目标网络的范围。
Flags: 标志位。这些标志描述了路由的特性:
U: 可用(Up)
G: 网关(Gateway),表示需要通过网关到达目的地
H: 主机(Host),表示目的地是一个特定的主机
R: 重定向(Redirect),表示该路由是从另一个路由器重定向过来的
D: 动态(Dynamic),表示该路由是动态路由协议发现的
M: 修改(Modified),表示该路由已被修改
!: 不可达(Unreachable),表示该路由不可达
>: 默认路由(Default),表示该路由是默认路由
!G: 禁用网关(No Gateway),表示该路由不使用网关
!C: 禁用缓存(No Cache),表示该路由不使用高速缓存
!A: 禁用广告(No Advertise),表示该路由不会被通告给其他路由器
Metric: 路由度量值。用于决定哪条路由被优先使用。数值越小,优先级越高。
Ref: 引用计数。表示有多少进程引用该路由。
Use: 使用次数。表示该路由被使用的次数。
Iface: 接口名称。表示该路由对应的网络接口
添加路由
这条命令会添加一条路由规则,该规则指定所有发往 IP 地址 192.168.170.15 的数据包都应该通过本地环回接口 lo 的第二个别名 (lo:1) 发送
route add -host 192.168.37.189 dev lo:1
防止重启失效:
echo "route add -host 192.168.37.189 dev lo:1">>/etc/rc.local
查看/etc/rc.d/rc.local的权限,如果不是可执行文件,就无法启动执行。
#查看权限
ll /etc/rc.d/rc.local
#增加可执行权限
chmod +x /etc/rc.d/rc.local
rc.local 是 Linux 系统中一个传统的脚本文件,用于在系统启动完成时执行一些自定义任务。
删除操作:
route del -host 192.168.37.189 dev lo:1
5、搭建集群
在LVS-1上操作
#安装adm:
yum -y install ipvsadm
#查看帮助文档
ipvsadm -h
#查看集群信息
ipvsadm -Ln
-L 选项表示列出(List)当前配置的服务组和服务状态,
-n 选项则表示输出 IP 地址而不是主机名或域名
当前是空,需要搭建集群
5.1、添加一个虚拟服务,使用轮询调度算法 (rr) 将请求分发到后端服务器
ipvsadm -A -t 192.168.37.189:8088 -s rr
-A 添加服务器
-t tcp服务器
-s 调度算法(负载均衡算法)
Round Robin (rr):
简称 RR,是最简单的调度算法之一,按顺序将请求分发到后端服务器。
Weighted Round Robin (wrr):
简称 WRR,是 RR 的加权版本,根据后端服务器的权重来分配请求。
Least Connections (lc):
简称 LC,将请求分发给当前连接数最少的后端服务器。
Weighted Least Connections (wlc):
简称 WLC,是 LC 的加权版本,根据后端服务器的权重和当前连接数来分配请求。
Destination Hash (dh):
简称 DH,根据客户端 IP 地址的哈希值来分发请求,以实现会话粘性。
Source Hash (sh):
简称 SH,根据源 IP 地址的哈希值来分发请求,以实现会话粘性。
Weighted Destination Hash (wdh):
简称 WDH,是 DH 的加权版本,根据客户端 IP 地址的哈希值和后端服务器的权重来分发请求。
Weighted Source Hash (wsh):
简称 WSH,是 SH 的加权版本,根据源 IP 地址的哈希值和后端服务器的权重来分发请求。
也可以删除:
ipvsadm -D -t 192.168.37.189:8081
5.2、添加真实服务器
ipvsadm -a -t 192.168.37.189:8088 -r 192.168.37.183:8088 -g
ipvsadm -a -t 192.168.37.189:8088 -r 192.168.37.184:8088 -g
查看集群信息:
ipvsadm -Ln
查看发现,如果是处于同一个服务器上的,三个tomcat实例,比如8081,8082,8083,但是虚拟ip设置端口之后和真实服务ip进行映射,会覆盖掉8082,8083服务,,,,,所以负载均衡的时候,应保证服务在不同的服务器上
ipvsadm -Ln --stats
多次请求多次查看,会看到不同
会看到只有上行,没有下行,下行不过LVS服务器。也就是LVS-DR模式
通过虚拟ip访问:即可一致刷新页面,就会发现可以轮询访问tomcat
其它的细节就不演示,可以上网查查,比如超时时间什么的
七、Keepalived+lvs高可用
利用LVS-1克隆一个LVS-2,这个时候虚拟IP:189.168.37.189只有LVS-2有效,你的可能是LVS-1上有虚拟IP,因为同一个网段下,IP不能重复
LVS-1:
LVS-2:
LVS-2上操作
安装keepalived
yum -y install keepalived
现在虚拟IP在LVS-2上,所以咱用LVS-2做master
master配置
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_YSY
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.37.189
}
}
#配置集群IP和端口 和nginx保持一致
virtual_server 192.168.37.189 8088 {
#健康检查的时间 单位秒
delay_loop 6
#负载均衡算法rr是轮询
lb_algo rr
#LVS的模式
lb_kind DR
#会话持久化时间
persistence_timeout 50
#请求协议方式
protocol TCP
#真实服务器配置 和nginx对应
real_server 192.168.37.183 8088 {
#权重
weight 1
#健康检查
#检查端口
connect_port 8088
#超时时长5秒
connect_timeout 5
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
#真实服务器配置 和nginx对应
real_server 192.168.37.184 8088 {
#权重
weight 1
#健康检查
#检查端口
connect_port 8088
#超时时长5秒
connect_timeout 5
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
}
LVS-1上操作
也同样安装一个keepalived
backup配置
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_SY
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.37.189
}
}
virtual_server 192.168.37.189 8088 {
#健康检查的时间 单位 秒
delay_loop 6
#负载均衡算法rr是轮询
lb_algo rr
#LVS的模式
lb_kind DR
#会话持久化时间
persistence_timeout 5
#请求协议方式
protocol TCP
#真实服务器配置 和nginx对应
real_server 192.168.37.183 8088 {
#权重
weight 1
#健康检查
#检查端口
connect_port 8088
#超时时长5秒
connect_timeout 5
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
#真实服务器配置 和nginx对应
real_server 192.168.37.184 8088 {
#权重
weight 1
#健康检查
#检查端口
connect_port 8088
#超时时长5秒
connect_timeout 5
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
}
测试
一直刷新页面,会发现页面内容轮询,就没有问题
杀死LVS-1上的keepalived 看是否切换!测试和前面相同!
arp -a 192.168.170.15
查看mac地址,看真正在哪台机子上