还有一个视频没做!
视频: 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
|