LVS NAT和DR模型

LVS :NATDR模型的详解

1      集群简介

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

扩展有两种方式:

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

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

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

 

LVS NAT和DR模型_第1张图片

 

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)    管理集群服务

 

添加 �CA  -t|u|f service-address �Cr server-address [-s scheduler]

                    -t tcp

                    -u udp

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

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

                    默认调度算法是wlc

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

修改 �CE :使用同上

删除 �CD �Ct|u|f service-address

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

 

2)    管理集群服务的RS

 

添加 �Ca  -t|u|f service-address �Cr 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 :权值,部分算法需要使用

修改 �Ce :使用同上

删除 �Cd  -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 �CS > /path/to/somefile

-R:重新载入规则

        #ipvsadm �CR </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

LVS NAT和DR模型_第2张图片

配置:

director上配置

ipvsadm �CA  -t 192.168.80.250:80 �Cs rr

ipvsadm �Ca  �Ct 192.168.80.250:80 �Cr 172.16.100.2 �Cm

ipvsadm �Ca  �Ct 192.168.80.250:80 �Cr 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 �Chost 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

 

 

LVS NAT和DR模型_第3张图片

 

 

 

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,提供服务的地址为外网地址

LVS NAT和DR模型_第4张图片

分析数据包走向:

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

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

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

 

 

 

示例3

由于手头就一台笔记本电脑,因此通过虚拟机来模拟此实验。

 

准备:

            1台物理机,3台虚拟机

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

            LVS NAT和DR模型_第5张图片

   

LVS NAT和DR模型_第6张图片

 

配置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 �Chost 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 �Chost 192.168.10.80 dev eth1:0

 

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

[root@director ~]# ipvsadm �CA  -t 192.168.10.80:80 �Cs wrr

[root@director ~]# ipvsadm �Ca �Ct 192.168.10.80:80 �Cr 172.16.100.2 �Cg �Cw 1

[root@director ~]# ipvsadm �Ca �Ct 192.168.10.80:80 �Cr 172.16.100.3 �Cg �Cw 2

测试:客户端访问

 

LVS NAT和DR模型_第7张图片

LVS NAT和DR模型_第8张图片

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

[root@director ~]# ipvsadm -L -n �Cstats #查看状态

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

你可能感兴趣的:(style,模型,justify)