LVS NAT 模式:

Summary:

普通的NAT模式为DNAT,即只更改目的地址,不改源端口。

LVS在转发报文时,将Client的源IP透传给Server,类似于透明传输。

优点:

1. 可提供从不同源地址访问的访问。

2. RS不占用公网IP。

3. 可以更改访问目的地址的端口,DR及Tun模式不可以。

缺点:

1. 因为将Client IP透传给Server,为了不使Server受到攻击,前面要放个防火墙。

2. 配置比较复杂,每次添加,删除 VIP,RS,都需要将RS的网关指向LVS。当大范围部署时,需要更改多次RS,维护成本会计较高,如果达不到自动化运维的程度,维护起来比较容易出错。

3. 性能不及DR和Tun模式。

与APV优缺点比较:

1. Array APV支持FullNAT模式:

只有在最新版的LVS中才支持FullNAT模式,但是用户目前拿不到最新版的LVS。

  1. NAT模式类似于Array的透明传输。

工作过程:

1> client发送request到LVS的VIP上,VIP选择一个Real-server,并记录连接信息到hash表中,然后修改client的request的目的IP地址为Real-server的地址,将请求发给Real-server;

2> Real-server收到request包后,发现目的IP是自己的IP,于是处理请求,然后发送reply给LVS;

3> LVS收到reply包后,修改reply包的的源地址为VIP,发送给client;

4> 从client来的属于本次连接的包,查hash表,然后发给对应的Real-server。

5> 当client发送完毕,此次连接结束或者连接超时,那么LVS自动从hash表中删除此条记录。

LVS DR 模式:

Summary:

DR模式是效率最高的一种,对于每个请求LVS把目的mac改成从RS中选择的机器的mac,再将修改后的数据帧在与服务器组的局域网上发送。

但是局限性是LVS机器需要和RS至少能有一个网卡同在一个VLAN下面,这样限制了DR模式只能在比较单一的网络拓扑下使用。

优点:

1. 响应报文直接从后端服务器返回给客户,吞吐量同TUN模式差不多,或更高

缺点:

1. 真实服务器需要同负载调度器在同一个网段

2. 需要为每个后台服务器配置一个公网IP,占用公网IP多。

3. 服务器暴露在外,不安全。

与APV优缺点比较:

1. 类似于APV的三角传输模式。

2. APV可以将RS保护在后台,LVS的RS会暴露在外面。

3. APV: 客户端,APV,RS可以在不通网段;

LVS: 客户端,LVS,RS都要在同一网段。

4. 由于DR的模式设计,LVS的性能可能会比APV要高。

工作过程:

当一个client发送一个WEB请求到VIP,LVS服务器根据VIP选择对应的real-server的Pool,根据算法,在Pool中选择一台Real-server,LVS在hash表中记录该次连接,

然后将client的请求包发给选择的Real-server,最后选择的Real-server把应答包直接传给client;当client继续发包过来时,LVS根据更才记录的hash表的信息,

将属于此次连接的请求直接发到刚才选择的Real-server上;当连接中止或者超时,hash表中的记录将被删除。

1,Linux Director 负载调度器

1 ifconfig eth0 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0 up

2 ifconfig eth0:0 192.168.1.3 netmask 255.255.255.255 up

3 route add -host 192.168.1.3 dev eth0:0

2,创建 ipvs.sh 脚本,并执行

#!/bin/bash

#ipvs.sh

1. ipvsadm -C

2. ipvsadm -A -t 192.168.1.3:80 -s rr

3. ipvsadm -a -t 192.168.1.3:80 -r 192.168.1.4:80 -g

4. ipvsadm -a -t 192.168.1.3:80 -r 192.168.1.5:80 -g

3,配置 Real Server 真实服务器(192.168.1.4)

1. ifconfig eth0 192.168.1.4 broadcast 192.168.1.255 netmask 255.255.255.0 up

2. ifconfig lo:0 192.168.1.3 netmask 255.255.255.255 up

3. route add -host 192.168.1.3 dev lo:0

4,创建 arp.sh脚本,并执行

