Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践

Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践

  • 1. LVS(Linux Virtual Server)介绍
  • 2. IPVS(LVS)发展史
  • 3. IPVS软件工作层次图
  • 4. LVS技术点小结
  • 5. LVS的4模式原理讲解
    • 5.1 NAT(Network AddressTranslation),中文网络地址转换
    • 5.2 TUN模式-隧道模式
    • 5.3 DR模式-直接路由模式
    • 5.4 FULLNAT 模式-淘宝网最新开源的
  • 6. LVS负载均衡实践
    • 6.1 环境准备
    • 6.2 LVS负载均衡安装
  • 7. 场景1:实现MySQL数据库负载均衡
    • 7.1 配置LVS虚拟IP(VIP)
    • 7.2 手工执行配置添加LVS服务并增加两台RS ipvsadm
    • 7.3 手工在RS端绑定lo网卡及抑制ARP
    • 7.4 手工在RS端抑制ARP响应
    • 7.5 抑制ARP脚本实现
    • 7.6 arp抑制技术参数说明
  • 8. 场景2:实现LVS+keepalved L4 mysql集群高可用
  • 9. 场景3:实现Web4层负载及配合后端7层反向代理+web节点
    • 9.1 环境说明
    • 9.2 配置keepalived lb4-01
    • 9.3 配置keepalived lb4-02
  • 10. 获取lvs+nginx+web前端用户真实IP

1. LVS(Linux Virtual Server)介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,
可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目是中国国内最早出现的自由软件项目之一。
链接: http://www.linuxvirtualserver.org/zh

2. IPVS(LVS)发展史

早在2.2内核时,IPVS就已经以内核补丁的形式出现。
从2.4.23版本开始,IPVS软件就是合并到Linux内核的常用版本的内核补丁的集合。
从2.4.24以后IPVS已经成为Linux官方标准内核的一部分。

3. IPVS软件工作层次图

在这里插入图片描述

从上图我们看出,LVS负载均衡调度技术是在Linux内核中实现的,
因此,被称之为Linux虚拟服务器(Linux Virtual Server)。使用该软件配置LVS时候,不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理,当然通过keepalived软件直接管理ipvs,并不是通过ipvsadm来管理ipvs。
ipvs的管理工具ipvsadm管理ipvs。

4. LVS技术点小结

1、真正实现调度的工具是IPVS,工作在linux内核层面。
2、LVS自带的IPVS命令行管理工具是ipvsadm。
3、keepalived实现管理IPVS(配置文件)及负载均衡器的高可用。
4、Red hat工具Piranha WEB管理实现调度的工具IPVS

名称缩写说明
虛拟IP地址(Virtual Ip Address)VIPVIP为Director用于向客户端计算机提供服务的IP地址。比如:www.etiantian.org 域名就要解析到vip上提供服务。
真实IP地址(Real Server Ip Address)RIP在集群下面节点上使用的IP地址,物理IP地址。
Director的IP地址(Director Ip Address)DIPDirector用于连接内外网络的IP地址,物理网卡上的IP地址。是负载均衡器上的IP。
客户端主机IP地址(Client Ip Address)CIP客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址。

5. LVS的4模式原理讲解

LVS负载均衡四种工作模式

  1. NAT(Network Address Translation)
  2. TUN(Tunneling)隧道模式。
  3. DR(Direct Routing)直接路由 推荐使用
  4. FULLNAT(Full Network Address Translation) 完全 NAT

5.1 NAT(Network AddressTranslation),中文网络地址转换

(VS/NAT)Virtual Server via Network Address Translation
通过网络地址转换,调度器LB重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文处理之后,返回时必须要通过调度器,经过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。

提示:VS/NAT 模式,很类似公路上的收费站,来去都要经过LB负载均衡器,通过修改目的地址,端口或源地址或源端口。在后面的iptables防火墙课程我们也会讲到NAT网络地址转换。

在这里插入图片描述

在这里插入图片描述

原理描述:
客户端通过 VIP访问网络服务时,请求的报文到达调度器LB时,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 VIP 改写成选定服务器的地址(RIP1),请求报文的目标端口改写成选定服务器的相应端口(RS提供的服务端口),最后将修改后的报文发送给选出的服务器RS1。同时,调度器LB在连接的 Hash 表中记录这个连接,当这个连接的下一个报文到达时,从连接的 Hash 表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务器(RS1)。当来自真实服务器 RS1的响应报文返调度器时,调度器将返回报文的源地址和源端口改为 VIP 和相应的端口,然后调度器再把报文发给请求的用户。

