LVS NAT和DR模型

LVS :NATDR模型的详解

1      集群简介

当单台服务器没法支撑庞大业务的时候,这个时候就要考虑扩展服务器的性能。html

扩展有两种方式:前端

1)    scale on:向上扩展,立体式,如买更强大的服务器linux

a)    简单的说,单纯扩展服务器仍是不够的,根据木桶效应,整套东西的性能只能根据最低的环节来衡量;web

b)    服务器随着的性能的提高,价格愈来愈贵算法

2)    scale out:向外扩展,分布式,使用更多的服务器,也就是集群的方式了后端

 

事实上智能DNS也能够实现负载:缓存

1)    A记录:1个域名对应多个ip服务器

2)    dns是以这种轮询的方式来响应请求(常规状况),这是这种是不均匀的负载均衡,每一个人的请求是不一样的,并且缓存服务器的存在,大部分时间是会请求同台服务器网络

3)    DNS事实上是为了智能解析不一样地区的用户到最近的服务器并发

 

集群的主要做用就是为了提升并发处理能力,其所需的组件通常是前端的分发器,后端的服务器,也有可能单独包含health check检查设备。

 

LVS linux virtual server

1)    NAT:地址转换

2)    DR:直接路由

3)    TUN:隧道

几个名词的解释:

director:前端分发器

realserver:后端服务器,集群节点

VIPIPVS的前端IP,接收客户端服务请求的ip

DIP: director和服务器通讯的地址

RIP:服务器和director通讯的地址

CIP:客户端发起请求的地址

 

LVS介绍

LVSlinux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,能够再unix/linux平台下实现负载均衡集群功能。该项目在19985月由章文嵩博士组织成立。

如下是LVS官网提供的4篇文章:

http://www.linuxvirtualserver.org/zh/lvs1.html

http://www.linuxvirtualserver.org/zh/lvs2.html

http://www.linuxvirtualserver.org/zh/lvs3.html

http://www.linuxvirtualserver.org/zh/lvs4.html

 

clip_image001[7]

 

2      LVS使用详解

ipvs也是做为一个内核的功能的模块,ipvsadm是一个管理工具,并不是服务,这个能够类比iptables,其工做位置为用户空间/内核空间

iptables/netfilter

ipvsadm/ipvs

 

2.1    IPVS

IPVS工做在INPUT链上,其工做和netfilter不一样,所以,若是功能有冲突的话,切记不能同时使用。

IPVS在钩子函数(链上的数据流动状况):

                        PREROUTING(这里能够对数据作标记,在后面LVS持久链接会讲解)

                        INPUT:在这里识别了请求是集群服务,会对数据包作特殊处理(按照状况而定)

                        OUPUT

                        POSTROUTING

               不通过forward链,这个本人未证明。不过从上面可知,IPVS工做在INPUT链上面。

查看内核是否编译IPVS功能,linux内核2.6版本以后都包含了这个功能,内核自己就拥有的功能,所以和发行版没有关系

[root@director ~]# grep -i "vs" /boot/config-2.6.32-358.el6.i686

# IPVS scheduler#单独列出这个10种调度算法,其实还有其余,请自行查询

CONFIG_IP_VS_RR=m

CONFIG_IP_VS_WRR=m

CONFIG_IP_VS_LC=m

CONFIG_IP_VS_WLC=m

CONFIG_IP_VS_LBLC=m

CONFIG_IP_VS_LBLCR=m

CONFIG_IP_VS_DH=m

CONFIG_IP_VS_SH=m

CONFIG_IP_VS_SED=m

CONFIG_IP_VS_NQ=m

算法简介:

rr :轮询调度

wrr:加权轮询

sh:源地址做为关键字hash查找一个RS

dh: 目的地址做为关键字hash查找一个RS

lc:最小链接调度,ipvs会存储全部的活动链接

            active*256+inactive

wlc:加权的最小链接调度

            (active*256+inactive)/weight

LBLC:基于地址的最小链接请求调度:未来自同一个目的地址的请求分配给同一台RS,此时这台服务器是还没有满负荷的。不然就将这个请求分配给链接数最小的RS,并以它做为下一次分配的首先考虑。

sed: 最短时间望延迟,对wlc的改进,防止第一次选择了性能较差的主机处理

                        active+1)*256/weight

