1. 集群和分布式
系统性能扩展方式:
- scale up:垂直扩展,向上扩展,增强,性能更强
- scale out:水平扩展,向外扩展,增加设备,并行的运行多个服务调度分配问题,cluster
1.1 集群cluster
cluster:集群,解决某个服务单点失败的问题,所以将多个计算机组合在一起形成单个系统
cluster分为三种类型:
1.LB:负载均衡,多个主机组成,每台主机只承担一部分问题
2.HA:高可用,避免单点失败
SLA:服务等级协议。是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。
1年 = 365天 = 8760小时
90 = (1-90%)*365=36.5天
99 = 8760 * 1% = 87.6小时
99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
99.9999= (1-99.9999%)*365*24*60*60=31秒
#停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间。而运维主要关注计划外停机时间
3.HPC:高性能www.top500.org
1.2 分布式系统
分布式存储: Ceph,GlusterFS,FastDFS,MogileFS
分布式计算:hadoop,Spark
分布式常见应用
分布式应用-服务按照功能拆分,使用微服务
分布式静态资源–静态资源放在不同的存储集群上
分布式数据和存储–使用key-value缓存系统6
分布式计算–对特殊业务使用分布式计算,比如Hadoop集群
1.3 集群和分布式
集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
2. Linux Virtual Server 简介
LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩(花名 正明), 阿里的四层SLB(ServerLoad Balance)是基于LVS+keepalived实现
LVS 官网: http://www.linuxvirtualserver.org/
阿里SLB和LVS:https://yq.aliyun.com/articles/1803 https://github.com/alibaba/LVS
2.1 LVS工作原理
LVS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”
2.2 LVS集群类型中的术语
**VS:**virtual server — 虚拟服务器(为什么叫虚拟服务器,因为当外界访问公司服务的时候,访问的调度器。但是调度器并不是真的服务器,只是个调度器,他收到用户请求之后,把这个请求调度到后端真实的服务器上)
**RS:**real server ----真正的服务器。后端服务器。(为后端真正提供服务的服务器)
CIP: client ip ----客户端的ip
**VIP:**virtual server ip—虚拟的ip vs外网的ip (对于lvs服务器来说,lvs有两个地址,一端冲外,一端冲内,冲外的连接外网(VIP),冲内的连接内网(DIP)
DIP: director server ip ----目标ip vs内网的ip
RIP: real server ip —后端服务器真正的IP
访问流程 : CIP<----->VIP == DIP<---->RIP
3. LVS的四种工作模式
- lvs-nat:通过修改请求报文的目标IP,实现多端口的DNAT
- lvs-dr: 操纵封装新的MAC地址
- lvs-tun:在原请求ip报文之外新加一个IP首部
- lvs-fullnat:修改请求报文的源和目标IP (需要进行二次开发)
3.1 LVS的NAT模型
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
就是将客户端发起的请求,通过防火墙的时候,通过规则把目标地址和端口转至后端真实的服务器上,然后后端真实的服务器进行回应的时候,再通过lvs的时候,再把真实的地址,转换成vip,这样用户就能就收真实的数据了 。
3.2 LVS的DR模式
DR模型----直接路由(默认的调度模型)
请求报文和响应报文不是同一条路,这样就减轻了lvs的负载
客户端发起请求到 lvs 服务器,lvs 收到请求之后,把请求调度到后端服务器。但是后端服务器发起会回应的时候,会先绑定上vip然后进行回复给客户端(因为客户端当时进行访问的时候,是访问的lvs的vip,所以你回应的时候也得需要是vip的身份,否则不会认识你是谁的。)那么有个问题就是因为真正的服务器上也绑定了vip,所以会发生地址冲突 。为了解决这个问题就是后端服务器修改内核参数,当发起免费arp请求的时候,他会阻断arp请求,让他不会通到我这里来。所以就避免了ip地址冲突。
免费arp,是当你的网卡启动的时候,会向网络中发起请求,问问谁在用这个地址。如果没有人回应,那就认为这个地址就是你自己拥有,如果有人回应你的请求,就发生了地址冲突。
arp是解决ip和mac地址的对应关系的。
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
lvs-dr模型优点就是客户请求报文和响应报文不是都经过lvs服务器的。缺点是在lvs服务器和后端服务器必须在一起,不能跨网络(因为跨网络后就lvs就不能进行通过arp广播获取后端服务器的mac地址,就不能进行mac替换)
DR模式的更改方法:
1.lvs和个RS都配置有VIP
2.确保前端路由器将目标 IP 为vip的请求报文发往 lvs(因为后端真实服务器中也有VIP,所以为了将目标发往lvs的vip,有如下几种操作方式)
-
在前端网关做静态绑定VIP和 lvs 的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
- RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由lvs
- RS和lvs要在同一个物理网络
- 请求报文要经由lvs,但响应报文不经由lvs,而由RS直接发往Client
- 不支持端口映射(端口不能修改)
- 无需开启 ip_forward
- RS可使用大多数OS系统
3.3 LVS的TUN模式
TUN模式转发方式:不修改请求报文的IP首部信息,(源ip为cip,目标ip为vip),而是在源 IP 报文之外再封装一个ip首部信息 加了个新的头部信息,(源ip为DIP和目标ip为RIP)。再将此报文发往挑选出来的RS真实服务器上去,后端服务器收到请求报文之后,把头部信息去掉,RS直接相应给客户端(源IP为VIP,目标为CIP)lvs服务器和后端真实服务器可以里的很远(甚至可以跨互联网)。
TUN模式特点:
1.RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,并且RIP可以和公网通信。也就是说集群节点可以跨互联网实现。DIP,VIP,RIP可以是公网地址。
2.真正的服务器的tun接口上需要配置vip地址,以便接受lvs转发过来的数据包,以及作为响应的报文源ip
3.lvs转发给RealServer时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而 RealServer响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP
4.请求报文要经由lvs,但响应不经由lvs,响应由RealServer自己完成
5.不支持端口映射
6.RS的OS须支持隧道功能
应用场景:
一般来说,TUN模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。
LAN环境一般多采用DR模式,WAN环境虽然可以用TUN模式,但是一般在WAN环境下,请求转发更多的被haproxy/nginx/DNS等实现。因此,TUN模式实际应用的很少,跨机房的应用一般专线光纤连接或DNS调度
3.4 LVS的FULLNAT模式
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
fullnat模式特点:
-
VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
-
RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
-
请求和响应报文都经由Director
-
相对NAT模式,可以更好的实现LVS-RealServer间跨VLAN通讯
-
支持端口映射
注意:此类型kernel默认不支持
3.5LVS工作模式总结和比较
lvs-nat与lvs-fullnat:
-
请求和响应报文都经由LVS
-
lvs-nat:RIP的网关要指向DIP
-
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
lvs-dr与lvs-tun:
- 请求报文要经由LVS,但响应报文由RS直接发往Client
- lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
- lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
4. LVS调度算法
就是lvs怎么知道要把客户端发来的请求,调度到哪台机器上。就是通过调度算法来实现的。
调度算法有两大类:1.静态算法 2.动态算法
4.1 静态算法–4
1.RR:roundrobin,轮询 (就是第一个请求来分配给第一个真实服务器,第二个来就分配给第二个,轮流分配)
2.WRR:weighted RR :加权轮询 (可以增加权限,按照一定的比例进行分配调度。自己设定每台设备的调度次数)
3.SH:source hashing :源地址hash运算,就是把源地址做hash计算,经过源地址hash之后做调度。(源地址经过hash运算之后,对现有存在的后端真实服务器的个数进行取模运算,通过取模的值然后进行选择调度。)
4.DH:destnation hashing:目标地址hash运算,(比如小区里面的人,现在出现了一个特别火的电视剧,小区的人都在看,但是如果所有人都去互联网上下载,会非常消耗广域网的带宽,所以运营商会把视频缓存到小区的服务器上去,但是用户不知道运营商缓存的视频到底在哪个服务器上,所以通过后端服务器地址的hash运算之后,互联网用户去访问的时候,会告诉你,去指定的服务器上去访问,以后用户再去访问的时候,会被一直调度到此服务器上。)—目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的
请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存
4.2 动态算法–6
主要根据每台后端真实的服务器当前的负载状态及调度算法进行调度 overhead=value 的值 较小的后端真实服务器将被调度
1.LC: least connections :最小连接,适用于长连接应用
Overhead=activeconns*256+inactiveconns #算法活动的连接数*256再加上非活动连接数(光tcp连接上,但是没有数据传输)值越大,负载越大。
2.WLC:weiguted LC,默认调度算法
Overhead=(activeconns*256+inactiveconns)/weight(权重) #权重越高,优先级越高,说明服务器性能越好 (有个缺点就是如果前面是0/权重,就无法分辨到底调度到哪台机器上)
3.short expection delay :最短期望延迟,(初始链接权重优先)
Overhead=(activeconns+1)*256/weight
4.NQ :never queue(不去排序),第一轮均匀分配去调度工作,后续使用sed算法。
5.LBLC:locality-Based LC:动态的DH算法(目标地址哈希运算,然后对后端服务器的负载情况进行判断)
6.LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,实现Web Cache等
4.3 内核版本 4.15 版本后新增调度算法:FO和OVF
centos8 新特性
FO:(wrighted fail over ) :调度算法,再FO算法中,遍历虚拟服务所关联的真实服务器列表,找到还未过载的服务器(也就是没有标记为过载的,未设置IP_VS_DEST_F_OVERLOAD标志的)且权重最高的真实服务器,进行调度。
OVF(overflow-connection)调度算法:基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
- 未过载(未设置IP_VS_DEST_F_OVERLOAD标志
- 真实服务器当前的活动连接数量小于其权重值
- 其权重值不为零
5.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
yum install -y ipvsadm
5.1 ipvadm命令
ipvsadm核心功能:
1.lvs集群服务管理:增,删,改
2.lvs集群服务的后端真实服务器管理:增,删,改
3.查看
ipvsadm工具用法:
1.#管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags] #-A 后面跟协议tcp或udp 再加上服务器vip地址,再加上调度算法 #-A :增加 -E:修改
ipvsadm -A #添加
ipvsadm -D -t|u|f service-address #删除
ipvsadm –C #清空
ipvsadm –R #重载,相当于ipvsadm-restore
ipvsadm -S [-n] #保存,相当于ipvsadm-save
2.#管理集群中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
# 协议 在此集群中 加入 后端真正服务器地址 指定(4种)工作模式 权重
#-g : dr类型 -i:tun类型 -m: nat类型
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
1.管理集群服务的增,删,改
增,改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A :增加
-E :修改
service-address :lvs服务器VIP地址
-s :调度,默认为wlc
-p :超时时间
说明:
service-address: 服务器vip(公网)地址
-t|u|f:
-t: TCP协议的端口,VIP:TCP_PORT 如: -t 10.0.0.100:80
-u: UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,标记,一个数字
[-s scheduler]:指定集群的调度算法,默认为wlc
#范例
ipvsadm -A -t 10.0.0.100:80 -s wrr
删除:
ipvsadm -D -t|u|f service-address
2.管理集群上的RS:增,删,改
增,改
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:增加真实服务器记录
-e:修改真实服务器记录
-r:真实服务器地址
#范例
ipvsadm -a -t 192.168.0.8 -r 10.0.0.7:8080 -m -w 3 #增加真实服务器进入集群192.168.0.8 真实服务器地址为10.0.0.7,nat模式,权重为3
删除:
ipvsadm -d -t|u|f service-address -r server-address
server-address:
rip[:port] 如省略port,不作端口映射
选项:
lvs类型:
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重
范例:
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:8080 -m -w 3
清空定义的所有内容
ipvsadm -C
清空计数器
ipvsadm -Z [-t|u|f service-address]
查看
ipvsadm -L|l [options]
--numeric, -n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出
--stats:统计信息
--rate :输出速率信息
**pvs规则:**在内存中
/proc/net/ip_vs
ipvs连接:
/proc/net/ip_vs_conn
保存:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service #会自动保存规则至/etc/sysconfig/ipvsadm
重载:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
systemctl start ipvsadm.service #会自动加载/etc/sysconfig/ipvsadm中规则
5.2 防火墙标签
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度
我现在的lvs有两个集群,一个是80端口的,一个是443端口的
iptables -t mangle -A PREROUTING -d 172.16.0.100 -p tcp -mmultiport --dports 80,443 -j MARK --set-mark 10
#只要是访问我的80,443端口,我就给你加一个标签 --set-mark 10,这样我们就把 --dports 80,443 就把对80或443端口的请求合成了一个分类, 现在客户端只要访问我的172.16.0.100 我就给你贴上10的标签,
实现方法:
在目标主机打标记:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
在目标主机基于标记定义集群服务:
ipvsadm -A -f NUMBER [options]
范例:
[root@lvs-server ~]# iptables -t mangle -A PREROUTING -d 172.16.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
[root@lvs-server ~]# ipvsadm -C
[root@lvs-server ~]# ipvsadm -A -f 10 -s rr
[root@lvs-server ~]# ipvsadm -a -f 10 -r 10.0.0.7 -g
[root@lvs-server ~]# ipvsadm -a -f 10 -r 10.0.0.17 -g
[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 rr
-> 10.0.0.7:0 Route 1 0 0
-> 10.0.0.17:0 Route 1 0 0
#查看内存中的状态
[root@lvs-server ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 0000000A rr
-> 0A000011:0000 Route 1 0 0
-> 0A000007:0000 Route 1 0 0
5.3LVS持久连接
为了解决网页登录信息(比如:我们登录京东网站,要通过京东网站的lvs调度器,调度我们的访问后端真实服务器上,当我们第一次登录成功的时候,真实服务器端会生成session信息,同时会给我的客户端发送cookie信息。告诉我们的登陆成功。但是当我们对页面刷新的时候,有一个问题,就是lvs调度器可能会把我们的请求调度到其他的后端服务器上,但是其他的服务器没有session信息,我们就得重新登录,所以为了解决这个问题,我们需要进行lvs的持久连接操作。持久连接)
6.实战案例
6.1 LVS-NAT模型案例
本质上就是多目标的DNAT
lvs配置两块网卡
1.环境
共四台主机
一台:internet client:192.168.0.6/24 GW:无 仅主机 hostname=client
一台:lvs hostname=lvs-server
eth1 仅主机 192.168.0.8/16
eth0 NAT 10.0.0.8/24
两台RS:
RS1: 10.0.0.7/24 GW:10.0.0.8 NAT hostname=rs1
RS2: 10.0.0.17/24 GW:10.0.0.8 NAT hostname=rs2
2.实验过程
#准备实验工具
#lvs服务器安装ipvsadm工具
[root@lvs-server ~]# yum install -y ipvsadm
#为了测试使用,rs1和rs2都安装http服务。
[root@rs1 ~]# yum install -y httpd
[root@rs2 ~]# yum install -y httpd
[root@rs1 ~]# hostname > /var/www/html/index.html
[root@rs1 ~]# curl 10.0.0.7
rs1
[root@rs2 ~]# hostname > /var/www/html/index.html
[root@rs2 ~]# curl 10.0.0.17
rs2
#在客户端配置每秒访问一此lvs调度器的vip,去或取网页
[root@client ~]# while true ;do curl http://192.168.0.8;sleep 1;done
2.lvs-server服务器配置
#开始配置lvs
#因为客户端的请求要穿过lvs服务器,所以要开启路由转发功能
[root@lvs-server ~]#vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@lvs-server ~]#sysctl -p
net.ipv4.ip_forward = 1
#查看规则
[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#创建lvs集群
[root@lvs-server ~]# ipvsadm -A -t 192.168.0.8:80 -s rr #-s 指定调度算法 rr--轮询
[root@lvs-server ~]# 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.8:80 rr
[root@lvs-server ~]# ipvsadm -a -t 192.168.0.8:80 -r 10.0.0.7 -m -w 3 #-w 指定权重,不过在此不起作用,因为添加的规则为轮询
[root@lvs-server ~]# ipvsadm -a -t 192.168.0.8:80 -r 10.0.0.17 -m -w 1
3.客户端client进行测试
#客户端访问lvs的vip,然后通过lvs调度获取后端服务器的页面(轮询的方式)
[root@client ~]# while true ;do curl http://192.168.0.8;sleep 1;done
rs1
rs2
rs1
rs2
rs1
rs2
rs1
rs2
^C
[root@client ~]#
[root@lvs-server ~]# ipvsadm -Lnc #-c连接信息 这个连接信息在内存中也能够看到 cat /proc/net/ip_vs
IPVS connection entries
pro expire state source virtual destination
TCP 01:50 TIME_WAIT 192.168.0.6:56866 192.168.0.8:80 10.0.0.7:80
TCP 01:51 TIME_WAIT 192.168.0.6:56868 192.168.0.8:80 10.0.0.17:80
TCP 01:48 TIME_WAIT 192.168.0.6:56862 192.168.0.8:80 10.0.0.7:80
TCP 01:49 TIME_WAIT 192.168.0.6:56864 192.168.0.8:80 10.0.0.17:80
TCP 01:59 TIME_WAIT 192.168.0.6:56882 192.168.0.8:80 10.0.0.7:80
TCP 01:58 TIME_WAIT 192.168.0.6:56880 192.168.0.8:80 10.0.0.17:80
TCP 01:52 TIME_WAIT 192.168.0.6:56870 192.168.0.8:80 10.0.0.7:80
TCP 01:47 TIME_WAIT 192.168.0.6:56860 192.168.0.8:80 10.0.0.17:80
TCP 01:54 TIME_WAIT 192.168.0.6:56874 192.168.0.8:80 10.0.0.7:80
TCP 01:56 TIME_WAIT 192.168.0.6:56876 192.168.0.8:80 10.0.0.17:80
TCP 01:57 TIME_WAIT 192.168.0.6:56878 192.168.0.8:80 10.0.0.7:80
TCP 01:46 TIME_WAIT 192.168.0.6:56858 192.168.0.8:80 10.0.0.7:80
TCP 01:53 TIME_WAIT 192.168.0.6:56872 192.168.0.8:80 10.0.0.17:80
[root@lvs-server ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP C0A80008:0050 rr
-> 0A000011:0050 Masq 1 0 51
-> 0A000007:0050 Masq 3 0 52
#修改lvs调度算法为wrr,增加权重轮询
[root@lvs-server ~]# ipvsadm -E -t 192.168.0.8:80 -s wrr
[root@lvs-server ~]# 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.8:80 wrr
-> 10.0.0.7:80 Masq 3 0 47
-> 10.0.0.17:80 Masq 1 0 34
#客户端进行测试,访问3次10.0.0.7,访问一次10.0.0.17
[root@client ~]# while true ;do curl http://192.168.0.8;sleep 1;done
rs1
rs2
rs1
rs1
rs1
rs2
rs1
rs1
rs1
rs2
rs1
rs1
rs1
rs2
^C
[root@client ~]#
#源地址hash
[root@lvs-server ~]# ipvsadm -E -t 192.168.0.8:80 -s sh
#测试,只要源地址不变,第一次访问到真实的机器,在一段时间之内,是不会发生变化的(有个超时时间的概念,如果超过超时时间,才会重新进行取模运算,进行其他服务器的调度)(因为一段时间内不会发生再次连接,就不会再次取模运算)
[root@client ~]# while true ;do curl http://192.168.0.8;sleep 1;done
rs1
rs1
rs1
rs1
rs1
rs1
rs1
rs1
rs1
rs1
rs1
rs1
rs1
#保存规则
[root@lvs-server ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm #ipvsadm规则保存到此目录下
[root@lvs-server ~]#systemctl enable --now ipvsadm.service
#如果你把ipvsadm服务器关闭之后,规则会被清空
[root@lvs-server ~]# systemctl stop ipvsadm
[root@lvs-server ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#当重新启动的时候,会自动加载/etc/sysconfig/ipvsadm 的内容,规则也会重新加载
[root@lvs-server ~]# systemctl start ipvsadm
[root@lvs-server ~]# 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.8:80 rr
-> 10.0.0.7:80 Masq 3 0 5
-> 10.0.0.17:80 Masq 1 0 57
#当我们把后端httpd服务器的端口改为8080后,怎么修改lvs-server的配置呢
[root@rs1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
#首先先删除10.0.0.7配置,然后再重新配置规则
[root@lvs-server ~]# ipvsadm -d -t 192.168.0.8:80 -r 10.0.0.7
#重新添加规则
[root@lvs-server ~]# ipvsadm -A -t 192.168.0.8:80 -r 10.0.0.7:8080
或者写入配置文件
[root@lvs-server ~]# vim /etc/sysconfig/ipvsadm
-A -t 192.168.0.8:80 -s rr
-a -t 192.168.0.8:80 -r 10.0.0.7:8080 -m -w 3 #修改端口号
-a -t 192.168.0.8:80 -r 10.0.0.17:80 -m -w 1
[root@lvs-server ~]# ipvsadm-restore < /etc/sysconfig/ipvsadm #重读配置文件
[root@lvs-server ~]# 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.8:80 rr
-> 10.0.0.7:8080 Masq 3 0 35
-> 10.0.0.17:80 Masq 1 0 77
6.2 LVS-DR模式—单网段案例
DR模型中 lvs-server 和后端真实主机上均需要配置VIP,因为要配置同样的 VIP 地址,要解决地址冲突的问题:有三种方式
(1)在前端网关做静态绑定
(2)在各RS真实服务器上使用arptables
(3)在各RS后端真实服务器中需改内核参数,来限制 arp 响应和通告的级别-------常用arp_ignore ,arp_announce
限制响应级别:arp_ignore
- 0:默认值,表示可以使用本地任意接口上配置的任意地址进行响应。
- 1:仅在请求的目标ip配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
- 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
- 1:尽量避免将接口信息向非直接连接网络进行通告
- 2:必须避免将接口信息向非本网络进行通告
配置要点:
1. lvs 服务器采用双IP桥接网络,一个是VIP,一个DIP
2. Web服务器采用和DIP相同的网段和 lvs 连接
3. 每个Web服务器配置VIP
4. 每个web服务器可以出外网
范例:dr模式单网段
lvs
lvs服务器事先知道后端真实服务器都是什么主机。但是没有对应的mac地址,要通过arp广播寻找得到。而后端真实服务器上有vip,如果要发起arp请求,那么就要禁用其中vip地址,否则会产生地址冲突。那怎么实现禁用vip呢,那么就是修改内核参数arp_ignore ,此内核参数和网卡有关和ip无关。所以说把vip和真实的ip不配在同一块网卡上,所以把vip配置在lo回环网卡上。
还有就是lvs上的网关其实不起实质性的作用,随便加一个网关也可以,加了网关只是让请求的信息,转发出来而已。
1.环境
环境:五台主机
一台:客户端 eth0:仅主机 192.168.0.6/24 GW:192.168.0.200
一台:ROUTER
eth0 :NAT 10.0.0.200/24
eth1: 仅主机 192.168.0.200/24
启用 IP_FORWARD
一台:LVS
eth0:NAT:DIP:10.0.0.8/24 GW:10.0.0.200
两台RS:
RS1:eth0:NAT:10.0.0.7/24 GW:10.0.0.200
RS2:eth0:NAT:10.0.0.17/24 GW:10.0.0.200
2.lvs的网络配置
#所有主机禁用iptables和SELinux
1.#internet主机环境
[root@client ~]# hostname
client
[root@client ~]# hostname -I
192.168.0.6
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.200 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@client ~]# ping 10.0.0.7
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=63 time=2.86 ms
64 bytes from 10.0.0.7: icmp_seq=2 ttl=63 time=1.07 ms
^C
--- 10.0.0.7 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.074/1.967/2.860/0.893 ms
######################################################################################################################################################################################################################################
2.#路由器的网络配置
#开启路由转发功能
[root@route ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@route ~]# hostname -I
10.0.0.200 192.168.0.200
[root@route ~]# cd /etc/sysconfig/network-scripts/
[root@route network-scripts]# cat ifcfg-eth0
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.200
PREFIX=24
DNS1=211.138.30.66
[root@route network-scripts]# cat ifcfg-eth1
NAME=eth1
UUID=0db13ffe-2b42-4164-97fc-475a874490cc
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.0.200
PREFIX=24
DNS1=211.138.30.66
######################################################################################################################################################################################################################################
3.#LVS-server的网络配置
[root@lvs-server ~]# hostname
lvs-server
[root@lvs-server ~]# hostname -I
10.0.0.8
[root@lvs-server ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
UUID=0db13ffe-2b42-4164-97fc-475a874490cc
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.200
DNS1=211.138.30.66
[root@lvs-server ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@lvs-server ~]# ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=3.64 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=0.864 ms
64 bytes from 192.168.0.6: icmp_seq=3 ttl=63 time=1.03 ms
^C
--- 192.168.0.6 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 70ms
rtt min/avg/max/mdev = 0.864/1.842/3.636/1.270 ms
######################################################################################################################################################################################################################################
4.#RS1的网络配置
[root@rs1 ~]# hostname
rs1
[root@rs1 ~]# hostname -I
10.0.0.7
[root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.200
DNS1=211.138.30.66
DNS2=223.6.6.6
[root@rs1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs1 ~]#yum -y install httpd
[root@rs1 ~]#systemctl enable --now httpd
[root@rs1 ~]#hostname -I > /var/www/html/index.html
[root@rs1 ~]# ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.57 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=0.836 ms
^C
--- 192.168.0.6 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.836/1.207/1.579/0.373 ms
######################################################################################################################################################################################################################################
5.#RS2网络配置
[root@rs2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.200
DNS1=211.138.30.66
DNS2=223.6.6.6
[root@rs2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs2 ~]#yum -y install httpd
[root@rs2 ~]#systemctl enable --now httpd
[root@rs2 ~]#hostname -I > /var/www/html/index.html
[root@rs2 ~]# curl 10.0.0.17
10.0.0.17
[root@rs2 ~]# ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.25 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=0.810 ms
^C
--- 192.168.0.6 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.810/1.030/1.250/0.220 ms
######################################################################################################################################################################################################################################
3.后端真实服务器ipvs配置
1.#rs1的ipvs配置
#为了解决vip地址冲突的问题,更改内核参数
[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 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# ifconfig lo:1 10.0.0.100/32
[root@rs1 ~]# ip a
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 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.100/0 scope global lo:1 #vip地址
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 pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:45:45:ef brd ff:ff:ff:ff:ff:ff
inet 10.0.0.7/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
2.#rs2的ipvs配置
#arp_ignore :忽略别人发过来的请求
#arp_announce:对外不公开ip地址
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]# ifconfig lo:1 10.0.0.100/32
[root@rs2 ~]# ip a
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 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.100/0 scope global lo:1 #vip地址
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 pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:ce:14:4b brd ff:ff:ff:ff:ff:ff
inet 10.0.0.17/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fece:144b/64 scope link
valid_lft forever preferred_lft forever
4.lvs主机的配置
#在lvs上添加vip
[root@lvs-server ~]# ifconfig lo:1 10.0.0.100/32
[root@lvs-server ~]# ip a
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 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.100/0 scope global lo:1
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 mq state UP group default qlen 1000
link/ether 00:0c:29:db:5c:70 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.8/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::2809:c325:2bc5:7e85/64 scope link noprefixroute
valid_lft forever preferred_lft forever
#实现lvs规则
[root@lvs-server ~]# yum install -y ipvsadm
#添加规则去访问目的vip
[root@lvs-server ~]# ipvsadm -A -t 10.0.0.100:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7:80 -g
[root@lvs-server ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17:80 -g
[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 rr
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.17:80 Route 1 0 0
5. client进行测试访问
[root@client ~]# curl 10.0.0.100
10.0.0.7
[root@client ~]# curl 10.0.0.100
10.0.0.17
#查看rs1的访问日志-----访问地址为192.168.0.6
[root@rs1 ~]# tail -f /var/log/httpd/access_log -n0
192.168.0.6 - - [07/Nov/2020:20:34:32 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.0.6 - - [07/Nov/2020:20:34:39 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
6.3 LVS-DR模式—多网段案例
1.环境
环境:五台主机
一台:客户端 eth0:仅主机 192.168.0.6/24 GW:192.168.0.200
一台:ROUTER
eth0 :NAT 10.0.0.200/24
eth0:1 172.16.0.200/24
eth1: 仅主机 192.168.0.200/24
启用 IP_FORWARD
一台:LVS
eth0:NAT:DIP:10.0.0.8/24 GW:10.0.0.200
lo:VIP 172.16.0.100/32
两台RS:
RS1:eth0:NAT:10.0.0.7/24 GW:10.0.0.200 lo:VIP 172.16.0.100/32
RS2:eth0:NAT:10.0.0.17/24 GW:10.0.0.200 lo:VIP 172.16.0.100/32
2.lvs的网络配置
#所有主机禁用iptables和SELinux
1.#internet主机环境
[root@client ~]# hostname
client
[root@client ~]# hostname -I
192.168.0.6
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.200 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@client ~]# ping 10.0.0.7
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=63 time=2.86 ms
64 bytes from 10.0.0.7: icmp_seq=2 ttl=63 time=1.07 ms
^C
--- 10.0.0.7 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.074/1.967/2.860/0.893 ms
######################################################################################################################################################################################################################################
2.#路由器的网络配置
#开启路由转发功能
[root@route ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@route ~]# hostname -I
10.0.0.200 192.168.0.200
[root@route ~]# cd /etc/sysconfig/network-scripts/
[root@route network-scripts]# cat ifcfg-eth0
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.200
PREFIX=24
DNS1=211.138.30.66
[root@route network-scripts]# cat ifcfg-eth1
NAME=eth1
UUID=0db13ffe-2b42-4164-97fc-475a874490cc
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.0.200
PREFIX=24
DNS1=211.138.30.66
#路由器中添加连接虚拟vip同一网段的地址
[root@route ~]# ifconfig eth0:1 172.16.0.200/24
[root@route ~]# ip a
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 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:da:39:8d brd ff:ff:ff:ff:ff:ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 172.16.0.200/24 brd 172.16.0.255 scope global eth0:1 #eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::2d55:b8a2:424f:bc95/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:da:39:97 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.200/24 brd 192.168.0.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::6ce7:a7ce:c1f3:4171/64 scope link noprefixroute
valid_lft forever preferred_lft forever
######################################################################################################################################################################################################################################
3.#LVS-server的网络配置
[root@lvs-server ~]# hostname
lvs-server
[root@lvs-server ~]# hostname -I
10.0.0.8
[root@lvs-server ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
UUID=0db13ffe-2b42-4164-97fc-475a874490cc
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.200
DNS1=211.138.30.66
[root@lvs-server ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@lvs-server ~]# ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=3.64 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=0.864 ms
64 bytes from 192.168.0.6: icmp_seq=3 ttl=63 time=1.03 ms
^C
--- 192.168.0.6 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 70ms
rtt min/avg/max/mdev = 0.864/1.842/3.636/1.270 ms
######################################################################################################################################################################################################################################
4.#RS1的网络配置
[root@rs1 ~]# hostname
rs1
[root@rs1 ~]# hostname -I
10.0.0.7
[root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.200
DNS1=211.138.30.66
DNS2=223.6.6.6
[root@rs1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs1 ~]#yum -y install httpd
[root@rs1 ~]#systemctl enable --now httpd
[root@rs1 ~]#hostname -I > /var/www/html/index.html
[root@rs1 ~]# ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.57 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=0.836 ms
^C
--- 192.168.0.6 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.836/1.207/1.579/0.373 ms
######################################################################################################################################################################################################################################
5.#RS2网络配置
[root@rs2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.200
DNS1=211.138.30.66
DNS2=223.6.6.6
[root@rs2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@rs2 ~]#yum -y install httpd
[root@rs2 ~]#systemctl enable --now httpd
[root@rs2 ~]#hostname -I > /var/www/html/index.html
[root@rs2 ~]# curl 10.0.0.17
10.0.0.17
[root@rs2 ~]# ping 192.168.0.6
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=63 time=1.25 ms
64 bytes from 192.168.0.6: icmp_seq=2 ttl=63 time=0.810 ms
^C
--- 192.168.0.6 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.810/1.030/1.250/0.220 ms
######################################################################################################################################################################################################################################
3.后端真实服务器ipvs配置
1.#rs1的ipvs配置
#为了解决vip地址冲突的问题,更改内核参数
[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 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# ifconfig lo:1 172.16.0.100/32
[root@rs1 ~]# ip a
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 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/0 scope global lo:1 #vip地址
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 pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:45:45:ef brd ff:ff:ff:ff:ff:ff
inet 10.0.0.7/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
2.#rs2的ipvs配置
#arp_ignore :忽略别人发过来的请求
#arp_announce:对外不公开ip地址
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]# ifconfig lo:1 172.16.0.100/32
[root@rs2 ~]# ip a
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 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/0 scope global lo:1 #vip地址
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 pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:ce:14:4b brd ff:ff:ff:ff:ff:ff
inet 10.0.0.17/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fece:144b/64 scope link
valid_lft forever preferred_lft forever
[root@rs2 ~]#
4.lvs主机的配置
#在lvs上添加vip
[root@lvs-server ~]# ifconfig lo:1 172.16.0.100/32
[root@lvs-server ~]# ip a
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 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 172.16.0.100/0 scope global lo:1
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 mq state UP group default qlen 1000
link/ether 00:0c:29:db:5c:70 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.8/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::2809:c325:2bc5:7e85/64 scope link noprefixroute
valid_lft forever preferred_lft forever
#实现lvs规则
[root@lvs-server ~]# yum install -y ipvsadm
#添加规则去访问目的vip
[root@lvs-server ~]# ipvsadm -A -t 172.16.0.100:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.7:80 -g
[root@lvs-server ~]# ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.17:80 -g
[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.100:80 rr
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.17:80 Route 1 0 0
5. client进行测试访问
[root@client ~]# curl 172.16.0.100
10.0.0.7
[root@client ~]# curl 172.16.0.100
10.0.0.17
[root@client ~]# curl 172.16.0.100
10.0.0.7
[root@client ~]# curl 172.16.0.100
10.0.0.17
[root@client ~]# curl 172.16.0.100
#查看后端真实服务器上的日志,源为192.168.0.6
[root@rs1 ~]# tail -f /var/log/httpd/access_log -n0
192.168.0.6 - - [07/Nov/2020:23:53:16 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"
192.168.0.6 - - [07/Nov/2020:23:53:22 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0"