一、集群和分布式简介
1.1.系统性能扩展方式
- Scale UP:向上扩展,增强
- Scale Out:向外扩展,增加设备,调度分配问题,Cluster
1.2.集群Cluster
Cluster:集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统
Cluster常见的三种类型:
- LB:LoadBalancing(负载均衡)由多个主机组成,每个主机只承担一部分访问
- HA:High Availiablity(高可用)SPOF(single Point Of failure)
MTBF:Mean Time Between Failure 平均无故障时间,正常时间
MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间
A=MTBF/(MTBF+MTTR) (0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%
SLA:Service level agreement(服务等级协议)是在一定开销下为保障服务的性能和可用性,服 务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在 常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一 些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。
停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外 停机时间
- HPC:High-performance computing(高性能计算,国家战略资源,不在课程范围内)
1.3.分布式
分布式存储:Ceph,GlusterFs,FastDFS,MogileFs
分布式计算:hadoop,Spark
分布式常见应用
- 分布式应用-服务按照功能拆分,使用微服务
- 分布式静态资源--静态资源放在不同的存储集群上
- 分布式数据和存储--使用key-value缓存系统
- 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
1.4.集群和分布式
- 集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的
- 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务
- 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率,
- 对于大型网站,访问用户很多,实现一个集群,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决 定由给哪一台去完成响应,并且某一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
二、LVS集群的体系结构
2.1.LVS简介
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器,是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
2.2.LVS体系结构
使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用Load 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文件系统等。
2.3.LVS相关术语
LVS集群内部的节点称为真实服务器(Real Server),也叫集群节点。请求集群服务的计算机称为客户计算机。与计算机通常在网上交换数据包的方式相同,客户计算机、Director和真实服务器使用IP地址彼此进行通信。不同架构角色命名情况如下图:
2.4.LVS集群的类型
lvs-nat:修改报文的目标IP,多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
2.4.1.nat模式
lvs-nat:
- 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
- RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS系统
2.4.2.nat模式数据逻辑
- 客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)
- VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
- RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)
- VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
- VS服务器把修改过报文的响应数据包回传给客户端
- lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
在 LVS-NAT 模式中,客户端请求到达 VIP 后,首先进入内核的 PREROUTING 链。当未部署 IPVS 时,由于请求的目标 IP 是本机绑定的 VIP,数据包会在经过 PREROUTING 链后进入 INPUT 链,最终由本机的应用程序处理。
而当 IPVS 存在时,情况则有所不同。IPVS 的作用点处于 PREROUTING 链与 INPUT 链之间,它会在 PREROUTING 链处理完成后、数据包进入 INPUT 链之前对请求进行拦截。一旦 IPVS 检测到该请求匹配预设的虚拟服务规则,就会对数据包执行 NAT 转换:先通过 DNAT 将目标 IP 从 VIP 修改为后端真实服务器(RS)的 IP,之后在 POSTROUTING 链通过 SNAT 将源 IP 从客户端 IP 修改为负载均衡器(Director)的内网 IP,随后将数据包转发至选定的 RS,整个过程中数据包不会进入 INPUT 链。
需要特别注意的是,iptables 的规则设置可能会对 IPVS 的正常工作产生干扰。因为 IPVS 的拦截和处理动作发生在 PREROUTING 链之后,如果在 PREROUTING 链中设置了某些 iptables 规则,比如对目标地址进行了修改或对数据包进行了拦截,就可能导致 IPVS 无法正确识别和处理客户端请求。因此,在部署 LVS-NAT 模式时,通常建议清理 iptables 的防火墙策略,以避免规则冲突,确保 IPVS 能够顺利拦截并转发请求。
2.4.3.DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
2.4.4.DR模式数逻辑
在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和VS上都要有vip
2.4.5.DR模式数据传输过程
- 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
- VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC
- RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC
2.4.6.DR模式的特点
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定VIP和Director的MAC地址
- 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
- 在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
6.RS和Director要在同一个物理网络
7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
8.不支持端口映射(端口不能修改)
9.RS可使用大多数OS系统
2.4.7.TUN模式
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标 IP 是CIP)
2.4.8.TUN模式数据传输过程
1.客户端发送请求数据包,包内有源IP+vip+dport
2.到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
3.RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP)+port,响应数据包通过网络直接回传给client
2.4.9.TUN模式特点
1.DIP, VIP, RIP都应该是公网地址
2.RS的网关一般不能指向DIP
3.请求报文要经由Director,但响应不能经由Director
4.不支持端口映射
5.RS的OS须支持隧道功能
2.4.9.fullnet模式
fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director
4.支持端口映射
2.4.11.LVS工作模式总结
- lvs-nat与lvs-fullnat:请求和响应报文都经由Director
- lvs-nat:RIP的网关要指向DIP
- lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信 指向到路由
- lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
- lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
- lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
2.5.lvs的调度算法
2.5.1.lvs调度算法类型
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
2.5.2.lvs调度算法
静态调度算法:
1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态调度算法:
1. 基础调度算法
算法 |
名称 |
计算公式 |
适用场景 |
特点 |
---|---|---|---|---|
LC |
最少连接 |
|
长连接服务(如数据库、WebSocket) |
优先选择当前连接数最少的后端节点 |
WLC |
加权最少连接(默认) |
|
通用场景 |
在LC基础上引入权重,高权重节点承担更多连接 |
SED |
最短预期延迟 |
|
高权重节点优先 |
初始连接倾向高权重节点,但可能造成短期倾斜 |
NQ |
永不排队 |
首轮均匀分配,后续按SED |
低延迟敏感场景 |
避免首次连接因高权重节点过载而排队 |
LBLC |
基于局部的最少连接 |
动态DH算法 |
正向代理(如CDN) |
根据请求目标IP动态分配,提高缓存命中率 |
LBLCR |
带复制的LBLC |
LBLC + 复制机制 |
LBLC的负载不均场景 |
允许从高负载节点复制会话到低负载节点 |
2. 内核4.15+新增算法
算法 |
名称 |
触发条件 |
适用场景 |
特点 |
---|---|---|---|---|
FO |
加权公平过载 |
选择未标记 |
灰度发布、故障隔离 |
手动标记过载节点,自动跳过故障机 |
OVF |
溢出连接 |
选择 |
权重差异化环境 |
严格按权重上限分配 |
3. 高级算法补充
MH(Maglev Hashing)
原理:通过一致性哈希表实现最小扰动调度,节点变化时仅影响少量连接。
公式:基于哈希环和优先队列生成均匀分布的后端映射表。
场景:大规模分布式系统(如Kubernetes Service)。
优势:
连接分布均匀性 >99.8%
节点增删时仅需重计算局部哈希表
三.lvs部署命令介绍
3.1.lvs软件相关信息
- 程序包:ipvsadm
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
- ipvs调度规则文件:/etc/sysconfig/ipvsadm
3.2.ipvsadm命令
核心功能:
- 集群服务管理:增、删、改
- 集群服务的RS管理:增、删、改
- 查看
命令参数
管理集群服务
ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \
service-address(集群地址) \
[-s scheduler(调度算法)] \
[-p [timeout]] \
[-M netmask] \
[--pepersistence_engine] \
[-b sched-flags]
ipvsadm -D -t|u|f service-address 删除
ipvsadm –C 清空
ipvsadm –R 重载
ipvsadm -S [-n] 保存
管理集群中的real server
ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w
weight](权重)
ipvsadm -d -t|u|f service-address -r server-address 删除RS
ipvsadm -L|l [options] 查看rs
ipvsadm -Z [-t|u|f service-address] 清楚计数器
3.3.lvs集群中的增删改
1.管理集群服务中的增删改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f #firewall mask 火墙标记,是一个数字
#增加
[root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000
#修改
[root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000
#删除
[root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80
[root@DR-server ~]# ipvsadm -D -f 66
2.管理集群中RealServer的增删改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
#添加
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2
#更改
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1
#删除
[root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30
四.LVS实战案例
4.1 部署NAT模式集群案例
1.Director 服务器采用双网卡,一个是nat网卡连接外网,一个是仅主机网卡与后端Web服务器相连
2.Web服务器采用仅主机网卡与director相连
3.Web服务器网关指向192.168.16.190
4.后端web服务器不需要连接外网
4.1.1.实验环境
主机名 | IP | VIP | 角色 |
Clinet | 192.168.121.111 | null | 客户端 |
lvs-nat | 192.168.16.190 | 192.168.121.190 | 调度器 |
Nat_rs1 | 192.168.16.10 | null | 真实服务器(RS1) |
Nat_rs2 | 192.168.16.20 | 真实服务器(RS2) |
4.1.2.配置命令
LVS-nat配置:
1.在lvs-nat中启用内核路由功能
[root@lvs-nat ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@lvs-nat ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs-nat ~]# cat /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
2.在lvs-nat中安装ipvsadm
[root@lvs-nat ~]# yum install ipvsadm.x86_64 -y
3.在lvs-nat中添加调度策略
[root@lvs-nat ~]# ipvsadm -A -t 192.168.121.190:80 -s rr
[root@lvs-nat ~]# ipvsadm -a -t 192.168.121.190:80 -r 192.168.16.10:80 -m
[root@lvs-nat ~]# ipvsadm -a -t 192.168.121.190:80 -r 192.168.16.20:80 -m
[root@lvs-nat ~]# 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.121.190:80 rr
-> 192.168.16.10:80 Masq 1 0 0
-> 192.168.16.20:80 Masq 1 0 0
4.保存规则
[root@lvs-nat ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs-nat ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.121.190:80 -s rr
-a -t 192.168.121.190:80 -r 192.168.16.10:80 -m -w 1
-a -t 192.168.121.190:80 -r 192.168.16.20:80 -m -w 1
[root@lvs-nat ~]#
5.以上操作均为临时,可以开机启动ipvsadm.service,它会自动读取/etc/sysconfig/ipvsadm保存的配置
[root@lvs-nat ~]# systemctl enable --now ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
lvs负载调度器也需要关闭防火墙或者调整防火墙策略,关闭Selinux
所有RS:
1.下载nginx提供web服务:
yum install nginx -y
添加测试内容:
[root@Natrs1 ~]# echo `hostname`-`hostname -I` > /usr/share/nginx/html/index.html
[root@Natrs2 ~]# echo `hostname`-`hostname -I` > /usr/share/nginx/html/index.html
开启服务:
[root@Natrs1 ~]# systemctl start nginx
注意RS都得关闭防火墙和Selinux
2.修改网络配置,把网关改成DIP
[root@Natrs1 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
重载网络配置:
[root@Natrs1 ~]# nmcli connection reload
[root@Natrs1 ~]# nmcli connection up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@Natrs1 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
测试:
4.2 部署DR模式集群案例
4.2.1.实验环境
主机名 | IP | VIP | 角色 |
client | 192.168.121.111 vmware NAT | null | 测试主机 |
router | NAT-eth0:192.168.121.190,仅主机 eth1:192.168.16.190 | null |
路由器 |
lvs-dr | 192.168.16.5,GW 192.168.16.190 仅主机 | 192.168.16.200 | 调度器 |
rs1 | 192.168.16.10,GW 192.168.16.190 仅主机 | 192.168.16.200 | web服务器1 |
rs2 | 192.168.16.20,GW 192.168.16.190 仅主机 | 192.168.16.200 | web服务器2 |
4.2.2.详细配置
clinet:
网络配置:
#在客户端主机中为nat模式网卡
[root@clinet ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.121.111/24,192.168.121.190
dns=8.8.8.8
[root@clinet ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.121.190 0.0.0.0 UG 100 0 0 eth0
192.168.121.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
router:
网络配置:
#在路由主机中设定双网卡,eth0为nat网卡,eth1为仅主机网卡
#对于eth0的设定
[root@router system-connections]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.121.190/24
dns=8.8.8.8
#对于eth1的设定
[root@router system-connections]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
method=manual
address1=192.168.16.190/24
dns=8.8.8.8
开启内核路由功能:
[root@router system-connections]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
开启地址伪装:
firewall-cmd --add-masquerade
firewall-cmd --reload
在 LVS-DR(Linux Virtual Server - Direct Routing)模式的 router 中开启
firewall-cmd --add-masquerade
,主要原因是实现源地址转换。LVS-DR 模式下,负载均衡器只负责将请求转发到后端真实服务器,真实服务器响应的数据包直接返回给客户端 。但在一些场景中,后端服务器返回的数据包源 IP 可能无法被客户端正确识别(比如跨网段通信等情况) ,通过开启地址伪装(masquerade),可以将后端服务器返回数据包的源 IP 转换为 router 的公网 IP ,让客户端能正常接收响应,保障通信正常进行。
lvs-dr:
网络配置:
#对于dr调度器设定网卡为仅主机模式
[root@lvs-dr system-connections]# ll
total 8
-rw------- 1 root root 129 Jul 17 23:08 eth0.nmconnection
-rw------- 1 root root 122 Jul 17 23:10 lo.nmconnection
[root@lvs-dr system-connections]# cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.16.200/32 #设定VIP
[root@lvs-dr system-connections]# cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.16.5/24,192.168.16.190 #设定DIP和网关
dns=8.8.8.8
[root@lvs-dr system-connections]# route -n #查看路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.16.190 0.0.0.0 UG 100 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 30 0 0 lo
192.168.16.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
配置LVS策略:
[root@lvs-dr system-connections]# ipvsadm -A -t 192.168.16.200:80 -s rr
[root@lvs-dr system-connections]# ipvsadm -a -t 192.168.16.200:80 -r 192.168.16.10 -g
[root@lvs-dr system-connections]# ipvsadm -a -t 192.168.16.200:80 -r 192.168.16.20 -g
[root@lvs-dr system-connections]# 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.16.200:80 rr
-> 192.168.16.10:80 Route 1 0 0
-> 192.168.16.20:80 Route 1 0 0
[root@lvs-dr system-connections]# ipvsadm -Sn > /etc/sysconfig/ipvsadm #导入配置到文件中
RS1:
网络配置:
[root@RS1 system-connections]# ll
total 8
-rw------- 1 root root 130 Jul 15 14:35 eth0.nmconnection
-rw------- 1 root root 121 Jul 15 15:42 lo.nmconnection
[root@RS1 system-connections]# cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.16.200/32 #设置VIP
[root@RS1 system-connections]# cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.16.10/24,192.168.16.190 #设置DIP和网关
dns=8.8.8.8
[root@RS1 system-connections]# route -n 查看路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.16.190 0.0.0.0 UG 100 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 30 0 0 lo
192.168.16.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
RS2:
网络配置:
#对于RS2的设定网卡为仅主机模式
[root@RS2 ~]# cd /etc/NetworkManager/system-connections/
[root@RS2 system-connections]# ll
total 8
-rw------- 1 root root 130 Jul 15 10:14 eth0.nmconnection
-rw------- 1 root root 121 Jul 15 16:00 lo.nmconnection
[root@RS2 system-connections]# cat lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.16.200/32 #设定VIP
[root@RS2 system-connections]# cat eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.16.20/24,192.168.16.190 #设定DIP和网关
dns=8.8.8.8
[root@RS2 system-connections]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.16.190 0.0.0.0 UG 100 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 30 0 0 lo
192.168.16.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
因为lvs和rs都配置了VIP,当router发送arp请求VIP地址的的时候只需要lvs-dr的mac地址,所以RS都需要配置arp抑制:
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
参数解析:
1. arp_ignore=1
- 作用:只在请求的 IP 正好是当前网卡的主 IP 时,才回应 ARP 请求。
- 效果:避免用其他网卡的 IP 回应 ARP,减少网络混乱。
2. arp_announce=2
- 作用:只宣传当前网卡所在网段的 IP 地址。
- 效果:防止错误 IP 被广播,确保其他设备能正确找到你的主机。
测试效果:
4.3.防火墙标签解决轮询错误
4.3.1.轮询规则中可能会遇到的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
问题呈现
在RS1和RS2中安装mod_ssl并重启apache
]# yum install mod_ssl -y
]# systemctl restart httpd
在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
]# ipvsadm -C
[root@lvs-dr ~]# ipvsadm -A -t 192.168.16.200:80 -s rr
[root@lvs-dr ~]# ipvsadm -A -t 192.168.16.200:443 -s rr
[root@lvs-dr ~]# ipvsadm -a -t 192.168.16.200:80 -r 192.168.16.10:80 -g
[root@lvs-dr ~]# ipvsadm -a -t 192.168.16.200:80 -r 192.168.16.20:80 -g
[root@lvs-dr ~]# ipvsadm -a -t 192.168.16.200:80 -r 192.168.16.10:443 -g
Destination already exists
[root@lvs-dr ~]# ipvsadm -a -t 192.168.16.200:443 -r 192.168.16.10:443 -g
[root@lvs-dr ~]# ipvsadm -a -t 192.168.16.200:443 -r 192.168.16.20:443 -g
[root@lvs-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.16.200:80 rr
-> 192.168.16.10:80 Route 1 0 0
-> 192.168.16.20:80 Route 1 0 0
TCP 192.168.16.200:443 rr
-> 192.168.16.10:443 Route 1 0 0
-> 192.168.16.20:443 Route 1 0 0
[root@clinet ~]# curl 192.168.16.200;curl -k https://192.168.16.200
rs2 192.168.16.20
rs2 192.168.16.20
可以看到访问VIP两次流量都被调度到了rs2 192.168.16.20
5.3.2.防火墙标记解决轮询调度问题
FWM:FireWall Mark
MARK target 可用于给特定的报文打标记,
--set-mark value
其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务:可将多个不同的应用使用同一个集群服务进行调度
实现方法:
在Director主机打标记:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $portl,$port2,..-i MARK --set-mark NUMBER
在Director主机基于标记定义集群服务:
ipvsadm -A -f NUMBER [options]
示例如下:
[root@lvs-dr ~]# ipvsadm -C #清除之前的策略
在vs调度器中设定端口标签,认为80和443是一个整体
[root@lvs-dr ~]# iptables -t mangle -A PREROUTING -d 192.168.16.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
[root@lvs-dr ~]# ipvsadm -A -f 666 -s rr
[root@lvs-dr ~]# ipvsadm -a -f 666 -r 192.168.16.10 -g
[root@lvs-dr ~]# ipvsadm -a -f 666 -r 192.168.16.20 -g
测试结果
[root@clinet ~]# curl 192.168.16.200;curl -k https://192.168.16.200
rs2 192.168.16.20
rs1 192.168.16.10
4.4.lvs持久链接
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡
解决方案
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上
如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。
如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]]默认360秒
在lvs调度器中设定
[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]
[root@lvs ~]# ipvsadm -LnC