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

news2024/11/29 3:03:00

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 --sort

ipvsadm -d -t 172.16.1.18:3306 -r 172.16.1.51:80 #==>删除测试
ipvsadm -L -n --sort

ipvsadm -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++))
        do
           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
           /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
        done
        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
	   action "Start LVS of RearServer.by old1boy"
        ;;
stop)
        for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
            interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
            /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down
        done
        echo "close LVS Directorserver"
        if [ ${#VIP[*]} -eq 1];then
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        fi
	   action "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 MASTER
    interface eth1
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_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 DR
    persistence_timeout 20     
    protocol TCP                
real_server 172.16.1.7 3306 {
    weight 1              
    TCP_CHECK {
    connect_timeout 5       
    #nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
    }
}

real_server 172.16.1.51 3306 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
   # nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
    }
}
}

lb4-02配置:

[root@lb4-02 keepalived]# cat keepalived.conf
global_defs {
   router_id lb4-02
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 52
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_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 DR
    persistence_timeout 20     
    protocol TCP         
real_server 172.16.1.7 3306 {
    weight 1              
    TCP_CHECK {
    connect_timeout 5       
    #nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
    }
}

real_server 172.16.1.51 3306 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
   # nb_get_retry 3
    delay_before_retry 3
    connect_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 BACKUP
    interface eth0
    virtual_router_id 53
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_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 DR
    persistence_timeout 20     
    protocol TCP                
real_server 10.0.0.5 80 {
    weight 1              
    TCP_CHECK {
    connect_timeout 5       
    #nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
}

real_server 10.0.0.6 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
   # nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
}
}



;===============================================
vrrp_instance VI_2 {
    state MASTER
    interface eth1
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_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 DR
    persistence_timeout 20     
    protocol TCP   

real_server 172.16.1.7 3306 {
    weight 1              
    TCP_CHECK {
    connect_timeout 5       
    #nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
    }
}

real_server 172.16.1.51 3306 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
   # nb_get_retry 3
    delay_before_retry 3
    connect_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 MASTER
    interface eth0
    virtual_router_id 53
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_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 DR
    persistence_timeout 20     
    protocol TCP                
real_server 10.0.0.5 80 {
    weight 1              
    TCP_CHECK {
    connect_timeout 5       
    #nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
}

real_server 10.0.0.6 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
   # nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
}
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 52
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_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 DR
    persistence_timeout 20     
    protocol TCP        
real_server 172.16.1.7 3306 {
    weight 1              
    TCP_CHECK {
    connect_timeout 5       
    #nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
    }
}

real_server 172.16.1.51 3306 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
   # nb_get_retry 3
    delay_before_retry 3
    connect_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++))
        do
           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
           /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
        done
        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
           action "Start LVS of RearServer.by old1boy"
        ;;