#!/bin/bash

#arp.sh

1. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

2. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

3. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

4. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

5,配置 Real Server 真实服务器(192.168.1.5)

1. ifconfig eth0 192.168.1.5 broadcast 192.168.1.255 netmask 255.255.255.0 up

2. ifconfig lo:0 192.168.1.3 netmask 255.255.255.255 up

3. route add -host 192.168.1.3 dev lo:0

6,创建 arp.sh 脚本,并执行

#!/bin/bash

#arp.sh

1. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

2. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

3. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

4. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

LVS TUNNEL 模式:

Summary:

采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。

为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。

真实的服务器将响应处理后的数据直接返回给客户端。

这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,

集群系统的最大吞吐量可以提高10倍。

优点:

1. 由于通过IP Tunneling 封装后,封装后的IP包的目的地址为Real-server的IP地址,

那么只要Real-server的地址能路由可达,Real-server在什么网络里都可以,这样可以减少对于公网IP地址的消耗。

缺点:

因为要处理IP Tunneling封装和解封装的开销,那么效率不如DR模式。

与APV优缺点比较:

1. 类似于APV的三角传输模式。

2. APV可以将RS保护在后台,LVS的RS会暴露在外面。

3. 由于DR的模式设计,LVS的性能可能会比APV要高。

工作过程:

1)客户请求数据包,目标地址VIP发送到LB上。

2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。

3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。

4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。

1,Linux Director 负载调度器

1 ifconfig eth0 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0 up

2 ifconfig eth0:0 192.168.1.3 netmask 255.255.255.255 up

3 route add -host 192.168.1.3 dev eth0:0

2,创建 ipvs.sh 脚本,并执行

#!/bin/bash

#ipvs.sh

1. ipvsadm -C

2. ipvsadm -A -t 192.168.1.3:80 -s rr

3. ipvsadm -a -t 192.168.1.3:80 -r 192.168.1.4:80 -g

4. ipvsadm -a -t 192.168.1.3:80 -r 192.168.1.5:80 -g

3,配置 Real Server 真实服务器(192.168.1.4)

1. ifconfig eth0 192.168.1.4 broadcast 192.168.1.255 netmask 255.255.255.0 up

2. ifconfig lo:0 192.168.1.3 netmask 255.255.255.255 up

3. route add -host 192.168.1.3 dev lo:0

4,创建 arp.sh脚本,并执行

#!/bin/bash

#arp.sh

1. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

2. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

3. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

4. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

5,配置 Real Server 真实服务器(192.168.1.5)

1. ifconfig eth0 192.168.1.5 broadcast 192.168.1.255 netmask 255.255.255.0 up

2. ifconfig lo:0 192.168.1.3 netmask 255.255.255.255 up

3. route add -host 192.168.1.3 dev lo:0

6,创建 arp.sh 脚本,并执行

#!/bin/bash

#arp.sh

1. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

2. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

3. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

4. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[LVS] NAT mode with RR method.

1. Summary;

NAT模式下,LVS RR method配置方式,测试结果。

与APV优缺点:

RR算法与APV的RR算法基本一致,没有特殊区别。

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s rr

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80 -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80 -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

/usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

/usr/local/nginx/sbin/nginx

On Client:

1. 执行 wget http://11.11.11.12. 多次。

2. 在LVS上,执行ipvsadm -L -n --stats 查看SLB 统计信息。

------------------------------------------------

[Expected result]:

每个RS的访问次数应该相等。

[root@RHEL6 ipv4]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                     12       66       43     4799     5701

-> 22.22.22.23:80                      6       33       23     2544     3086

-> 22.22.22.24:80                      6       33       20     2255     2615

--------------------------------------------------------------

[Topo]

client: IP:11.11.11.11

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

------------------------

| |

| |

| |

nginx1   nginx2

IP:22.22.22.23   IP: 22.22.22.24

[LVS] NAT mode with RR method.

1. Summary;

NAT模式下,LVS RR method配置方式,测试结果。

与APV优缺点:

