0
点赞
收藏
分享

微信扫一扫

项目技术问题记录-内网环境下搭建LVS实现四层负载

夏沐沐 03-20 08:00 阅读 2

原创作者:田超凡(程序员田宝宝)

版权所有,引用请注明原作者,严禁复制转载

  1. lvs实现四层负载DR模式
  2. 什么是lvs

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

lvs实现负载的三种方式

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

1.LVS-DR 模式

        请求由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.LVS-NAT模式

        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模式好。

3.LVS-TUN模式

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

4.lvs-DR环境

master:192.168.101.100

lvs-director:192.168.101.8

nginx1:192.168.101.3

nginx2:192.168.101.4

  1. lvs调度服务器Director安装
    1. 安装lvs

在192.168.101.8上安装lvs

centos6.5自带lvs,检查linux内核是否集成lvs模块:

modprobe -l | grep ipvs

      1. 安装lvs的管理工具ipvsadm
  1. 安装依赖

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*

  1. 安装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

    1. 真实服务器Real Server安装

在192.168.101.3和192.168.101.4上安装nginx。

      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;

        }

     

    }

    1. Director Server配置
      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。

      1. 添加路由规则

route add -host 192.168.101.100 dev eth0:0

      1. 启用系统的包转发功能

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

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

      1. 清除原有转发规则

ipvsadm --clear

      1. 添加虚拟IP规则

ipvsadm -A -t 192.168.101.100:80 -s rr

-s rr表示采用轮询策略。

:80表示负载转发的端口是80

      1. 在虚拟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。

      1. 重启lvs

ipvsadm

    1. Real Server配置

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

      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

      1. 关闭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 #使用修改生效

    1. 测试
      1. 预期目标

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

      1. 注意事项

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

2、lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

keepalive_timeout说明:

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

部分素材引用自传智播客

举报

相关推荐

0 条评论