Linux针对 iptables nat 防火墙的内核优化
链接: http://oldboy.blog.5lcto.com/2561410/1184228

NAT 模式核心总结:
1、NAT 技术将请求的报文(通过DNAT方式改写)和响应的报文(通过SNAT方式改写),通过调度器地址重写然后在转发给内部的服务器,报文返回时在改写成原来的用户请求的地址。
2、只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信。
3、每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然经过调度器LB。
4、由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。
5、NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到RS节点的172.16.1.7:8080(DR 和 TUN 模式不具备的)。
6、所有NAT内部RS节点只需配置私有LAN IP即可。
7、由于数据包来回都需要经过调度器,因此,要开启内核转发 net.ipv4.ip forward=1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)
8、大多数商业化的IP负载均衡调度器产品都是使用NAT的方法,如Cisco的LocalDirector、F5、Netscaler的Big/IP和Alteon的ACEDirector。

5.2 TUN模式-隧道模式

在这里插入图片描述

(VS/TUN)Virtual Server via IP Tunneling
采用NAT技术时,由于请求和响应的报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道(相当于ipip 或ipsec)转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。由于一般网络服务应答数据比请求报文大很多,采用VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

VS/TUN 的工作流程如下图所示:它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,连接数多少,动态地选择一台服务器,将原请求的报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的真实服务器;真实服务器收到报文后,先将收到的报文解封获得原来目标地址为VIP地址的报文,服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

根据缺省的TCP/IP协议栈处理,请求报文的目标地址为VIP,响应报文的源地址肯定也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道究竟是哪一台服务器处理的。

Haproxy+ipip 隧道/IPSEC,SSLVPN
lvs+ipip

TUN模式总结:
1、负载均衡器通过把请求的报文通过IP隧道(ipip隧道,高级班讲这个)的方式(请求的报文不经过原目的地址的改写(包括 MAC),而是直接封装成另外的IP报文)转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户。
2、由于真实服务器将响应处理后的报文直接返回给客户端用户,因此,最好RS有一个外网IP地址,这样效率才会更高。理论上:只要能出网即可,无需外网IP地址。
3、由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定的系统开销。TUN模式适合LAN/WAN。
4、TUN 模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
5、所有的RS服务器都要绑定VIP,抑制ARP,配置复杂。
6、LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在 WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
7、直接对外的访问业务,例如:web服务做RS节点,最好用公网IP地址。不直接对外的业务,例如:MYSOL,存储系统RS节点,最好用内部IP地址。

5.3 DR模式-直接路由模式

在这里插入图片描述

在这里插入图片描述

(VS/DR)Virtual Server via Direct Routing
VS/DR 模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。同 VS/TUN 技术一样,VS/DR 技术可极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器LB与真实服务器RS都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。

DR 模式总结:
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP,目的IP地址仍然是VIP。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式比)。
3、因DR模式是通过MAC地址的改写机制实现的转发,因此,所有 RS 节点和调度器LB只能在一个局域网LAN中(小缺点)
4、需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32)和ARP抑制问题。
5、强调下:RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP。
6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(和NAT要区别)。
7、当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是 WINDOWS系统。
8、总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万以下都可以考虑用haproxy/nginx(LVS NAT 模式)
9、直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:Mysql存储系统RS节点,最好只用内部IP地址。

5.4 FULLNAT 模式-淘宝网最新开源的

1、背景
LVS当前应用主要采用DR和NAT模式,但这2种模式要求RealServer和LVS在同一个vlan中,导致部署成本高;TUNNEL,模式虽然可以跨vlan,但RealServer上需要部署ipip隧道模块等,网络拓扑上需要连通外网,较复杂,不易运维。
为了解决上述问题,我们在LVS上添加了一种新的转发模式:FULLNAT,该模式和NAT模式的区别是:Packet IN时,除了做DNAT,还做SNAT(用户ip->内网ip),从而实现LVS-RealServer间可以跨vlan通讯,RealServer只需要连接到内网。
2、目标
FULLNAT将作为一种新工作模式(同DR/NAT/TUNNEL),实现如下功能:
1.Packet IN 之前,目标ip为VIP,源IP为CIP;
2.Packet IN时,目标ip更换为realserverip,源ip更换为内网 local vip;
3.Packet OUT时,目标ip更换为CIP,源ip更换为VIP;
注:Local vp 为一组内网ip地址(即集群模式);
​ 性能要求,和NAT比,正常转发性能下降<10%。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6. LVS负载均衡实践