nqnq: never queue,对sed的改进,最开始每一个节点都发链接,以后再按照wlc来发

 

cache命中率和负载是相互背离,只能找到一个中和点

 

非活动链接数很是多的时候,得考虑inactive,所以wlc比较理想

默认方法:wlc

2.2    管理工具ipvsadm

安装管理工具ipvsadm

[root@director ~]# yum -y install ipvsadm

ipvsadm命令详解:

1)    管理集群服务

 

添加 –A  -t|u|f service-address –r server-address [-s scheduler]

                    -t tcp

                    -u udp

                    -f :防火墙标记,用于单独提供多个服务绑定使用

                    service-address:对外服务的套接字,ip:port

                    默认调度算法是wlc

   -w :权值,部分算法须要使用

修改 –E :使用同上

删除 –D –t|u|f service-address

# ipvsadm -A -t 172.16.100.1:80 -s rr

 

2)    管理集群服务的RS

 

添加 –a  -t|u|f service-address –r server-address [-g|i|m]  [-w weight]

                    -t tcp

                    -u udp

                    -f :防火墙标记,用于单独提供多个服务绑定使用

                    service-address:对外服务的套接字,ip:port

                    -g DR模型,默认

                    -m : NAT masuerading

                    -I : tun  ipip

   -w :权值,部分算法须要使用

修改 –e :使用同上

删除 –d  -t|u|-f service-address  -r server-address

 

# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m

                        # ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m

3)    查看集群服务

 

-L|l

                    -n:数字格式显示主机地址和端口

                    --stats:统计数据

            --rate:速率

                    --timeout:显示会话的超时时间

                    -c:显示当前IPVStcp链接状况

4)    集群的规则管理

-C:清空IPVS规则

-S 保存规则

        # ipvsadm –S > /path/to/somefile

-R:从新载入规则

        #ipvsadm –R </path/to/somefile

            service ipvsadm save 默认保存规则到 /etc/sysconfig/ipvsadm

 

如下的测试统一配置

RS1RS2安装服务telnet-server httpd,默认配置

    [root@RS1 ~]# echo RS1 > /var/www/html/index.html

[root@RS2 ~]# echo RS2 > /var/www/html/index.html

添加用户test 密码test

selinux关闭(影响实验,暂时关闭)

service iptables stop

因为高可用集群须要保证时间一致,所以能够将director配置为中继ntp服务器,realserver把经过director来更新时间.

3      NAT模型详解

NAT模型工做原理:

1)    集群节点必须和director在同一个IP网络中,通常都是内网地址

2)    集群节点的RIP必须把网关指向DIP

3)    director负责数据报文的转发,所以容易成为系统瓶颈,只适合小规模应用

4)    支持端口映射

 

示例1

clip_image002[7]

配置:

director上配置

ipvsadm –A  -t 192.168.80.250:80 –s rr

ipvsadm –a  –t 192.168.80.250:80 –r 172.16.100.2 –m

ipvsadm –a  –t 192.168.80.250:80 –r 172.16.100.3 -m

查看命令验证:

[root@localhost ~]# ipvsadm -L -c -n #查看链接

[root@localhost ~]# ipvsadm -L -n --stats #链接,数据包个数,字节总数

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  192.168.80.250:80                  42      154      138    12521    12241

  -> 172.16.100.2:80                    21       76       68     6182     6145

  -> 172.16.100.3:80                    21       78       70     6339     6096

[root@localhost ~]# ipvsadm -L -n --rate #查看上面三类数据的平均值(瞬时)

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS

  -> RemoteAddress:Port

TCP  192.168.80.250:80                   1        3        2      349      217

  -> 172.16.100.2:80                     0        1        1      169      113

  -> 172.16.100.3:80                     0        1        1      180      103

[root@localhost ~]# ipvsadm -L -n --timeout #查看 tcp tcpfin udp的超时退出时间

Timeout (tcp tcpfin udp): 900 120 300

 

http://192.168.80.250/ #切换是按照这个11的比例

 

演示规则的操做

 [root@localhost ~]# service ipvsadm save #保存规则

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]

