LVS

LVS 架构

LVS是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层(Director)server集群层(Real server)和共享存储层。

LVS DR NAT keepalived_LVS DR NAT keepalive

 

LVS-DR

DR(调度器将请求来的数据包的目标mac地址改为real server的mac地址,返回的时候也不经过调度器,直接返回给客户端),其实该过程就就是利用“以太网”通讯是通过mac地址的原理,从而让realserver将数据直接返回给目标地址,而不经过DR返回数据LVS DR NAT keepalived_LVS DR NAT keepalive_02 

案例lvs-dr

 

第一步:完成IP地址的配置以及网络配置

 

 

第二步:安装相应软件

RS-1RS-2上安装nginx,方便测试

yum -y install nginx

Director上安装ipvsadm

yum -yinstall ipvsadm

 

第三步:配置DR

 

vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
             #启动路由转发功能
ipv=/sbin/ipvsadm
vip=
172.16.1.100
rs1=
172.16.1.2
rs2=
172.16.1.3
ifconfig eth
1:0 $vipbroadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth
1:0
$ipv -C
                                         #清除ipvsadm的规则
$ipv -A -t $vip:80 -s
wrr                          #加权轮训算法

#-A 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。

#-a

#-s 表示使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc

#调度算法


$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

 

#-a 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器

#-t 说明虚拟服务器提供的是tcp的服务[vip:port] or[real-server-ip:port]

#-r 真实的服务器[Real-Server:port]

#-g 指定LVS 的工作模式为直接路由模式

#-w 真实服务器的权值,如上的配置,两天服务器的权重一样,如访问两次服务,那么一次在rs1上,一次在rs2上。

 

 

第四步:配置RS

两台rs上:vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=
172.16.1.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up 
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
         #关闭ARP
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

 

第五步:启动脚本

然后director上执行: bash /usr/local/sbin/lvs_dr.sh
两台rs上执行: bash/usr/local/sbin/lvs_dr_rs.sh

 

第六步:在RS-1RS-2上配置用于测定的web页面,web.html

 

RS-1上的配置: echo "rs1 web server" >/usr/share/nginx/html/web.html

RS-2上的配置: echo "rs2 web server" >/usr/share/nginx/html/web.html

 

注意:需启动nginx

 

7步:通过curl 172.16.1.100/web.html,其执行结果如下

 

LVS DR NAT keepalived_LVS DR NAT keepalive_03

 

8步:在DR上通过ipvsadm可以查看到如下的InActConn7:7与其定义的 wrr调度方式一致。

LVS DR NAT keepalived_LVS DR NAT keepalive_04

 

其中在这三种IP负载均衡的技术中,DR和TUN模式都需要在真实服务器上对arp_ignore和arp_announce参数进行配置,主要是实现禁止响应对VIP的ARP请求。

lvs环境中,需要设定以下的参数

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

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

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

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

 

arp_ignore:定义对目标地址为本地IPARP询问不同的应答模式

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

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

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

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

4-7 - 保留未使用 

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

 

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

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

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

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

 

 

三、调度算法

LVS主要的调度算法
轮询调度-加权轮询调度-最小连接调度-加权最小连接调度-基于局部性的最少连接-
带复制的基于局部性的最少连接-目标地址散列调度-源地址散列调度

1:轮询算法(RR)就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器
2:加权轮询算法(WRR)主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
3:最小连接调度算法(LC)将把请求调度到连续数量最小的服务器上,
4:加权最小连接算法(WLC)则是给每台服务器一个权值,调度器会尽可能保持服务器连接数量与权值之间的平衡
5:基于局部性的最少连接调度算法(lblc)是请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近的该目标IP地址所有使用的服务器,如果这台服务器依然可用,并且用能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器。
6:带复杂的基于局部性最少的连接算法(lblcr)激励的不是一个目标IP与一台服务器之间的连接记录,他会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负责过高
7:目标地址散列调度算法(DH)也是根据目标IP地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标IP的请求会固定发给该服务器。
8:源地址散列调度算法(SH)与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源

 

LVS+keeplived

ipvsadm的缺陷是不能判断realserver是否存活,从而导致数据还是会根据dr的调度,发送到存在问题的服务器上。而keepalived就存在检查机制,一单检测到realserver出现故障,就在ipvsadm的表中删除映射关系,从而保证数据的有效性。

keepalived会根据keepalived的配置,自动完成dr的配置,不用单独配置ipvsadm

 