6.1 环境准备

1)MySQL负载均衡
L4:

外部IP地址内部IP地址角色备注
10.0.0.15172.16.1.15LVS调度器(Director)对外提供服务的VIP为10.0.0.17
10.0.0.16172.16.1.16LVS调度器(Director)对外提供服务的VIP为10.0.0.17
10.0.0.7172.16.1.7RS1(真实服务器)MySQL
10.0.0.51172.16.1.51RS2(真实服务器)MySQL

配置过程:

  1. 7、51 MySQL配置好,能够连接
  2. 15、16,安装lvs,手工配置忽略
    ​ 直接keepalived.conf
    ​ VIP 172.16.1.18
  3. 7,51 lo绑定vip/32,抑制ARP

2)L4+L7+WEB 大规模web负载均衡

L4:

外部IP地址内部IP地址角色备注
10.0.0.15172.16.1.15LVS调度器(Director)对外提供服务的VIP为10.0.0.17
10.0.0.16172.16.1.16LVS调度器(Director)对外提供服务的VIP为10.0.0.17

L7:

外部IP地址内部IP地址角色备注
10.0.0.5172.16.1.5LVS调度器(Director)
10.0.0.6172.16.1.6LVS调度器(Director)
10.0.0.7172.16.1.7RS1(真实服务器)web01
10.0.0.8172.16.1.8RS2(真实服务器)web02

6.2 LVS负载均衡安装

1)安装LVS

yum install ipvsadm -y
rpm -qa ipvsadm
#ipvsadm-1.27-8.el7.x86_64
modprobe ip_vs    # 把ipvs加入到内核
lsmod|grep ip_vs  # 检查内核是否有ip_vs
uname -r
#3.10.0-1160.31.1.el7.x86_64
ln -s /usr/src/kernels/3.10.0-1160.31.1.el7.x86_64 /usr/src/linux  #yum install kernel-devel -y
ls -l /usr/src/
#lrwxrwxrwx  1 root root 44 8月   1 18:04 linux -> /usr/src/kernels/3.10.0-1160.31.1.el7.x86_6

特别注意:
1)ln命令链接路径要和uname -r输出结果内核版本对应。
2)如果没有/usr/src/kernels/xx路径,可通过yum install kernel-devel -y安装。

7. 场景1:实现MySQL数据库负载均衡

7.1 配置LVS虚拟IP(VIP)

ifconfig eth1:18 172.16.1.18/24 up #==>简便写法
#route add -host 172.16.1.18 dev eth1  #==添加主机路由,也可不加此行。

③配置后的检查结果:

ifconfig eth1:0

C:\Users\oldboy>ping 172.16.1.18
正在 Ping 172.16.1.18 具有 32 字节的数据:
来自 172.16.1.18 的回复: 字节=32 时间<1ms TTL=64
提示:到这里说明VIP地址已经配好,并可以使用了。

7.2 手工执行配置添加LVS服务并增加两台RS ipvsadm

ipvsadm -C                         #<==    -C        clear the whole table
ipvsadm --set 30 5 60              #<== --set tcp tcpfin udp  set connection timeout values
ipvsadm -A -t 172.16.1.18:3306 -s wrr   #--add-service   -A   add virtual service with options
#ipvsadm -A -t 172.16.1.18:3306 -s wrr -p 20
ipvsadm -a -t 172.16.1.18:3306 -r 172.16.1.51:3306 -g -w 1 #dr模式
ipvsadm -a -t 172.16.1.18:3306 -r 172.16.1.7:3306 -g -w 1
# ipvsadm -a|e -t|u|f service-address -r server-address [options][root@lb4-01 ~]# 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.1.18:3306 wrr-> 172.16.1.7:3306              Route   1      0          0         -> 172.16.1.51:3306             Route   1      0          0 [root@lb4-01 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes-> RemoteAddress:Port
TCP  172.16.1.18:3306                    0        0        0        0        0-> 172.16.1.7:3306                     0        0        0        0        0-> 172.16.1.51:3306                    0        0        0        0        0

[删除方法]

#ipvsadm -D -t 172.16.1.18:3306 -s wrr
#ipvsadm -D -t 172.16.1.18:3306
#ipvsadm -d -t 172.16.1.18:3306 -r 172.16.1.18:3306 <==正确
#ipvsadm -d -t 172.16.1.18:3306 -r 172.16.1.18:3306 -g -w 1 <==不好用