LVS的WRR与APV的RR+group weight基本一致。

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s wrr

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80 -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80 -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 执行 wget http://11.11.11.12. 多次。

2. 在LVS上,执行ipvsadm -L -n --stats 查看SLB 统计信息。

------------------------------------------------

[Expected result]:

每个RS的访问次数应该相等。

[root@RHEL6 ipv4]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                     12       66       43     4799     5701

-> 22.22.22.23:80                      6       33       23     2544     3086

-> 22.22.22.24:80                      6       33       20     2255     2615

--------------------------------------------------------------

[Topo]

client: IP:11.11.11.11

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

------------------------

| |

| |

| |

nginx1   nginx2

IP:22.22.22.23   IP: 22.22.22.24

[LVS] NAT mode with LC method.

1. Summary;

NAT模式下,LVS LC method配置方式,测试结果。

与APV优缺点:

1. LVS的LC算法与APV的LC算法稍有差别。

2. LVS的LC没有“颗粒度”概念,只是简单的看哪个RS的连接数少,就将请求转到哪个RS上。

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s lc

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80  -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80  -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 启动2台client,执行 "telnet 11.11.11.12 80" 多次。 基数次访问用client1, 偶数次访问用client2. 目的是为了保证client1的请求全部在RS1上,client2的请求全部在RS2上。

2. 在client1上,执行pkill -9 telnet. 将client1与RS1的连接全部断开。

3. 这时,在LVS统计中,可以看到,只有RS2的连接。

4. 在client1上,多次执行"telnet 11.11.11.12 80"。

5. 在LVS上,观察RS访问状态。

------------------------------------------------

[Expected result]:

由于RS2的连接数大于RS1的连接数。所以,client1的全部请求,都应该hit到RS1上。此为LC算法的目的.

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http lc

-> 22.22.22.23:http             Masq    1      10         20

-> 22.22.22.24:http             Masq    1      10         20

TCP  11.11.11.13:http rr

-> 22.22.22.23:http             Masq    1      0          0

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http lc

-> 22.22.22.23:http             Masq    1      10         20

-> 22.22.22.24:http             Masq    1      0          30

TCP  11.11.11.13:http rr

-> 22.22.22.23:http             Masq    1      0          0

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http lc

-> 22.22.22.23:http             Masq    1      10         20

-> 22.22.22.24:http             Masq    1      6          30

TCP  11.11.11.13:http rr

-> 22.22.22.23:http             Masq    1      0          0

--------------------------------------------------------------

[Topo]

两个client: IP:11.11.11.11/11.11.11.2

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

------------------------

| |

| |

| |

nginx1   nginx2

IP:22.22.22.23   IP: 22.22.22.24

[LVS] NAT mode with WLC method.

1. Summary;

NAT模式下,LVS WLC method配置方式,测试结果。

与APV优缺点:

WLC与LC基本一致,区别在于Weight。 如设置两个RS1,RS2,weight值为10和5:

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80 -w 5 -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80 -w 10 -m

请求会按照5:10的比例分配到RS1和RS2上,当RS上的连接数小于5:10的关系时,会将后续的请求分配到连接数低的RS上,直到连接数比例达到5:10.

此后将会继续按照5:10的比例分配连接。

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s wlc

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80 -w 5 -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80 -w 10 -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 启动2台client,执行 "telnet 11.11.11.12 80" 多次。 基数次访问用client1, 偶数次访问用client2. 目的是为了保证client1的请求全部在RS1上,client2的请求全部在RS2上。

2. 在client1上,执行pkill -9 telnet. 将client1与RS1的连接全部断开。

3. 这时,在LVS统计中,可以看到,只有RS2的连接。

4. 在client1上,多次执行"telnet 11.11.11.12 80"。

5. 在LVS上,观察RS访问状态。

------------------------------------------------

[Expected result]:

@step5: 由于RS2的连接数大于RS1的连接数。所以,client1的全部请求,都应该hit到RS1上。此为LC算法的目的.

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http lc

-> 22.22.22.23:http             Masq    1      10         20

-> 22.22.22.24:http             Masq    1      10         20

TCP  11.11.11.13:http rr