[root@localhost ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.http #保存规则到单独位置

[root@localhost ~]# cat /etc/sysconfig/ipvsadm #查看规则表的信息

-A -t 192.168.80.250:80 -s rr

-a -t 192.168.80.250:80 -r 172.16.100.2:80 -m -w 1

-a -t 192.168.80.250:80 -r 172.16.100.3:80 -m -w 2

[root@localhost ~]# ipvsadm -C #清空规则表

[root@localhost ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.http  #从新载入规则表

4      DR模型详解

DR模型的工做原理:

1.    director必须有与realserver有一张网卡在同个物理网段中,必须是同个局域网

2.    diector经过仅仅修改二层的源目MAC地址,将数据包(保留源目ip地址)发往真实的realserverrealserver直接把数据包发回给客户端,director只是接收请求,能够不作响应报文的转发,若是realserver把网关设置在director,则另当别论。

3.    不支持端口映射

 

DR有两种模型,1.VIPDIPRIP在同一个ip网络

                                                2.VIPDIP,RIP不在同一个IP网络,通常做为外网地址提供服务

补充知识点:

            ip地址是属于内核的,不属于单个网卡地址。做为一台有多网卡主机(多ip),把全部的ip通告给直连的主机。这个问题能够解释一台双网卡的主机A(不开启转发功能)(不一样网段的ip),另外一台与之相连的主机B能够ping通另外一个ip.

            ip响应的数据包的帧数据包的源mac地址是出接口对应网卡的mac地址

            ip网络响应数据包的时候是将请求数据包进入的接口的ip做为源ip

 

所以以下图,client请求VIP主机时候,按理是director来接收请求,可是reaserver也一样会响应(根据ARP请求的原理),realserverVIP并不做为这个通讯地址,仅仅为了可以识别服务而提供的。

如上:所须要解决的问题有:

1.realserver不对ARP广播请求VIP 地址响应或者是作出通告

            arptables

            内核的参数来修改arp的宣告和响应级别

2.须要修改diectorrealserver转发数据包时候源ip保持为VIP,而不是DIP或者RIP

  添加路由 route add –host VIP dev eth1:0

 

kernel parameter       

    arp_ingnore:

            响应级别:

                                                0:只要本地配置有相应地址则进行响应

                                                1:仅仅在请求的目标地址配置在请求到达的接口上的时候,才响应

            arp_announce:

            通告级别

                                                0:将本地任何接口上的任何地址向外通告

                                                1.试图仅向目标网络通告与其网络匹配的地址

                                                2.仅向与本地接口地址上配置的网络进行通告

[root@RS1 ~]# cd /proc/sys/net/ipv4/conf/

all/     default/ eth1/    lo/

all/是全局

eth1/是指定的网卡

都得配置

 

并且VIP地址配置在realserver上的时候要记得设置为不广播

ifconfig eth1:0 VIP broadcast VIP netmask 255.255.255.255 up

 

 

示例2

 

 

clip_image003[7]

 

 

 

1.先配置director

[root@director ~]# ifconfig eth1:0 172.16.100.1 255.255.0.0 up

[root@director ~]# route add -host 172.16.100.1 dev eth1:0

[root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

2.清空配置列表

iptables -F  #清空

ipvsadm -C  #清空

iptables -Z #计数器清空

3.再配置RSRS要先配置arp_ingore arp_announce,再配置VIP地址,最后添加路由

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce

 

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce

 

[root@RS1 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up

[root@RS2 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up

 

[root@RS1 ~]# route add -host 172.16.100.1 dev eth1:0

[root@RS2 ~]# route add -host 172.16.100.1 dev eth1:0

 

3.director配置负载集群

[root@director ~]# ipvsadm -A  -t 172.16.100.1:80 -s wrr

[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.2 -w 1 -g

[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.3 -w 2 -g

 

4.测试访问成功

http://172.16.100.1

验证:

[root@director html]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  172.16.100.1:80 wrr

  -> 127.0.0.1:80                 Local   5      0          4        

  -> 172.16.100.2:80              Route   1      0          0        

  -> 172.16.100.3:80              Route   2      1          0

 

 

 

 

 

 

 

 

复杂模型,VIP,提供服务的地址为外网地址

clip_image004[7]

分析数据包走向:

1.客户端发送的数据包经过专线到达diector,源目地址为CIP:VIP

2.directorINPUT链收到数据包,发现是集群服务的一个请求,根据算法,源目地址不变,修改二层帧,发送给一台RS

3.这台RS属于内网地址,将数据包发往内网出口路由器,回送数据包

 

 

 

示例3

因为手头就一台笔记本电脑,所以经过虚拟机来模拟此实验。

 

准备:

            1台物理机,3台虚拟机

    Vmnet1host-only这块网卡工做,物理机两个ip都配置在这块网卡上

            clip_image006[7]

   

clip_image008[7]

 

配置director

[root@director ~]# ifconfig eth1:0 192.168.10.80 netmask 255.255.255.0 up

[root@director ~]# route add -host 192.168.10.80 dev eth1:0 #eth1口转发数据包的时候保持源地址不变

[root@director ~]# echo 1 >  /proc/sys/net/ipv4/ip_forward #开启路由转发功能

配置RS,先配置RSarp响应和请求级别,all是全局

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore

 

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore

再配置VIP地址

[root@RS1 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up

[root@RS1 ~]# route add –host 192.168.10.80 dev eth1:0

[root@RS2 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up

[root@RS2 ~]# route add –host 192.168.10.80 dev eth1:0

 

director上配置集群,集群调度算法为wrr,工做模式为DR

[root@director ~]# ipvsadm –A  -t 192.168.10.80:80 –s wrr

[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.2 –g –w 1

[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.3 –g –w 2

测试:客户端访问

 

clip_image009[7]

clip_image010[7]

使用wrr轮询 权重为12,访问比例大概就是12

[root@director ~]# ipvsadm -L -n –stats #查看状态

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  192.168.10.80:80                   44      208        0    20510        0

  -> 172.16.100.2:80                    15       72        0     7442        0

  -> 172.16.100.3:80                    29      136        0    13068        0

因为是使用物理机来作客户端访问和做为这个http服务的数据包的出站网关,根据上述数据包的走向。

所以能够经过对Vmnet1进行抓包分析

本机物理机Vmnet1接口的mac地址 00:50:56:c0:00:01

directormac地址 00:0c:29:98:5c:4a

RS1mac地址 00:0c:29:e4:ea:ee

RS2mac地址 00:0c:29:1c:25:e4

#client发往director

clip_image012[7]

#director发往某台RS

clip_image014[7]

#RS经过另外一个接口发往客户端

clip_image016[7]

 

5      LVS持久链接

不管使用算法,LVS持久都能实如今必定时间内,未来自同一个客户端请求派发至此前选定的RS

持久链接模板(内存缓冲区)

                        每个客户端  及分配给它的RS的映射关系;

配置方法很简单:在配置集群服务的时候添加-p参数来指定链接时长

ipvsadm -A|E ... -p timeout:

                        timeout: 持久链接时长,默认300秒;单位是秒;

主要应用:SSL链接会话

 

持久链接类型:

PPC:未来自于同一个客户端对同一个集群服务的请求,定位到以前选定的RS;单服务类型

PCC:未来自于同一个客户端对一个集群内全部服务的请求,定位到以前选定的RS;全部端口服务

PNMPP:防火墙标记链接 就是以前提升的-f选项

            因为LVS应用在INPUT链上面,所以这个标记要在PREROUTING链上标记

 

示例4:经过示例2的例子来作继续实验

 

PPC

1.http服务设定为持久链接,时间为600s

ipvsadm -A -t 172.16.100.1  -p 600 -s wrr

ipvsadm -a -t 172.16.100.1 -r 172.16.100.2:80 -g -w 1

ipvsadm -a -t 172.16.100.1 -r 172.16.100.3:80 -g -w 2

 

PCC

2.未来自同一个客户端对全部端口的请求,始终定向至此前选定的RS中去

ipvsadm -A -t 172.16.100.1 -p 600 -s wrr

ipvsadm -a -t 172.16.100.1 -r 172.16.100.2 -g -w 1

ipvsadm -a -t 172.16.100.1 -r 172.16.100.3 -g -w 1

 

PNMPP

3.未来自同一个客户端访问集群的http服务和telnet服务都转发都以前选定的RS中去

iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 80 -j MARK --set-mark 10

iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 23 -j MARK --set-mark 10

ipvsadm -A -f 10 -p 600 -s wrr

ipvsadm -a -f 10 -r 172.16.100.2 -g -w 1

ipvsadm -a -f 10 -r 172.16.100.3 -g -w 2

相关文章
相关标签/搜索