[相关参数说明]

[root@oldboy ~]# ipvsadm -help
# --clear           -C        clear the whole table
# --add-service     -A        add virtual service with options
# --tcp-service     -t service-address   service-address is host[:port]
# --scheduler       -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
#  --add-server    -a                   add real server with options
#  --real-server   -r server-address    server-addres s is host (and port)
#  --masquerading  -m                   masquerading (NAT)
#  --gatewaying    -g                   gatewaying (direct routing) (default)
#  --delete-server -d         delete real server
#  --persistent    -p [timeout]         persistent service(会话保持功能)
#  --set tcp tcpfin udp        set connection timeout values
#  --weight       -w weight            capacity of real server
#  --ipip         -i                   ipip encapsulation (tunneling)

提示:更多参数请ipvsadm -help自行查看
⑤命令执行过程及检查配置的执行结果

ipvsadm -C 
ipvsadm --set 30 5 60  
ipvsadm -A -t 172.16.1.19:3306 -s wrr -p 20
ipvsadm -a -t 172.16.1.19:3306 -r 172.16.1.51:3306 -g -w 1
ipvsadm -a -t 172.16.1.19:3306 -r 172.16.1.7:3306 -g -w 1   
ipvsadm -L -n --sortipvsadm -d -t 172.16.1.18:3306 -r 172.16.1.51:80 #==>删除测试
ipvsadm -L -n --sortipvsadm -a -t 172.16.1.18:3306 -r 172.16.1.51:80 
ipvsadm -L -n --sort

此时,可以打开浏览器访问http://172.16.1.18体验结果,如果没意外,是无法访问的。

7.3 手工在RS端绑定lo网卡及抑制ARP

⑥每台real server端执行
命令:

ifconfig lo:18 172.16.1.18/32 up
#route add -host 172.16.1.18 dev lo

工作中写到配置文件见后文

#centos7
ip addr add 172.16.1.18/32 dev lo label lo:50
#route add -host 172.16.1.18 dev lo

每个集群节点上的环回接口(lo)设备上被绑定VIP地址(其广播地址是其本身,子网掩码是255.255.255.255,采取可变长掩码方式把网段划分成只含一个主机地址的目的是避免ip地址冲突)允许LVS-DR集群中的集群节点接受发向该VIP地址的数据包,这会有一个非常严重的问题发生,集群内部的真实服务器将尝试回复来自正在请求VIP客户端的ARP广播,这样所有的真实服务器都将声称自己拥有该VIP地址,这时客户端将有可能直接发送请求数据包到某台真实服务器上,从而破坏了DR集群的负载均衡策略。因此,必须要抑制所有真实服务器响应目标地址为VIP的ARP广播,而把客户端ARP广播的响应交给负载均衡调度器。

7.4 手工在RS端抑制ARP响应

⑦抑制ARP响应方法如下:

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

以RS1为例演示执行过程如下:

ifconfig lo:18 172.16.1.18 netmask 255.255.255.255 up
#route add -host 172.16.1.18 dev lo
cat /proc/sys/net/ipv4/conf/lo/arp_ignore
cat /proc/sys/net/ipv4/conf/all/arp_ignore  
cat /proc/sys/net/ipv4/conf/all/arp_announce 
cat /proc/sys/net/ipv4/conf/lo/arp_announce    
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

测试最终LVS对数据库负载是否成功:
采用web02测试:
phpmyadmin
mysql 测试成功
windows:navicat…需要vmware 映射

实际教学使用mysql客户端测试,在web02上

yum install mariadb -y
mysql -ublog -poldboy123 -h172.16.1.18 #18是VIP,用户密码为前面课程提前设置。

停掉了51,发现连不了

lvs没有健康检查功能,51停掉了,仍然请求发给51,需要手工清理51

[root@lb4-01 ~]# 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.1.18:3306 wrr persistent 20-> 172.16.1.7:3306              Route   1      0          0         -> 172.16.1.51:3306             Route   1      0          4         
[root@lb4-01 ~]# ipvsadm -d -t 172.16.1.18:3306 -r 172.16.1.51:3306
[root@lb4-01 ~]# 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.1.18:3306 wrr persistent 20-> 172.16.1.7:3306              Route   1      0          0   

重连成功,LVS的健康检查要靠keepalved配合实现,后文讲