-> 22.22.22.23:http             Masq    1      0          0

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http lc

-> 22.22.22.23:http             Masq    1      10         20

-> 22.22.22.24:http             Masq    1      0          30

TCP  11.11.11.13:http rr

-> 22.22.22.23:http             Masq    1      0          0

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http lc

-> 22.22.22.23:http             Masq    1      10         20

-> 22.22.22.24:http             Masq    1      6          30

TCP  11.11.11.13:http rr

-> 22.22.22.23:http             Masq    1      0          0

--------------------------------------------------------------

[Topo]

两个client: IP:11.11.11.11/11.11.11.2

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

------------------------

| |

| |

| |

nginx1   nginx2

IP:22.22.22.23   IP: 22.22.22.24

[LVS] DH method.

1. Summary;

DH算法通过Hash 目的IP,将相同目的IP的请求都分配到某一台RS上。

如果是NAT模式,因为所有client都向同一VIP请求,所以即使后台有多个RS,LVS也都会将请求分配到其中1台RS上。

DH算法主要是工作在有Cache服务器的透明传输模式中。目的是保持后续的请求都hit到同一RS上。

Internet

|

|------cache array

|

|-----------------------------

|                |

DH               DH

|                |

Access            Access

Network1          Network2

参考文档:

http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.ipvsadm.html#DH

与APV优缺点:

1. APV不支持哈希目标地址算法

2. 对于在Cache集群服务器使用场景下,APV的算法支持可能有所不足。

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s dh

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80  -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80  -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 启动2台client,在client1上多次访问vip。

2. 在client2上多次访问vip。

------------------------------------------------

[Expected result]:

访问同一VIP的请求将会全部分配到某一台RS上。

[root@RHEL6 vs]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                     16       38       22     2104     1272

-> 22.22.22.23:80                      0        0        0        0        0

-> 22.22.22.24:80                     16       38       22     2104     1272

[root@RHEL6 vs]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                     39       94       55     5200     3172

-> 22.22.22.23:80                      0        0        0        0        0

-> 22.22.22.24:80                     39       94       55     5200     3172

--------------------------------------------------------------

[Topo]

两个client: IP:11.11.11.11/11.11.11.2

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

------------------------

| |

| |

| |

nginx1   nginx2

IP:22.22.22.23   IP: 22.22.22.24

[LVS] NAT mode with SH method.

1. Summary;

NAT模式下,LVS SH method配置方式,测试结果。

与APV优缺点:

1. 可以设置哈希IP位数。

2. 对保持有特殊需求的用户,有增强的HIP,CHI算法.

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s sh

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80  -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80  -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 启动2台client,在client1上多次访问vip。

2. 在client2上多次访问vip。

------------------------------------------------

[Expected result]:

从同一个Client发出的请求将会全部分配到某一台RS上。

[root@RHEL6 vs]# ipvsadm -ln --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                      8       16        8      896      480

-> 22.22.22.23:80                      8       16        8      896      480

-> 22.22.22.24:80                      0        0        0        0        0

[root@RHEL6 vs]# ipvsadm -ln --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                     18       36       18     2016     1080

-> 22.22.22.23:80                      8       16        8      896      480

-> 22.22.22.24:80                     10       20       10     1120      600

--------------------------------------------------------------

[Topo]

两个client: IP:11.11.11.11/11.11.11.2

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

------------------------

| |

| |

| |

nginx1   nginx2

IP:22.22.22.23   IP: 22.22.22.24

[LVS] SED method.

1. Summary;

基于wlc算法,举例说明:

ABC三台机器权重分别为123,连接数也分别为123, 如果使用wlc算法的话,因为当前比例正好是1:2:3,所以新的请求会随机分给ABC中任意一个。

如果用SED算法,会进行这样一个运算:

A:(1+1)/1

B:(1+2)/2

C:(1+3)/3

根据计算结果,会把请求分配给C服务器上。

与APV优缺点:

1. LVS的SED算法与APV的LC算法稍有差别。