stop)
        for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
            interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
            /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down
        done
        echo "close LVS Directorserver"
        if [ ${#VIP[*]} -eq 1];then
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        fi
           action "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_protocol
         server_name www.etiantian.org;
         set_real_ip_from 172.16.1.0/24;  #添加七层负载前经过的代理IP地址
         real_ip_header proxy_protocol;   #将proxy_protocol获取的IP赋值给$remote_addr
         
         location / {
             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.coloradmin.cn/o/1560224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

纽扣电池CR1632没有电解决方案

使用环境 在使用小米的自拍杆时&#xff0c;发现纽扣电池没有电量了逛了下超市&#xff0c;结果发现都没有卖这个型号的电池&#xff0c;但是下午又要拍照&#xff0c;于是想起了应急的充电方法。声明一下&#xff0c;这个内置电池型号是CR1632&#xff0c;然而市面上&#xff…

vue基础教程(5)——十分钟吃透vue路由router

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后&#xff0c;页面显示如下&#xff1a; 在这个页面中&#xff0c;点击Home和About都会切换右面的页面内容&#…

什么是Redis数据一致性?如何解决?

在系统中缓存最常用的策略是&#xff1a;服务端需要同时维护DB和cache&#xff0c;并且是以DB的结果为准–Cache-Aside Pattern&#xff08;缓存分离模式、旁路缓存&#xff09; 读数据 单纯的读数据是不会产生数据不一致&#xff0c;只有并发下读和写才会存在数据不一致。 写…

插入排序---算法

1、算法概念 插入排序&#xff1a;它的工作原理是通过构建有序排序&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置插入。 2、算法步骤 将第一待排序序列第一个元素看作一个有序序列&#xff0c;把第二个元素到最后一个元素当成是…

3万字80道Java基础经典面试题总结(2024修订版)

大家好&#xff0c;我是哪吒。 本系列是《10万字208道Java经典面试题总结(附答案)》的2024修订版。 目录 1、说说跨平台性2、Java是如何实现跨平台性的&#xff1f;3、JDK 和 JRE 有什么区别&#xff1f;4、为何要配置Java环境变量&#xff1f;5、Java都有哪些特性&#xff1f…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《偏远地区能源自洽系统源储容量协同配置方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

AcWing 4405. 统计子矩阵:做题笔记

目录 暴力思路 代码 前缀和双指针 代码 解释 推荐博客 这道题的主要思路就是枚举所有的子矩阵&#xff0c;判断符合条件的子矩阵的个数。 暴力思路 我服了&#xff0c;其实我最开始没有想到 &#xff1a;枚举所有的子矩阵 这样一个很有总结性的要点。 我是想着哦我先…

Mysql数据库:MHA高可用架构

目录 前言 一、MHA概述 1、什么是MHA 2、MHA的特点 3、MHA的组成 4、MHA的工作原理 5、故障切换备选主库的算法 二、部署MHA高可用架构 1、环境部署 2、部署主从同步 2.1 修改主配置文件并创建软链接 2.1.1 master 修改主配置文件并创建软连接 2.1.2 slave1 修改主…

WIFI驱动移植实验:将 rtl8188EUS驱动添加到 Linux 内核中

一. 简介 正点原子的 I.MX6U-ALPHA 开发板目前支持两种接口的 WIFI &#xff1a; USB 和 SDIO &#xff0c;其中 USB接口的WIFI 使用使用的芯片为 RTL8188EUS 或 RTL8188CUS &#xff0c; SDIO 接口的 WIFI 使用芯片为 RTL8189FS &#xff0c;也叫做 RTL8189FT…

尚医通day1

1 创建项目 doc 窗口 pnpm create vite 填写项目名 vue-syt选择框架 vuetypeScript 2整理项目 删除 /src/assets/vue.svg 文件&#xff0c;删除 /src/components 下的 helloWorld.vue删除app.vue内容&#xff0c;快捷键v3ts 生成模板内容去掉 /src/style.css 样式文件&…

仿微信领红包HTML源码

源码介绍 仿微信领红包HTML源码&#xff0c;将代码放到一个空白的HTML文件里面保存&#xff0c;鼠标双击即可查看效果&#xff0c;一个微信发送消息提示&#xff0c;弹窗就出来了&#xff0c;关闭之后&#xff0c;出现完整的微信红包领取界面&#xff0c;源码HTML&#xff0c;…

GS1-全球分类标准

GS1 GS1是一个中立的全球合作平台&#xff0c;汇集行业领袖、政府、监管机构、学术界和协会&#xff0c;共同开发基于标准的解决方案&#xff0c;以应对数据交换的挑战。我们的规模和影响力——遍布 116 个国家/地区的当地会员组织、超过 200 万家用户公司和每天 100 亿笔交易—…

conda 创建 python3.10.12 环境

conda 创建 python3.10.12 环境 介绍使用前置条件&#xff1a;安装 conda配置环境变量验证 Conda 安装结果创建环境&#xff1a;python激活 Anaconda 环境 验证 Python 版本。 介绍 Conda是一个开源的包管理和环境管理系统&#xff0c;由Continuum Analytics公司开发。它可以安…

LangChain使用实例——Query analysis

Query analysis ​ “Search”为许多用例提供支持——包括检索增强生成的“检索”部分。最简单的方法是将用户问题直接传递给检索器。为了提高性能&#xff0c;还可以使用“query analysis”以某种方式“优化”查询。传统上&#xff0c;这是通过基于规则的技术来完成的&#x…

VMware虚拟机共享主机v2rayN

目录 &#x1f33c;前言 &#x1f33c;解释 &#x1f6a9;操作 1&#xff09;VMware -- 虚拟网络编辑器 2&#xff09;VMware -- 网络适配器 3&#xff09;主机 IP 地址 4&#xff09;v2rayN 代理端口 5&#xff09;VMware -- 网络代理(Network proxy) &#x1f382;结…

基于 Quartz.NET 可视化任务调度平台 QuartzUI

一、简介 QuartzUI 是基于 Quartz.NET3.0 的定时任务 Web 可视化管理&#xff0c;Docker 打包开箱即用、内置 SQLite 持久化、语言无关、业务代码零污染、支持 RESTful 风格接口、傻瓜式配置、异常请求邮件通知等。 二、部署 QuartzUI 从 2022 年到现在没有提交记录&#xf…

深入理解MapReduce:从Map到Reduce的工作原理解析

当谈到分布式计算和大数据处理时&#xff0c;MapReduce是一个经典的范例。它是一种编程模型和处理框架&#xff0c;用于在大规模数据集上并行运行计算任务。MapReduce包含三个主要阶段&#xff1a;Map、Shuffle 和 Reduce。 ** Map 阶段 ** Map 阶段是 MapReduce 的第一步&am…

初始Java篇(JavaSE基础语法)(5)(类和对象(上))

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 面向对象的初步认知 面向对象与面向过程的区别 类的定义和使用 类的定义格式 类的实例化 this引用 什么是this引用&#xff1f; this引用…

六、Django开发

六、Django开发 1.新建项目2.创建app2.1 第一种方法&#xff1a;2.2 利用pycharm中tools工具直接创建app 3.设计表结构&#xff08;django&#xff09;4.在MySQL中生成表5.静态文件管理6.部门管理6.1 部门列表 7.模板的继承8.用户管理8.1初识Form1.views.py2.user_add.html 8.2…

数字乡村发展蓝图:科技赋能农村实现全面振兴

目录 一、数字乡村发展蓝图的内涵与目标 二、科技赋能农村&#xff1a;数字乡村发展的动力与路径 &#xff08;一&#xff09;加强农业科技创新&#xff0c;提升农业生产效率 &#xff08;二&#xff09;推进农村电商发展&#xff0c;拓宽农民增收渠道 &#xff08;三&…