开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

LVS原理培析 --视频

简介:
+关注继续查看

还有一个视频没做!


视频: LVS原理--煮酒品茶

视频: LVS-Nat实现

视频: LVS-Dr实现


讲解时文档:


LVS:声音要大一点!!!


1年内从2000涨到13000的成长经验分享:

http://oldboy.blog.51cto.com/2561410/1228397


主题要求:

1、为什么这么做?

2、这样操作会产生什么后果?

3、有没有更好的方案?


三种模式:

1、原理以及实现。

2、优、缺点。

3、每一项参数背后的意义以及为什么是这样子?

优化:

1、分析LVS各项模式的主要功能以及依赖点。

2、怎么去合理的优化它?

网络以及修改mac的能力也就是CPU的能力。

ulimit ?

syn?

1、监控数据,并对数据进行分析

写自己的监控脚本?nagios?cacti

keepalive

2、找到瓶颈

3、改善瓶颈

安全:

1、Lvs能有什么安全问题?

2、如何解决

LVS/NAT:

关键点:

--转发-- IP_froward :lvs

--网关-- gateway :realserver

--公网IP-- 与客服端能通信的IP,VIP :lvs

c--request-->LVS(LCR)[直接转发]>Web3....>LVS>c--send

lvs > +lvs

 +lvs

gateway:


实现:

1、开启转发

2、realserver设置网关地址

3、配置LVS的DIP和VIP(DIP是与realserver通信,VIP是也客户端通信)


网络拓朴:

在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器提供

相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。

服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系统(如NFS)共享,

也 可以通过一个分布式文件系统来提供。


原理:

客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,

请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,

将报文的目标地址 Virtual IP Address改写成选定服务器的地址,

报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。


LVS/TUN:

--封包--lvs

--拆包--realserver

--别名--realserver

--能上网--realserver

--抑制ARP--realserver

功劳老是领导的,送死的你去!


c--request-->LVS(WLC)>Web3....>LVS>c--send


c--request-->LVS(LCR)[封装报文]>Web3....>c--send

[封装报文]:

[src:老总,dec:王五(领导代言人的领导)

内容:[src:老总,dec:领导]

]

>>

[src:领导,dec:老总]


网络拓朴:

利用IP隧道技术将请求报文封装转发给后端服务器,响应报文能从后端服务器

直接返回给客户。但在这里,后端服务器有一组而非一个,所以我们不可能

静态地建立一一对应的隧道,而是动态地选择一台服务器,

将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理

将一组服务器上的网络服 务组成在一个IP地址上的虚拟网络服务。VS/TUN的

体系结构如图3.3所示,各个服务器将VIP地址配置在自己的

IP隧道设备上。

原理:

IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装

和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和

虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。


LVS/DR:

c--request-->LVS(LCR)[修改mac]>Web3....>c--send

[src:老总,dec:领导[身份证号](领导代言人的领导)]

[src:老总,dec:王五[身份证号](领导代言人的领导)]

包只认IP不认mac


--网关设置为路由--Route lvs/realserver

--修改mac--lvs

--别名--realserver

--能上网--realserver

--抑制ARP--realserver

--工作在LAN--$vip $vip与$rip是同一网段



网络拓朴:

调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间 没有隔有路由器。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,

用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在 各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。

原理:

它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标 服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,

而是将数据帧的MAC地址改为选出服务器的 MAC地址,再将修改后的数据帧在与在服务器组的局域网上发送。

因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该 IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,

然后根据路由表将响应报文直接返回给客户。


三种模式优缺点:


VS/NAT VS/TUN VS/DR

Server any Tunneling Non-arp device

servernetwork private LAN/WAN LAN

server number low (10~20) High (100) High (100)

server gateway load balancer own router Own router


十种调度方法:

轮叫调度(Round-Robin Scheduling)

加权轮叫调度(Weighted Round-Robin Scheduling)

最小连接调度(Least-Connection Scheduling)