2. LVS的SED没有“颗粒度”概念,而是采用上面的算法,选择一个权重最大的RS。

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s sed

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80  -w 1 -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80  -w 2 -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.25:80  -w 3 -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 保证三台服务器上的连接数分别为123.

2. 再新建一条连接,看LVS会将请求分配个哪个RS.

------------------------------------------------

[Expected result]:

将会分配给22.22.22.25这个RS上。

--------------------------------------------------------------

[Topo] -- Pasted as attachment

两个client: IP:11.11.11.11/11.11.11.2

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

---------------------------------------------------

| |   |

| |   |

| |   |

nginx1   nginx2 nginx3

IP:22.22.22.23   IP: 22.22.22.24   IP:22.22.22.25

[LVS] NQ method.

1. Summary;

无需队列,如果有台RS的连接数=0,就直接分配过去,不需要进行SED运算。

与APV优缺点:

1. APV没有NQ算法。

2. NQ也是LC算法的一种,相比较SED算法,NQ的处理会快一些。

3. 使用场景应该不多。

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s nq

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80 -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80 -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 保证两台RS上各有5个连接。

2. 断开RS2上的所有连接。

3. 再次访问VIP,查看LVS与哪个RS建立连接。

------------------------------------------------

[Expected result]:

LVS将会与RS2建立连接。

如果RS1和RS2连接数都不为0,则按照SED算法分配连接。

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http nq

-> 22.22.22.23:http             Masq    1      5          0

-> 22.22.22.24:http             Masq    1      5          0

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http nq

-> 22.22.22.23:http             Masq    1      5          0

-> 22.22.22.24:http             Masq    1      0          5

[root@RHEL6 vs]# ipvsadm

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  11.11.11.12:http nq

-> 22.22.22.23:http             Masq    1      5          0

-> 22.22.22.24:http             Masq    1      2          5

--------------------------------------------------------------

[Topo]

两个client: IP:11.11.11.11/11.11.11.2

|

|

LVS:  VIP:11.11.11.12

|

|

| IP:22.22.22.22

----------------------------------

| |   |

| |   |

| |   |

nginx1   nginx2 nginx3

IP:22.22.22.23   IP: 22.22.22.24   IP:22.22.22.25

[LVS] LBLC LBLCR

1. Summary;

lblc 基于局部性的最少链接(Locality-Based Least Connections):“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP 地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的 工作负载,则用”最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。

lblcr 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication):”带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法 的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找 出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连 接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服 务器组中删除,以降低复制的程度。

与APV优缺点:

1. APV没有类似于LBLC,LBLCR的算法。

2. 这两种算法主要应用于Cache集群环境中,在此场景中,APV的算法支持可能有所不足。

参考文档:

http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.ipvsadm.html#DH

--------------------------------------------------------------

[Test Steps]

On LVS:

1. echo "1" >/proc/sys/net/ipv4/ip_forward

//参数值为1时启用ip转发,为0时禁止ip转发,在NAT模式下此操作是必须的。

2.

ipvsadm -C

ipvsadm -A -t 11.11.11.12:80 -s sh

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.23:80  -m

ipvsadm -a -t 11.11.11.12:80 -r 22.22.22.24:80  -m

//上面操作中,第一行是清除内核虚拟服务器列表中的所有记录,

//第二行是添加一条新的虚拟IP记录,同时指定采用轮询算法。

//第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS的工作模式为NAT模式。

//-g代表gateway,意思为直接路由,还可以有-i(internet)隧道模型,-m(masq)伪装,NAT模式

On Nginx Server:

1. 修改/usr/local/apache2/conf/httpd.conf,将 80端口改为8888.

2.启动Apache:

./usr/local/apache2/bin/apachectl start

3.修改/usr/local/nginx/conf/nginx.conf,将“upstream slbserver”改为:

upstream slbserver{

server 127.0.0.1:8888;

}

4. 将网关指向 LVS机器的IP。

5.启动Nginx:

./usr/local/nginx/sbin/nginx

On Client:

1. 启动2台client,在client1上多次访问vip。

2. 在client2上多次访问vip。

------------------------------------------------

