lvs实现四层负载DR模式

lvs实现四层负载DR模式

1、什么是lvs

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

2、lvs实现负载的三种方式

运行 IPVS软件的服务器,在整个负载均衡集群中承担一调度角色 软件的服务器,(即 向真实服务器分配从客户端过来的请求。LVS中的调度方法有三种 :NAT(Network Address Translation网络地址转换)、TUN(tunnel 隧道)、DR(direct route 直接路由)

2.1、LVS-DR 模式

lvs实现四层负载DR模式_第1张图片

请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。
DR模式下需要LVS服务器和RS绑定同一个VIP, 一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,RS收到LVS转发来的包,发现MAC是自己的,发现IP也是自己的,于是这个包被合法地接受,而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。
DR模式下,lvs接收请求输入,将请求转发给RS,由RS输出响应给用户,性能非常高。
它的不足之处是要求负载均衡器与RS在一个物理段上。

2.2、LVS-NAT模式

lvs实现四层负载DR模式_第2张图片

NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,LVS需要作为RS的网关,当网络包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP,这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,对于客户端只知道是LVS直接返回给它的。
NAT模式请求和响应都需要经过lvs,性能没有DR模式好。

2.3、LVS-TUN模式

lvs实现四层负载DR模式_第3张图片

TUN模式是通过ip隧道技术减轻lvs调度服务器的压力,许多Internet服务(例如WEB服务器)的请求包很短小,而应答包通常很大,负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量。相比NAT性能要高的多,比DR模式的优点是不限制负载均衡器与RS在一个物理段上。但是它的不足需要所有的服务器(lvs、RS)支持”IP Tunneling”(IP Encapsulation)协议。

3、lvs-DR环境

vip:192.168.101.100
lvs-director192.168.101.8

nginx1:192.168.101.3
nginx2:192.168.101.4

4、lvs调度服务器Director安装

4.1、安装lvs

在192.168.101.8上安装lvs
centos6.5自带lvs,检查linux内核是否集成lvs模块:

modprobe -l | grep ipvs

lvs实现四层负载DR模式_第4张图片

4.2、安装lvs的管理工具ipvsadm

  • 安装依赖
yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*
  • 安装ipvsadm
    将ipvsadm-1.26.tar.gz拷贝至/usr/local/下
cd /usr/local
tar -zxvf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make
make install

校验是否安装成功:

lvs实现四层负载DR模式_第5张图片

5、真实服务器Real Server安装

在192.168.101.3和192.168.101.4上安装nginx。

5.1、nginx配置文件

创建nginx-lvs.conf,http内容如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }


    }

6、Director Server配置

6.1、在eth0上绑定虚拟ip

ifconfig eth0:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up

此处在eth0设备上绑定了一个虚拟设备eth0:0,同时设置了一个虚拟IP是192.168.101.100,然后指定广播地址也为192.168.101.100,需要特别注意的是,虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。

lvs实现四层负载DR模式_第6张图片

6.2、添加路由规则

route add -host 192.168.101.100 dev eth0:0

6.3、启动系统的包转发功能

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

参数值为1时启用ip转发,为0时禁止ip转发。

6.4、清除原有转发规则

ipvsadm --clear

6.5、添加虚拟IP规则

ipvsadm -A -t 192.168.101.100:80 -s rr
-s rr表示采用轮询策略。
:80表示负载转发的端口是80

6.6、在虚拟IP中添加服务规则

ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.3:80 -g
ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.4:80 -g

在新加虚拟IP记录中添加两条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式。
lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

6.7、重启lvs

ipvsadm

lvs实现四层负载DR模式_第7张图片

7、Real Server配置

在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。

7.1、在回环设备上绑定了一个虚拟IP地址

ifconfig lo:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up
/sbin/route add -host 192.168.101.100 dev lo:0

lvs实现四层负载DR模式_第8张图片

7.2、关闭arp解析

arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
         0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
         1 - 避免使用另外一个接口上的mac地址去响应ARP请求;
         2 - 尽可能使用能够匹配到ARP请求的最佳地址。

arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
        0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
        1 - 哪个接口上接受ARP请求,就从哪个端口上回应。


echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
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  
sysctl -p #使用修改生效

lvs实现四层负载DR模式_第9张图片

8、测试

8.1、预期目标

由于lvs设置为rr轮询策略,当访问虚IP http://192.168.101.100,每次刷新请求通过lvs负载到不同的服务器。

8.2、注意事项

1、测试时需要在nginx的http中设置keepalive_timeout 0; 取消使用http持久连接模式,保证每次客户端发起请求都需要向服务端建立连接,这样做是为了每次刷新页面都要经过lvs负载转发。
2、lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

keepalive_timeout说明:
在nginx中keepalive_timeout的默认值是75秒,默认使用http持久连接模式,可使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,可避免建立或重新建立连接。生产环境建议keepalive_timeout不要设置为0。

8.3、测试过程

修改192.168.101.3和192.168.101.4下html目录中index.html的内容使之个性化。

第一次请求:http://192.168.101.100

lvs实现四层负载DR模式_第10张图片

刷新,相当于第二次请求:

lvs实现四层负载DR模式_第11张图片

依次交替测试,发现每次请求被负载到不同的nginx上。

任意停止掉一个nginx,请求http://192.168.101.100继续可以浏览,同于lvs采用轮询策略如果其中一个nginx请求不可到达则去请求另外的nginx。

9、脚本封装

为了方便配置启动lvs将上边Director Server和Real Server的配置过程封装在shell脚本中。

9.1、Director Server配置

在/etc/init.d下创建lvsdr,内容如下:

#!/bin/sh
# 定义虚拟ip
VIP=192.168.101.100 #虚拟 ip根据需求修改
# 定义realserver,并已空格分开,根据需求修改
RIPS="192.168.101.3 192.168.101.4"

# 定义提供服务的端口
SERVICE=80

# 调用init.d脚本的标准库
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "Start LVS of DR Mode"
        # 开启ip转发
        echo "1" > /proc/sys/net/ipv4/ip_forward
        # 绑定虚拟ip
        ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        route add -host $VIP dev eth0:0
        # 清除lvs规则
        ipvsadm -C
        # 添加一条虚拟服务器记录
    # -p指定一定的时间内将相同的客户端分配到同一台后端服务器
    # 用于解决session的问题,测试时或有别的解决方案时建议去掉
        ipvsadm -A -t $VIP:$SERVICE -s rr

        # 添加真实服务器记录
        for RIP in $RIPS
    do
        echo $RIP:$SERVICE;
                ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
        done
        # 设置tcp tcpfin  udp的超时连接值
        ipvsadm --set 30 120 300
        ipvsadm
        ;;

        stop)
        echo "Stop LVS DR"
        ifconfig eth0:0 down
        ipvsadm -C
        ;;
        *)
        echo "Usage:$0 {start ¦ stop}"
        exit 1
esac

修改脚本权限:chmod +x /etc/init.d/lvsdr

启动Director server:service lvsdr start
停止Director server:service lvsdr stop

9.2、Real Server配置

在/etc/init.d下创建lvsdr,内容如下:

#!/bin/sh
VIP=192.168.101.100 #虚拟ip,根据需求修改
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "lo:0 port starting"
        # 为了相应lvs调度器转发过来的包,需在本地lo接口上绑定vip
        ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        # 限制arp请求
        echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
        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
        ;;
        stop)
        echo "lo:0 port closing"
        ifconfig lo:0 down
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
        ;;
        *)
        echo "Usage: $0 {start ¦ stop}"
        exit 1
esac

修改脚本权限:chmod +x /etc/init.d/lvsdr

启动real server:service lvsdr start
停止real server:service lvsdr stop

喜欢就点赞评论+关注吧

lvs实现四层负载DR模式_第12张图片

感谢阅读,希望能帮助到大家,谢谢大家的支持!

你可能感兴趣的:(常识)