加权最小连接调度(Weighted Least-Connection Scheduling)

基于局部性的最少链接(Locality-Based Least Connections Scheduling)

带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)

目标地址散列调度(Destination Hashing Scheduling)

源地址散列调度(Source Hashing Scheduling)

最短预期延时调度(Shortest Expected Delay Scheduling)

不排队调度(Never Queue Scheduling)


轮叫调度算法流程


假设有一组服务器S = {S0, S1, …, Sn-1},一个指示变量i表示上一次选择的

服务器,W(Si)表示服务器Si的权值。变量i被初始化为n-1,其中n > 0。

S = {S0, S1, …, Sn-1}

200,100


1
2
3
4
5
6
7
8
9
j = i;
do {
j = (j + 1) mod n;
if (W(Sj) > 0) {
i = j;
return Si;
}
while (j != i);
return NULL;



加权最小连接调度(Weighted Least-Connection Scheduling)

算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权 值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。加权最小连接调度的算法流程如下:

加权最小连接调度的算法流程


假设有一组服务器S = {S0, S1, ..., Sn-1},W(Si)表示服务器Si的权值,

C(Si)表示服务器Si的当前连接数。所有服务器当前连接数的总和为

CSUM = ΣC(Si)  (i=0, 1, .. , n-1)。当前的新连接请求会被发送服务器Sm,

当且仅当服务器Sm满足以下条件

 (C(Sm) / CSUM)/ W(Sm) = min { (C(Si) / CSUM) / W(Si)}  (i=0, 1, . , n-1)

 其中W(Si)不为零

因为CSUM在这一轮查找中是个常数,所以判断条件可以简化为

 C(Sm) / W(Sm) = min { C(Si) / W(Si)}  (i=0, 1, . , n-1)

 其中W(Si)不为零


因为除法所需的CPU周期比乘法多,且在Linux内核中不允许浮点除法,服务器的

权值都大于零,所以判断条件C(Sm) / W(Sm) > C(Si) / W(Si) 可以进一步优化

为C(Sm)*W(Si) > C(Si)* W(Sm)。同时保证服务器的权值为零时,服务器不被调

度。所以,算法只要执行以下流程。


1
2
3
4
5
6
7
8
9
10
for (m = 0; m < n; m++) {
if (W(Sm) > 0) {
for (i = m+1; i < n; i++) {
if (C(Sm)*W(Si) > C(Si)*W(Sm))
m = i;
}
return Sm;
}
}
return NULL;



NAT实现:

yum install -y ipvsadm

转发:ip_forward


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[root@LvsM-210 ~]# ipvsadm --help
ipvsadm v1.25 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -a|e -t|u|f service-address -r server-address [options]
  ipvsadm -d -t|u|f service-address -r server-address
  ipvsadm -L|l [options]
  ipvsadm -Z [-t|u|f service-address]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h
Commands:
Either long or short options are allowed.
  --add-service     -A        add virtual service with options
  --edit-service    -E        edit virtual service with options
  --delete-service  -D        delete virtual service
  --clear           -C        clear the whole table
  --restore         -R        restore rules from stdin
  --save            -S        save rules to stdout
  --add-server      -a        add real server with options
  --edit-server     -e        edit real server with options
  --delete-server   -d        delete real server
  --list            -L|-l     list the table
  --zero            -Z        zero counters in a service or all services
  --set tcp tcpfin udp        set connection timeout values
  --start-daemon              start connection sync daemon
  --stop-daemon               stop connection sync daemon
  --help            -h        display this help message
Options:
  --tcp-service  -t service-address   service-address is host[:port]
  --udp-service  -u service-address   service-address is host[:port]
  --fwmark-service  -f fwmark         fwmark is an integer greater than zero
  --ipv6         -6                   fwmark entry uses IPv6
  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
                                      the default scheduler is wlc.
  --persistent   -p [timeout]         persistent service
  --netmask      -M netmask           persistent granularity mask
  --real-server  -r server-address    server-address is host (and port)
  --gatewaying   -g                   gatewaying (direct routing) (default)
  --ipip         -i                   ipip encapsulation (tunneling)
  --masquerading -m                   masquerading (NAT)
  --weight       -w weight            capacity of real server
  --u-threshold  -x uthreshold        upper threshold of connections
  --l-threshold  -y lthreshold        lower threshold of connections
  --mcast-interface interface         multicast interface for connection sync
  --syncid sid                        syncid for connection sync (default=255)
  --connection   -c                   output of current IPVS connections
  --timeout                           output of timeout (tcp tcpfin udp)
  --daemon                            output of daemon information
  --stats                             output of statistics information
  --rate                              output of rate information
  --exact                             expand numbers (display exact values)
  --thresholds                        output of thresholds information
  --persistent-conn                   output of persistent connection info
  --nosort                            disable sorting output of service/server entries
  --sort                              does nothing, for backwards compatibility
  --ops          -O                   one-packet scheduling
  --numeric      -n                   numeric output of addresses and ports




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[root@LvsM-210 ~]# tcpdump host 192.168.200.210
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
13:08:54.611712 ARP, Request who-has 192.168.200.210 tell 192.168.200.252, length 46
13:08:54.611721 ARP, Reply 192.168.200.210 is-at 00:0c:29:43:51:67 (oui Unknown), length 46
13:08:54.611722 IP 192.168.200.252.54220 > 192.168.200.210.http: Flags [S], seq 2132979503, win 8192, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.613181 IP 192.168.200.252.54221 > 192.168.200.210.http: Flags [S], seq 3609617850, win 8192, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.615255 IP 192.168.200.210.http > 192.168.200.252.54220: Flags [S.], seq 1291352581, ack 2132979504, win 14600, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.615261 IP 192.168.200.252.54220 > 192.168.200.210.http: Flags [.], ack 1, win 64240, length 0
13:08:54.615281 IP 192.168.200.210.http > 192.168.200.252.54221: Flags [S.], seq 1748737085, ack 3609617851, win 14600, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.615283 IP 192.168.200.252.54221 > 192.168.200.210.http: Flags [.], ack 1, win 64240, length 0
13:08:54.617060 IP 192.168.200.252.54220 > 192.168.200.210.http: Flags [P.], seq 1:357, ack 1, win 64240, length 356
13:08:54.617462 IP 192.168.200.210.http > 192.168.200.252.54220: Flags [.], ack 357, win 15544, length 0
13:08:54.618478 IP 192.168.200.210.http > 192.168.200.252.54220: Flags [P.], seq 1:274, ack 357, win 15544, length 273
13:08:54.618483 IP 192.168.200.210.http > 192.168.200.252.54220: Flags [F.], seq 274, ack 357, win 15544, length 0
13:08:54.618484 IP 192.168.200.252.54220 > 192.168.200.210.http: Flags [.], ack 275, win 63967, length 0
13:08:54.619010 IP 192.168.200.252.54220 > 192.168.200.210.http: Flags [F.], seq 357, ack 275, win 63967, length 0
13:08:54.619251 IP 192.168.200.210.http > 192.168.200.252.54220: Flags [.], ack 358, win 15544, length 0
13:08:54.631314 IP 192.168.200.252.54221 > 192.168.200.210.http: Flags [P.], seq 1:282, ack 1, win 64240, length 281
13:08:54.631605 IP 192.168.200.210.http > 192.168.200.252.54221: Flags [.], ack 282, win 15544, length 0
13:08:54.632418 IP 192.168.200.210.http > 192.168.200.252.54221: Flags [P.], seq 1:471, ack 282, win 15544, length 470
13:08:54.632645 IP 192.168.200.210.http > 192.168.200.252.54221: Flags [F.], seq 471, ack 282, win 15544, length 0
13:08:54.632648 IP 192.168.200.252.54221 > 192.168.200.210.http: Flags [.], ack 472, win 63770, length 0
13:08:54.633179 IP 192.168.200.252.54221 > 192.168.200.210.http: Flags [F.], seq 282, ack 472, win 63770, length 0
13:08:54.633429 IP 192.168.200.210.http > 192.168.200.252.54221: Flags [.], ack 283, win 15544, length 0
13:08:59.614192 ARP, Request who-has 192.168.200.252 tell 192.168.200.210, length 46
13:08:59.614197 ARP, Reply 192.168.200.252 is-at 94:db:c9:a3:e3:91 (oui Unknown), length 46
[root@LvsM-210 ~]# tcpdump host 192.168.100.220
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
13:08:26.284219 ARP, Request who-has 192.168.100.220 tell 192.168.100.252, length 46
13:08:26.284231 ARP, Reply 192.168.100.220 is-at 00:0c:29:3f:8c:c8 (oui Unknown), length 46
13:08:26.284233 IP 192.168.100.252.53292 > 192.168.100.220.ssh: Flags [P.], seq 629031122:629031158, ack 4017033140, win 63244, length 36
13:08:26.324217 IP 192.168.100.220.ssh > 192.168.100.252.53292: Flags [.], ack 36, win 16928, length 0
13:08:54.611647 IP 192.168.200.252.54220 > 192.168.100.220.http: Flags [S], seq 2132979503, win 8192, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.613125 IP 192.168.200.252.54221 > 192.168.100.220.http: Flags [S], seq 3609617850, win 8192, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.614799 IP 192.168.100.220.http > 192.168.200.252.54220: Flags [S.], seq 1291352581, ack 2132979504, win 14600, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.615099 IP 192.168.100.220.http > 192.168.200.252.54221: Flags [S.], seq 1748737085, ack 3609617851, win 14600, options [mss 1460,nop,nop,sackOK], length 0
13:08:54.615308 IP 192.168.200.252.54220 > 192.168.100.220.http: Flags [.], ack 1, win 64240, length 0
13:08:54.615336 IP 192.168.200.252.54221 > 192.168.100.220.http: Flags [.], ack 1, win 64240, length 0
13:08:54.617021 IP 192.168.200.252.54220 > 192.168.100.220.http: Flags [P.], seq 1:357, ack 1, win 64240, length 356
13:08:54.617342 IP 192.168.100.220.http > 192.168.200.252.54220: Flags [.], ack 357, win 15544, length 0
13:08:54.618251 IP 192.168.100.220.http > 192.168.200.252.54220: Flags [P.], seq 1:274, ack 357, win 15544, length 273
13:08:54.618357 IP 192.168.100.220.http > 192.168.200.252.54220: Flags [F.], seq 274, ack 357, win 15544, length 0
13:08:54.618514 IP 192.168.200.252.54220 > 192.168.100.220.http: Flags [.], ack 275, win 63967, length 0
13:08:54.618977 IP 192.168.200.252.54220 > 192.168.100.220.http: Flags [F.], seq 357, ack 275, win 63967, length 0
13:08:54.619156 IP 192.168.100.220.http > 192.168.200.252.54220: Flags [.], ack 358, win 15544, length 0
13:08:54.631265 IP 192.168.200.252.54221 > 192.168.100.220.http: Flags [P.], seq 1:282, ack 1, win 64240, length 281
13:08:54.631492 IP 192.168.100.220.http > 192.168.200.252.54221: Flags [.], ack 282, win 15544, length 0
13:08:54.632306 IP 192.168.100.220.http > 192.168.200.252.54221: Flags [P.], seq 1:471, ack 282, win 15544, length 470
13:08:54.632460 IP 192.168.100.220.http > 192.168.200.252.54221: Flags [F.], seq 471, ack 282, win 15544, length 0
13:08:54.632679 IP 192.168.200.252.54221 > 192.168.100.220.http: Flags [.], ack 472, win 63770, length 0
13:08:54.633148 IP 192.168.200.252.54221 > 192.168.100.220.http: Flags [F.], seq 282, ack 472, win 63770, length 0
13:08:54.633330 IP 192.168.100.220.http > 192.168.200.252.54221: Flags [.], ack 283, win 15544, length 0
13:08:59.611085 ARP, Request who-has 192.168.100.220 tell 192.168.100.210, length 28
13:08:59.611349 ARP, Reply 192.168.100.220 is-at 00:0c:29:3f:8c:c8 (oui Unknown), length 46
13:09:26.294085 IP 192.168.100.252.53292 > 192.168.100.220.ssh: Flags [P.], seq 36:72, ack 1, win 63244, length 36
13:09:26.294168 IP 192.168.100.220.ssh > 192.168.100.252.53292: Flags [.], ack 72, win 16928, length 0


1
2
3
4
5
6
7
C-request>lvs
13:08:54.611722 IP 192.168.200.252.54220 > 192.168.200.210.http: Flags [S], seq 2132979503, win 8192, options [mss 1460,nop,nop,sackOK], length 0
--/
修改ip,port [src,dest]:port
--/
$vip>realserver
13:08:54.611647 IP 192.168.200.252.54220 > 192.168.100.220.http: Flags [S], seq 2132979503, win 8192, options [mss 1460,nop,nop,sackOK], length 0




本文转自 煮酒品茶 51CTO博客,原文链接:http://blog.51cto.com/cwtea/1236122,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
备战大厂,彻底搞懂垃圾回收机制底层原理
通过前面的学习我们知道,当一个网页运行时,浏览器会给网页分配一段连续的内存空间以供网页使用。 并且通过使用方式的不同,内存空间会被分为栈内存与堆内存。栈内存只用于管理函数的执行顺序,堆内存用于存储其他所有对象。 我们还知道,程序的运行过程中,会使用内存。而内存空间是有限的,因此,内存空间的重复利用就变得非常重要。垃圾回收的概念也因此而生。 在学习垃圾回收机制之前,我们明确几个概念。
80 0
Java并发机制的底层实现原理
Java并发机制的底层实现原理
92 0
java课程(54G)2019全套学习视频免费分享
对比了很多网上的java学习视频,传智钟老师上的很有意思,不像其它很多视频单纯是在读ppt,适合基础薄弱的人从0开始学,不过要是有点的基础的也可以2倍速度学习,其中一些小练习还是很不错的
90 0
【最佳实践】通过Terraform 管理OSS资源
1.Terraform简介    Terraform 是一个开源的自动化的资源编排工具,支持多家云服务提供商。阿里云作为第三大云服务提供商,terraform-alicloud-provider 已经支持了超过 90 多个 Resource 和 Data Source,覆盖20多个服务和产品,吸引了越来越多的开发者加入到阿里云Terraform生态的建设中。
3557 0
java中迭代器的原理图解和源码浅析
a:迭代器为什么定义了一个接口而不是实现类?   假如把迭代器定义为一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历了。   但是,java中提供了很多的集合类,而这些集合类的数据结构是不同,所以它们的存储方法也是不同的,   进而它们的遍历方法也是不一样的,最终就没有把迭代器定义为一个类了。
2005 0
LVS原理讲解
一、lvs介绍 LVS的英文全名为“Linux Virtual Server”,即Linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统。
1022 0
Java ArrayDeque工作原理及实现
http://yikun.github.io/2015/04/11/Java-ArrayDeque%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/ ...
797 0
java的动态代理原理
之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白。比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了。     废话不多说了,先来看一下JDK的动态是怎么用的。
1256 0
JS拖动层的实现原理
解决思路      这个效果并不算常见,通常用于游戏或个人站点中。因为拖曳是靠鼠标来操作的,所以对鼠标的位置的捕获是问题的重点,然后才是根据鼠标的位置设置层的位置。 具体步骤: 1.在对象(层)上按下鼠标时,先捕获到需要拖曳的对象,然后获取或设置该对象的相关属性。
1357 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Patroni原理分享
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载