[Expected result]:

从同一个Client发出的请求将会全部分配到某一台RS上。

[root@RHEL6 vs]# ipvsadm -ln --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                      8       16        8      896      480

-> 22.22.22.23:80                      8       16        8      896      480

-> 22.22.22.24:80                      0        0        0        0        0

[root@RHEL6 vs]# ipvsadm -ln --stats

IP Virtual Server version 1.2.1 (size=1048576)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  11.11.11.12:80                     18       36       18     2016     1080

-> 22.22.22.23:80                      8       16        8      896      480

-> 22.22.22.24:80                     10       20       10     1120      600

--------------------------------------------------------------

[Topo]

Internet

|

|------cache array

|

|-----------------------------

|                |

DH               DH

|                  |

Access            Access

Network1          Network2

LVS Mode&Method的更多相关文章

  1. Lvs之NAT、DR、TUN三种模式的应用配置案例

    LVS 一.LVS简介     LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的 ...

  2. 3、使用keepalived高可用LVS实例演示

    回顾: keepalived: vrrp协议的实现: 虚拟路由器: MASTER,BACKUP VI:Virtual Instance keepalived.conf GLOBAL VRRP LVS ...

  3. LVS的调度算法

    LVS的调度算法(Scheduling Method)一共有10种 一.静态方法:仅根据算法本身进行调度 1.rr(Round Robin):轮询 2.wrr(Werghted Round Robin ...

  4. LVS安装使用详解

    简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org. ...

  5. linux服务之lvs

    开发语言: 服务器端:在内核中实现,无守护程序 客户端:一般是cli界面下的ipvsadm命令 相关包:ipvsadm 在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS.基于 ...

  6. LVS Nginx HAProxy 优缺点

    搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍. 目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LV ...

  7. lvs学习笔记

    本人身为一个网工,最近一直在工作中学习linux的相关知识.前短时间通过自查资料学习了lvs的相关内容,摘录部分整理后和大家分享,内容较多,较琐碎,望见谅!!! LVS 从Linux内核版本2.6起, ...

  8. LVS初始使用步骤

    LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org. 现在L ...

  9. LVS之NAT和DR服务脚本

    NAT服务控制脚本 #!/bin/bash # # chkconfig: - 88 12 # description: LVS script for VS/NAT # . /etc/rc.d/init ...

随机推荐

  1. 黑马基础阶段测试题:创建Phone(手机)类,Phone类中包含以下内容:

    package com.swift; public class Phone { private String pinpai; private int dianliang; public String ...

  2. 1072: [SCOI2007]排列perm

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3000  Solved: 1875[Submit][Status][Discuss] Descript ...

  3. python 实现无序列表

    # -*- coding:utf-8 -*- class Node: def __init__(self, initdata): self.data = initdata self.next = No ...

  4. 16.1-Jenkins持续集成01—Jenkins服务搭建和部署

    分类: Linux架构篇   一.介绍Jenkins 1.Jenkins概念 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何 ...

  5. Python循环的一些基本练习

    #1:# name = input('请输入你的身份')# if name == 'egon':# print('--> 超级管理员')# elif name == 'tom':# print( ...

  6. 【工具】Sublime Text 自动保存功能

    经常需要所以要频繁用到"ctrl+s"保存还是挺麻烦的,所以有的人需要用到失去焦点自动保存功能,这里简单记录下 1.点击"Preferences"里的设置-用户 ...

  7. 数据结构-单链表(Linked List)

    #include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 10 #define LISTINCREMENT 1 ...

  8. linux硬件基础

    1. 服务器分类 机架式服务器(主要用这个). 刀片式服务器. 塔式服务器. 2. 机架式服务器 服务器的尺: U - 2U. 服务器核心之电源: 双电源 AB 路. 服务器核心之 CPU-计算 CP ...

  9. Olympic Class Ships【奥林匹克级邮轮】

    Olympic Class Ships You probably know about the Titanic, but it was actually just noe of three state ...

  10. Tricky Sum

    In this problem you are to calculate the sum of all integers from 1 to n, but you should take all po ...