LVS DR NAT keepalived_LVS DR NAT keepalive_05

 

本实验主要针对master进行配置,用于测试是否可以完成负载

 

注意:前面虽然我们已经配置过一些操作,但是下面我们使用keepalived操作和之前的操作是有些冲突的,所以若是之前配置过DR,请首先做如下操作:dr上执行:

ipvsadm -C
ifconfig eth1:0  down

 

 

第一步:安装keepalived

yum install-y keepalived

 

第二步:安装好后,编辑配置文件  
vim /etc/keepalived/keepalived.conf 
#建议备份keepalived.conf的原始配置

 

vrrp_instance VI_1 {
    state MASTER   
               #备用服务器上为 BACKUP
    interface eth
1
    virtual_router_id 51
    priority 100  
                  #备用服务器上为90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.
0.200

    }
}
virtual_server 192.168.
0.200 80 {
    delay_loop 6                 
  #(每隔10秒查询realserver状态)
    lb_algo wlc                 
   #(lvs 算法)
    lb_kind DR                 
   #(Direct Route)
    persistence_timeout 60        #(
同一IP的连接60秒内被分配到同一台realserver)
    protocol TCP              
   #(用TCP协议检查realserver状态)

    real_server 192.168.
0.116 80 {
        weight 100              
   #(权重)
        TCP_CHECK {
        connect_timeout 10     
 #(10秒无响应超时)
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
  real_server 192.168.0.117 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

 

第三步:DRRS的其他配置

以上为主director的配置文件,从director的配置文件只需要修改
state MASTER  -> state BACKUP
priority 100 -> priority 90
配置完keepalived后,需要开启端口转发(主从都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward

最后,两个director上启动keepalived服务(先主后从):
/etc/init.d/keepalived start
另外,需要注意的是,启动keepalived
服务会自动生成vip和ipvsadm规则,不需要再去执行上面提到的/usr/local/sbin/lvs_dr.sh 脚本。

 

然后,两个rs上执行 /usr/local/sbin/lvs_dr_rs.sh脚本(如上所示的lvs DR配置的rs脚本)

 

第四步:关闭192.168.0.117eth1网口,如下所示,表示keepalived的切换过程

LVS DR NAT keepalived_LVS DR NAT keepalive_06 

 

三、LVS-NAT

如下图所示,当192.168.0.111访问realserver提供的服务时,会将请求发送给DRDR根据其调度算法,确定是将该请求发送给realserver1还是realserver2,当realserver收到该请求后,会将回应信息发送给DR,再由DR回应给192.168.0.111。这就是LVS-NAT的一个工作原理。

LVS DR NAT keepalived_LVS DR NAT keepalive_07

 

案例:

需求:三台服务器一台作为director, 两台作为real server
       Director 有一个外网ip (192.168.0.115) 和一个内网ip(172.16.1.1), 两个real server上只有内网ip(172.16.1.2)和(172.16.1.3) 并且需要把两个real server的内网网关设置为director的内网ip(172.16.1.1)

 

第一步:配置IP和网络信息

略……

第二步:DR上的配置如下脚本(命名为lvs_nat.sh

 

#! /bin/bash

# director 服务器上开启路由转发功能:

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

# 关闭icmp的重定向

echo 0 >/proc/sys/net/ipv4/conf/all/send_redirects

echo 0 >/proc/sys/net/ipv4/conf/default/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth2/send_redirects

 

# director 设置nat防火墙

iptables -t nat -F

iptables -t nat -X

iptables -t nat -A POSTROUTING -s172.16.1.0/24  -j MASQUERADE

# director设置ipvsadm

IPVSADM='/sbin/ipvsadm'

$IPVSADM -C

$IPVSADM -A -t 192.168.0.200:80 -s  wrr        

$IPVSADM -a -t 192.168.0.200:80 -r172.16.1.2:80 -m -w 1

$IPVSADM -a -t 192.168.0.200:80 -r172.16.1.3:80 -m -w 1

 

第三步:运行lvs_nat.sh脚本

sh lvs_nat.sh

第四步:安装nginx,在目录的html目录下,配置如下内容(测试使用),并启动nginx

rs1上: echo "rs1 server" >/usr/share/nginx/html/index.html
rs2
上: echo "rs2server" >/usr/share/nginx/html/index.html

 

第五步:测试结果

LVS DR NAT keepalived_LVS DR NAT keepalive_08