一、lvs的三种方式:

1、 lvs-nat: 类似DNAT,是一种多目标主机DNAT,它通过修改请求报文的目标IP至基于调度方法选出某RS的RIP进行转发;
                (1) RS应该使用私有地址;网关必须指向DIP;
                (2) 请求和响应报文都经由Director转发;高负载场景中,Director易于成为性能瓶颈;
                (3) 支持端口映射;
                (4) RS可以使用任意类型的OS;
                (5) RS的RIP跟Director的DIP要在同一网段;
                
2、 ls-dr:  不修改请求报文的IP首部,而是通过直接封装帧(MAC)首部完成转发;目标MAC是基于调度方法选出某RS的网络接口的MAC地址;
                (1) 保证前端路由器将目标地址为VIP的报文通过ARP地址解析之后通通发往Director;
                    解决方案:
                        静态绑定
                        arptables
                        修改RS的内核参数
                (2) RS的RIP可以使用私有地址;但也可以使用公网地址,此时可通过互联网上的主机直接对其发起管理请求;
                (3) RS跟Director必须在同一物理网络中;
                (4) 请求报文必须经由director调度,而响应报文必须不能经由director;
                (5) 不支持端口映射;
                (6) RS可以是大数的OS;
                (7) RS网关绝对不能指向Director;
                
3、 lvs-tun: 不修改请求报文的IP首部,而通过IP隧道机制在IP报文外部再封装IP首部(SIP:DIP, DestIP: RIP),经由互联网交给选定的RS;
                (1) RIP, DIP, VIP全是公网地址;
                (2) RS的网关不能也不可能指向DIP;
                (3) 请求报文必须经由director调度,而响应报文必须不能经由director;
                (4) 不支持端口映射;
                (5) RS的OS必须支持隧道功能;


二、lvs的10种算法:

1、查看系统支持ipvs方法:
    
        # grep -A 10 -i "ipvs"  /boot/config-2.6.32-504.el6.x86_64
        
2、 静态方法:仅根据算法本身进行调度
           (1).  RR:round robin,轮询,轮叫,轮调,轮流

调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

           (2). WRR:weighted RR

调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

                Overhead=conn/weight, 结果小的会被挑中;
                2  1  3 4    6  7
                1  2      5       8
            (3). SH:source hashing
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

            (4) .DH:destination hashing

“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。               
            
3、 动态方法:根据算法及各RS当前的负载状况进行调度
            (1). LC:least connection,最少连接

调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

                Overhead=Actconn*256+Inactconn
                    结果小的会被挑中
            (2). WLC:weighted LC

在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

                Overhead=(Actconn*256+Inactconn)/weight
                结果小的会被挑中
            (3). SED:Shortest Expection Delay
                Overhead=(Actconn+1)*256/weight

基于wlc算法。这个必须举例来说了
ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算
A(1+1)/1
B(1+2)/2
C(1+3)/3
根据运算结果,把连接交给C 。

           (4). 最少队列调度(Never Queue Scheduling NQ)(NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算
           

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


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


三、lvs-dr概念说明:

原理流程图:

wKiom1XpfZvBi1BlAAG2b150Joc770.jpg
          

                (1) 各RS和Director都需要配置VIP地址;
                    各RS还应该有RIP;Director还应该有DIP;
                    RIP与DIP通常在同一个网络中;
                    RIP、DIP可以与VIP在同一个网络中,也可以不在同一网络中;
                (2) 转发是通过直接封闭帧首部进行的;
                    
                注意:各RS不能响应对VIP的ARP地址解析请求;
                
                ARP: Address Resolving Protocol
                    IP --> MAC
                    
                arp_announce: 定义ARP通告级别
                arp_ignore:定义对ARP广播请求的响应级别

arp_ignore介绍:

定义对目标地址为本地IP的ARP询问不同的应答模式

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求

2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

4-7 - 保留未使用

8 -不回应所有(本地地址)的arp查询


arp_announce的相关介绍

arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址

1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.


四、操作步骤及环境介绍:

三台服务器均配置:

lvs服务器    192.168.2.205DIP)桥接                172.16.2.205   vmet4

                  192.168.2.215VIP)桥接

real-server1服务器   192.168.2.206RIP)桥接   172.16.2.206RIP vmet4 

real-server2服务器   192.168.2.207RIP)桥接   172.16.2.207RIP vmet4

 

 

一、配置real-server1服务器

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

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

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

[root@localhost~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_igore

[root@localhost~]#ifconfig  lo:0  192.168.2.215 broadcast 192.168.2.215 netmask 255.255.255.255 up

[root@localhost~]#route add -host  192.168.2.215  dev lo:0

 

二、配置real-server2服务器

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

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

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

[root@localhost~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_igore

[root@localhost~]#ifconfig  lo:0  192.168.2.215 broadcast 192.168.2.215 netmask 255.255.255.255 up

[root@localhost~]#route add -host  192.168.2.215  dev lo:0

 

三、配置vipdip信息

[root@localhost ~]#ifconfig eth0:0  192.168.2.215   broadcast 192.168.2.215  netmask 255.255.255.255  up

[root@localhost ~]#route add -host 192.168.2.215   dev eth0:0

[root@localhost~]#ipvsadm  -A  -t 192.168.2.215:80  -s  rr

[root@localhost~]#ipvsadm -a  -t  192.168.2.215:80  -r 192.168.2.206 -g -w 1

[root@localhost~]# ipvsadm -a  -t  192.168.2.215:80  -r 192.168.2.207 -g -w 1

[root@localhost~]# ipvsadm -L –n

 

[root@localhost~]#ipvsadm  -A  -t 192.168.2.215:8000  -s  rr

[root@localhost~]#ipvsadm -a  -t  192.168.2.215:8000  -r 172.16.2.206 -g -w 1

[root@localhost~]# ipvsadm -a  -t  192.168.2.215:8000  -r 172.16.2.207 -g -w 1

[root@localhost~]# ipvsadm -L –n


五、persistent参数问题:

-p –persistent [timeout]
持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。


1、“来自同一个客户”该怎么理解呢,是基于IP的客户端还是基于浏览器客户端的Cookie呢,还是都有呢。
答:应该是基于源地址.其实还有一个参数[-M netmask],它指出源地址的匹配方式
例如 -p 900 -M 255.255.255.0
就是掩码后网络地址相同的请求使用同一个模板,因此10.1.9.8和10.1.9.9两机器同时访问同一个vs就使用同一个模板,即到同一个rs.


2、调度器是A,realserver有B和C,同时–persistent 设置时间为600秒。调度算法采用rr方式。
当我访问web时,调度器把这个请求分派到了B节点,按照我的理解应该是此后600秒内,在 此客户端进行的操作调度器都会分派到节点B来完成,600秒过后,按照rr调度算法,调度器会把此客户端的请求发到C节点,
可是在我的测试中,600秒以后,调度器有时把请求发送到了C节点,有时仍然发送到B节点,并且发送到B的几率更大,这个web站点只有我一个人在操作,这样的话,就不符合了rr的调度算法。

答:rr算法很简单,它只维护一个指向rs循环队列的指针,如果vs请求调度,rr就把当前指针所指的rs做为本次连接请求的rs,然后后以指针.它并不管什么模板.