7.5 抑制ARP脚本实现

开发脚本配置LVS RS真实服务器端

#!/bin/bash
# Written by oldboy (31333741@qq.com)
# QQ:31333741
# description: Config realserver lo and apply noarp 
VIP=(172.16.1.18)
. /etc/rc.d/init.d/functions
case "$1" in
start)for ((i=0; i<`echo ${#VIP[*]}`; i++))dointerface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"/sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 updoneecho "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announceaction "Start LVS of RearServer.by old1boy";;
stop)for ((i=0; i<`echo ${#VIP[*]}`; i++))dointerface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"/sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 downdoneecho "close LVS Directorserver"if [ ${#VIP[*]} -eq 1];thenecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announcefiaction "Close LVS of RearServer.by old2boy";;
*)echo "Usage: $0 {start|stop}"exit 1
esac

工作中可以将lo网卡绑定写到配置文件:

cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-lo:18
[root@db01 network-scripts]# cat ifcfg-lo:18
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="lo:18"
DEVICE="lo:18"
ONBOOT="yes"
IPADDR="172.16.1.18"
PREFIX="32"

7.6 arp抑制技术参数说明

arp_ignore- INTEGER
定义对目标地址为本地IP的ARP询问不同的应答模式
0 -(默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求。
1 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求。
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
3 -不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
4-7 -保留未使用。
8 -不回应所有(本地地址)的arp查询。

arp_announce - INTEGER
对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:
确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 -(默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一。如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 -对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.限制了使用本地的vip地址作为优先的网络接口

8. 场景2:实现LVS+keepalved L4 mysql集群高可用

lb4-01配置:

[root@lb4-01 keepalived]# cat keepalived.conf
global_defs {router_id lb01
}
vrrp_instance VI_2 {state MASTERinterface eth1virtual_router_id 52priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.16.1.18/24 dev eth1 label eth1:18}
}#port 3306
##oldboy service  virtual_server 
virtual_server 172.16.1.18 3306 {delay_loop 6          	lb_algo wrr                lb_kind DRpersistence_timeout 20     protocol TCP                
real_server 172.16.1.7 3306 {weight 1              TCP_CHECK {connect_timeout 5       #nb_get_retry 3delay_before_retry 3connect_port 3306}
}real_server 172.16.1.51 3306 {weight 1TCP_CHECK {connect_timeout 5# nb_get_retry 3delay_before_retry 3connect_port 3306}
}
}

lb4-02配置:

[root@lb4-02 keepalived]# cat keepalived.conf
global_defs {router_id lb4-02
}
vrrp_instance VI_2 {state BACKUPinterface eth1virtual_router_id 52priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.16.1.18/24 dev eth1 label eth1:18}
}#port 3306
##oldboy service  virtual_server 
virtual_server 172.16.1.18 3306 {delay_loop 6          	lb_algo wrr                lb_kind DRpersistence_timeout 20     protocol TCP         
real_server 172.16.1.7 3306 {weight 1              TCP_CHECK {connect_timeout 5       #nb_get_retry 3delay_before_retry 3connect_port 3306}
}real_server 172.16.1.51 3306 {weight 1TCP_CHECK {connect_timeout 5# nb_get_retry 3delay_before_retry 3connect_port 3306}
}
}

重启keep完成

9. 场景3:实现Web4层负载及配合后端7层反向代理+web节点

9.1 环境说明

L4+L7+WEB 大规模web负载均衡
L4:

外部IP地址内部IP地址角色备注
10.0.0.15172.16.1.15LVS调度器(Director)对外提供服务的VIP为10.0.0.17
10.0.0.16172.16.1.16LVS调度器(Director)对外提供服务的VIP为10.0.0.17

L7:

外部IP地址内部IP地址角色备注
10.0.0.5172.16.1.5nginx lb01 测好了。
10.0.0.6172.16.1.6nginx lb02
10.0.0.7172.16.1.7RS1(真实服务器)web01
10.0.0.8172.16.1.8RS2(真实服务器)web02

配置过程:

  1. 配置7,8 Nginx web

  2. 配置5,6 Nginx proxy(proxy_pass,upstream)

  3. 配置15,16
    安装LVS即可
    安装keepalived,配置keepalived.conf(配置VIP 管理LVS)

  4. 5,6属于LVS节点,在Nginx proxy(proxy_pass,upstream)上的lo网卡绑定vip,抑制ARP。

[root@lb4-02 keepalived]# curl -H "host:www.etiantian.org" 172.16.1.7
web01
[root@lb4-02 keepalived]# curl -H "host:www.etiantian.org" 172.16.1.8
web02,老男孩Linux77最优班级
remote_addr: 172.16.1.16
proxy_protocol_addr: 
http_x_forwarded_for:

9.2 配置keepalived lb4-01

[root@lb4-01 keepalived]# cat keepalived.conf
global_defs {router_id lb01
}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 53priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.17/24 dev eth0 label eth0:17}
}
#web
##oldboy service  virtual_server 
virtual_server 10.0.0.17 80 {delay_loop 6          	lb_algo wrr                lb_kind DRpersistence_timeout 20     protocol TCP                
real_server 10.0.0.5 80 {weight 1              TCP_CHECK {connect_timeout 5       #nb_get_retry 3delay_before_retry 3connect_port 80}
}real_server 10.0.0.6 80 {weight 1TCP_CHECK {connect_timeout 5# nb_get_retry 3delay_before_retry 3connect_port 80}
}
};===============================================
vrrp_instance VI_2 {state MASTERinterface eth1virtual_router_id 52priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.16.1.18/24 dev eth1 label eth1:18}
}#port 3306
##oldboy service  virtual_server 
virtual_server 172.16.1.18 3306 {delay_loop 6          	lb_algo wrr                lb_kind DRpersistence_timeout 20     protocol TCP   real_server 172.16.1.7 3306 {weight 1              TCP_CHECK {connect_timeout 5       #nb_get_retry 3delay_before_retry 3connect_port 3306}
}real_server 172.16.1.51 3306 {weight 1TCP_CHECK {connect_timeout 5# nb_get_retry 3delay_before_retry 3connect_port 3306}
}
}

9.3 配置keepalived lb4-02

[root@lb4-02 keepalived]# cat keepalived.conf
global_defs {router_id lb4-02
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 53priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.17/24 dev eth0 label eth0:17}
}
#web
##oldboy service  virtual_server 
virtual_server 10.0.0.17 80 {delay_loop 6          	lb_algo wrr                lb_kind DRpersistence_timeout 20     protocol TCP                
real_server 10.0.0.5 80 {weight 1              TCP_CHECK {connect_timeout 5       #nb_get_retry 3delay_before_retry 3connect_port 80}
}real_server 10.0.0.6 80 {weight 1TCP_CHECK {connect_timeout 5# nb_get_retry 3delay_before_retry 3connect_port 80}
}
}vrrp_instance VI_2 {state BACKUPinterface eth1virtual_router_id 52priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.16.1.18/24 dev eth1 label eth1:18}
}#port 3306
##oldboy service  virtual_server 
virtual_server 172.16.1.18 3306 {delay_loop 6          	lb_algo wrr                lb_kind DRpersistence_timeout 20     protocol TCP        
real_server 172.16.1.7 3306 {weight 1              TCP_CHECK {connect_timeout 5       #nb_get_retry 3delay_before_retry 3connect_port 3306}
}real_server 172.16.1.51 3306 {weight 1TCP_CHECK {connect_timeout 5# nb_get_retry 3delay_before_retry 3connect_port 3306}
}
}

4)web节点分别(web01,web02)配置VIP绑定,及抑制ARP(脚本实现)

[root@lb01 conf.d]# mkdir /server/scripts -p
[root@lb01 conf.d]# cd /server/scripts/
[root@lb01 scripts]# vim ipvs.sh
#!/bin/bash
# Written by oldboy (31333741@qq.com)
# QQ:31333741
# description: Config realserver lo and apply noarp 
VIP=(10.0.0.17)
. /etc/rc.d/init.d/functions
case "$1" in
start)for ((i=0; i<`echo ${#VIP[*]}`; i++))dointerface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"/sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 updoneecho "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announceaction "Start LVS of RearServer.by old1boy";;
stop)for ((i=0; i<`echo ${#VIP[*]}`; i++))dointerface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"/sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 downdoneecho "close LVS Directorserver"if [ ${#VIP[*]} -eq 1];thenecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announcefiaction "Close LVS of RearServer.by old2boy";;
*)echo "Usage: $0 {start|stop}"exit 1
esac[root@lb01 scripts]# 
[root@lb01 scripts]# sh ipvs.sh 
Usage: ipvs.sh {start|stop}
[root@lb01 scripts]# sh ipvs.sh start
Start LVS of RearServer.by old1boy                         [  确定  ]
ifconfig查看

10. 获取lvs+nginx+web前端用户真实IP

关于FullNat模式的 Toa 实现原理

server {listen 80;       #添加proxy_protocol#listen 80 proxy_protocol;       #添加proxy_protocolserver_name www.etiantian.org;set_real_ip_from 172.16.1.0/24;  #添加七层负载前经过的代理IP地址real_ip_header proxy_protocol;   #将proxy_protocol获取的IP赋值给$remote_addrlocation / {proxy_pass http://www;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_protocol_addr;#将proxy_protocol真实客户端的IP地址赋值给X-Forwarded-For变量携带至后端proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;  # 这个开启}
}

客户端访问LVS是携带源IP的,IVS仅仅是转发,修改目的MAC,并没有改变源IP。
所以客户源IP可以被nginx lb01获取到,然后通过x-forward-for传给web节点

[root@web01 conf.d]# tail /var/log/nginx/access.log
---,--172.16.1.5--,---10.0.0.1---,----10.0.0.1, 172.16.1.5----,-,01/Aug/2021:19:33:24 +0800,www.etiantian.org,GET / HTTP/1.0,200,-,-,0.000,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36  -  -  -
---,--172.16.1.5--,---10.0.0.1---,----10.0.0.1, 172.16.1.5----,-,01/Aug/2021:19:33:24 +0800,www.etiantian.org,GET / HTTP/1.0,200,-,-,0.000,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36  -  -  -
---,--172.16.1.5--,---10.0.0.1---,----10.0.0.1, 172.16.1.5----,-,01/Aug/2021:19:33:24 +0800,www.etiantian.org,GET / HTTP/1.0,200,-,-,0.000,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36  -  -  -
---,--172.16.1.5--,---10.0.0.1---,----10.0.0.1, 172.16.1.5----,-,01/Aug/2021:19:33:25 +0800,www.etiantian.org,GET / HTTP/1.0,200,-,-,0.000,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36  -  -  -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/293270.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Retrieval-Augmented Generation for Large Language Models: A Survey》 AI 解读

论文链接&#xff1a;Retrieval-Augmented Generation for Large Language Models: A Survey 论文标题&#xff1a;《Retrieval-Augmented Generation for Large Language Models: A Survey》 一译中文版地址&#xff1a; https://yiyibooks.cn/arxiv/2312.10997v5/index.htm…

PI案例分享--2000A核心电源网络的设计、仿真与验证

目录 摘要 0 引言 1 为什么需要 2000A 的数字电子产品? 2 2000A 的供电电源设计 2.1 "MPM3698 2*MPM3699"的 MPS扩展电源架构 2.2 使用恒定导通时间(COT)模式输出核心电压的原因 2.3 模块化 VRM 的优势 2.4 用步进负载验证2000A的设计难点 2.4.1 电源网络 …

qtcreator的信号槽链接

在ui文件中简单创建一个信号槽连接并保存可以在ui_mainwindow.h下 class Ui_MainWindow 类 void setupUi(QMainWindow *MainWindow)函数 找到对应代码 QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(close())); 下拉&#xff0c;由于 class MainWind…

《权力》为什么只为某些人所拥有 - 三余书屋 3ysw.net

权力&#xff1a;为什么只为某些人所拥有 大家好&#xff0c;今天我们解读的书名是《权力》&#xff0c;副标题是“为什么只为某些人所拥有”。该书深入探讨了职场中的权力议题&#xff0c;强调获得权力是关键的职场技能之一。在激烈的职场竞争中&#xff0c;缺乏这一技能将使…

C#(winform) 调用MATLAB函数

测试环境 VisualStudio2022 / .NET Framework 4.7.2 Matlab2021b 参考&#xff1a;C# Matlab 相互调用 Matlab 1、编写Matlab函数 可以没有任何参数单纯定义matlab处理的函数&#xff0c;输出的数据都存在TXT中用以后期读取数据 function [result,m,n] TEST(list) % 计算…

Python 后端 Flask 使用 Flask-SocketIO、前端 Vue3 实现长连接 Websocket 通信详细教程(更新中)

Flask 安装 Flask-Socketio Flask-SocketIO 第三方库使 Flask 应用程序可以实现客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript、Python、C、Java 和 Swift 中的任何 SocketIO 客户端库或任何其他兼容客户端来建立与服务器的永久连接。 Flask-Socke…

逐步学习Go-Select多路复用

概述 这里又有多路复用&#xff0c;但是Go中的这个多路复用不同于网络中的多路复用。在Go里&#xff0c;select用于同时等待多个通信操作&#xff08;即多个channel的发送或接收操作&#xff09;。Go中的channel可以参考我的文章&#xff1a;逐步学习Go-并发通道chan(channel)…

使用 Yoda 和 ClickHouse 进行实时欺诈检测

背景 Instacart 是北美领先的在线杂货公司,拥有数百万活跃的客户和购物者。在其平台上打击欺诈和滥用行为不仅对于维护一个值得信赖和安全的环境至关重要,也对保持Instacart的财务健康至关重要。在这篇文章中,将介绍了一个欺诈平台——Yoda,解释了为什么我们选择ClickHous…

【踩坑】荣耀系统Android8.0 system目录Read-only file system

本来以为直接把Charles证书改成系统证书格式&#xff0c;然后通过mt管理器root之后移动到系统证书目录就行了&#xff0c;结果访问baidu仍然显示网络错误&#xff0c;折腾一晚上。后来直接安装为用户证书&#xff0c;与系统证书冲突。 手机型号&#xff1a;荣耀v10 EMUI&…

升级程序到Java21的记录一(在先升级jdk到21)

背景&#xff1a;为了使用Java21的最新特性虚拟线程以及提高程序的整体性能&#xff0c;决定将一个程序A升级到Java21. 备注&#xff1a;程序A有很多文件操作因此使用虚拟线程对提升性能有帮助&#xff0c;如果读者的程序是其他类型&#xff0c;请参考虚拟线程的一些资料决定是…

STM32学习笔记(10_3)- 软件I2C读写MPU6050

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

flutter官方案例context_menus

1&#xff1a;根据项目中的案例进行部署 2&#xff1a;运行查看有什么用&#xff0c;可不可以直接复制粘贴 案例地址 https://github.com/flutter/samples/tree/main/context_menus案例展示方法 直接把这个文件夹中的文件复制到lib文件夹中 3&#xff0c;19&#xff0c;4的fl…

Lazarus远控组件NukeSped分析

静态信息&#xff1a; 样本md5&#xff1a;9b656f5d7e679b94e7b91fc3c4f313e4 由此可见为假的Adobe Flash Player 的攻击样本 样本分析 通过五个函数&#xff0c;内部调用sub_40159D函数动态获取API函数 利用IDA python解密字符串。。 完整python代码 Python> idc.get_…

最优算法100例之18-列升序行升序的数组中查找元素

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一…

LeetCode刷题【链表,图论,回溯】

目录 链表138. 随机链表的复制148. 排序链表146. LRU 缓存 图论200. 岛屿数量994. 腐烂的橘子207. 课程表 回溯 链表 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节…

计算机网络——32差错检测和纠正

差错检测和纠正 错误检测 EDC 差错检测和纠错位&#xff08;冗余位&#xff09; D 数据由差错检测保护&#xff0c;可以包含头部字段 错误检测不是100%可靠的 协议会泄露一些错误&#xff0c;但是很少更长的EDC字段可以得到更好的检测和纠正效果 奇偶校验 单bit奇偶校验 …

App推广新篇章:Xinstall助力精准分析与优化

在当前的移动应用市场中&#xff0c;App推广已成为每个开发者不可或缺的一环。然而&#xff0c;推广并非简单的投放广告与等待用户下载&#xff0c;而是需要一套科学、系统的分析与优化流程。这正是Xinstall作为国内专业的App全渠道统计服务商&#xff0c;能够为您带来的核心价…

Decoupled Multimodal Distilling for Emotion Recognition 论文阅读

Decoupled Multimodal Distilling for Emotion Recognition 论文阅读 Abstract1. Introduction2. Related Works2.1. Multimodal emotion recognition2.2. Knowledge distillation3. The Proposed Method3.1. Multimodal feature decoupling3.2. GD with Decoupled Multimodal …

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…

【PduR路由】IPduM模块详细介绍

目录 1.IpduM功能简介 2.IpduM模块依赖的其他模块 2.1RTE (BSW Scheduler) 2.2PDU Router 2.3COM 3.IpduM功能详解 3.1 功能概述 3.2 I-PDU多路复用I-PDU Multiplexing 3.2.1 Definitions and Layout 3.2.2通用功能描述 General 3.2.3模块初始化 Initialization 3.…