码迷,mamicode.com
首页 > Web开发 > 详细

LVS-DR+keepalived 搭建web高可用负载均衡

时间:2017-05-14 10:53:16      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:lvs-dr+keepalived配置

实验环境 redhat6.5 2.6.32-431.el6.x86_64  

keepalived-1.2.16版本

ipvsadm-1.26-2.el6.x86_64

所有的虚拟机  都  关闭防火墙和selinux  配置好了本地yum源


搭建要求是对LVS-DR模式的原理熟悉,先配置好LVS-DR所需的环境。这里的环境是配置VIP DIP DIP 在同一个网段,并在realserver的lo接口上做好了arp抑制。具体见后面的脚本


当keepalived和LVS结合时,注意不需要在director上对ipvsadm手工的做配置,切记。在keepalived的配置文件里会配置lvs的VIP,RIP。  所有的配置只在keepalived的配置文件中就可以了。之前是先做的LVS-DR模式 所以先配置了ipvsadm后修改keepalived.conf结果画蛇贴足,导致无法搭建成功。


本次实验中  是搭建web的高可用负载均衡

DR1                            VIP:192.168.168.12                            DIP:192.168.168.100

DR2                            VIP:   192.168.168.12                           DIP:192.168.168.107 

realserver1                 VIP : 192.168.168.12                            RIP1: 192.168.168.102 

realserver2                  VIP: 192.168.168.12                             RIP2:192.168.168.103


前提 :realserver1和realserver2已经安装了 httpd 


********************首先搭建DR1 *********

1,软件的安装 DR1和DR2上安装 ipvsadm 和 keepalived

####################安装ipvsadm管理lvs#######################

首先lsmod查看是否支持lvs模块

root@dr100 ~ # lsmod | grep -i ip

ip_vs_rr                1420  1 

ip_vs                 125220  3 ip_vs_rr

可以看出支持 然后进入本地的yum源挂载目录安装ipvsadm (LVS已经编译到内核)

root@dr100 ~ # cd /mnt/Packages/

root@dr100 Packages # rpm -ivh ipvsadm-1.26-2.el6.x86_64.rpm


2.#######################然后安装keepalived####################

root@dr100 src # tar -zxvf keepalived-1.2.16.tar.gz


root@dr100 src # cd keepalived-1.2.16

root@dr100 keepalived-1.2.16 # ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/


可能会有依赖性

root@dr100 keepalived-1.2.16 # yum install -y openssl-devel

root@dr100 keepalived-1.2.16 # ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/   将keepalived整合到内核当中

root@dr100 keepalived-1.2.16 # make && make install

root@dr100 keepalived-1.2.16 # echo $?

0

下来将keepalived的配置文件复制到对应的配置文件,方便配置。

root@dr100 keepalived-1.2.16 # cp /usr/local/etc/rc.d/init.d/keepalived      /etc/init.d/  

root@dr100 keepalived-1.2.16 # cp /usr/local/etc/sysconfig/keepalived        /etc/sysconfig/

root@dr100 keepalived-1.2.16 # mkdir /etc/keepalived

root@dr100 keepalived-1.2.16 # cp /usr/local/etc/keepalived/keepalived.conf   /etc/keepalived/

root@dr100 keepalived-1.2.16 # cp /usr/local/sbin/keepalived                 /usr/sbin/

root@dr100 keepalived-1.2.16 # cd ~


#######################安装完毕进行配置#####################

root@dr100 keepalived-1.2.16 # cd ~

root@dr100 ~ # vim /etc/keepalived/keepalived.conf   主配置文件

root@dr100 ~ # 

root@dr100 ~ # cat !$

cat /etc/keepalived/keepalived.conf


! Configuration File for keepalived  

global_defs {  

   notification_email {  

     acassen@firewall.loc   #设置报警邮件地址,可以设置多个,每行1个,  

     failover@firewall.loc  #需开启邮件报警及本机的Sendmail服务。  

     sysadmin@firewall.loc  

   }  

   notification_email_from Alexandre.Cassen@firewall.loc  

   smtp_server 192.168.168.12  #设置SMTP Server地址;  

   smtp_connect_timeout 30  

   router_id LVS_DEVEL  

}  

           ########VRRP Instance########  

vrrp_instance VI_1 {  

    state MASTER    #指定Keepalived的角色,MASTER为主机服务器,BACKUP为备用服务器  

    interface eth0  #BACKUP为备用服务器  

    virtual_router_id 51  

    priority 100    #定义优先级,数字越大,优先级越高,主DR必须大于备用DR。  

    advert_int 1  

    authentication {  

        auth_type PASS  #设置验证类型,主要有PASS和AH两种  

        auth_pass 1111  #设置验证密码  

    }  

    virtual_ipaddress {  

        192.168.168.12  #设置主DR的虚拟IP地址(virtual IP),可多设,但必须每行1个  

    }  

}  

           ########Virtual Server########  

virtual_server 192.168.168.12 80 {  #注意IP地址与端口号之间用空格隔开  

    delay_loop 6        #设置健康检查时间,单位是秒  

    lb_algo rr          #设置负载调度算法,默认为rr,即轮询算法,最优秀是wlc算法  

    lb_kind DR          #设置LVS实现LB机制,有NAT、TUNN和DR三个模式可选  

    nat_mask 255.255.255.0  

#    persistence_timeout 1  #会话保持时间,单位为秒  实验要注释掉方便看出轮询

    protocol TCP        #指定转发协议类型,有TCP和UDP两种  

    real_server 192.168.168.102 80 {  #定义realserver 的ip 地址和 端口

        weight 1          #配置节点权值,数字越大权值越高  

        TCP_CHECK {  

            connect_timeout 3     #表示3秒无响应,则超时  

            nb_get_retry 3        #表示重试次数  

            delay_before_retry 3  #表示重试间隔  

        }  

    }  

    real_server 192.168.168.103 80 {  #配置服务器节点,即Real Server2的public IP  

        weight 1            #配置节点权值,数字越大权值越高  

        TCP_CHECK {  

            connect_timeout 3       #表示3秒无响应,则超时  

            nb_get_retry 3          #表示重试次数  

            delay_before_retry 3    #表示重试间隔  

        }  

    }  

配置完成

root@dr100 ~ # /etc/init.d/keepalived start


3.  ##############DR1配置完成开始配置realserver1和realserver2################

realserver1 配置   使用脚本配置


root@realserver1 ~ # cat lvs.dr.sh 

#!/bin/bash

vip=192.168.168.12

/etc/init.d/httpd start   #启动apache  没有安装的请自己先安装

case $1 in 

start)

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore    #这四行是做arp抑制

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

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

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

ip addr add dev lo $vip

ip a | grep -w inet

echo "this is for start"

;;

stop)

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore  #恢复arp

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

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

ip addr del dev lo $vip

ip a | grep -w inet

echo "this is for stop"

;;

*)

echo "plesase start or stop"

;;

esac

exit 0


root@realserver1 ~ # sh lvs.dr.sh start


root@realserver1 ~ # ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet 192.168.168.12/32 scope global lo

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:0b:b0:4e brd ff:ff:ff:ff:ff:ff

    inet 192.168.168.102/24 brd 192.168.168.255 scope global eth0

    inet6 fe80::20c:29ff:fe0b:b04e/64 scope link 

       valid_lft forever preferred_lft forever


root@realserver1 ~ # echo "real server 192.168.168.102" >/var/www/index.html



realserver2 同理


root@realserver2 ~ # cat lvs.dr.sh 

#!/bin/bash

vip=192.168.168.12

/etc/init.d/httpd start

case $1 in 

start)

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

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

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

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

ip addr add dev lo $vip

ip a | grep -w inet

echo "this is for start"

;;

stop)

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

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

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

ip addr del dev lo $vip

ip a | grep -w inet

echo "this is for stop"

;;

*)

echo "plesase start or stop"

;;

esac

exit 0


root@realserver2 ~ # sh lvs.dr.sh start


root@realserver2 ~ # ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet 192.168.168.12/32 scope global lo

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:2a:85:bb brd ff:ff:ff:ff:ff:ff

    inet 192.168.168.103/24 brd 192.168.168.255 scope global eth0

    inet6 fe80::20c:29ff:fe2a:85bb/64 scope link 

       valid_lft forever preferred_lft forever


root@realserver1 ~ # echo "real server 192.168.168.103" >/var/www/index.html


4.    #############realserver配置完成后 在DR1查看################

root@dr100 ~ # ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.168.12:80 rr

  -> 192.168.168.102:80           Route   1      0          0         

  -> 192.168.168.103:80           Route   1      0          0 


出现这个表明配置成功  可以将ipvsadm配置保存在文件中

root@dr100 ~ # ipvsadm-save > ipvsadm.txt  保存到文件ipvsadm.txt中

root@dr100 ~ # cat ipvsadm.txt 

-A -t bogon:http -s rr

-a -t bogon:http -r bogon:http -g -w 1

-a -t bogon:http -r bogon:http -g -w 1

root@dr100 ~ # ipvsadm-restore < ipvsadm.txt  将文件导入到ipvsadm的设置中


5.  ###################打开浏览器验证#################

打开浏览器访问VIP 192.168.168.12

技术分享

F5 刷新


技术分享

说明DR1已搭建成功 下面搭建DR2

**********************DR2的配置***************************

重复DR1中的ipvsadm和keepalived的安装,这里就不多说了

DR1和DR2的区别是 keepalived..conf 的配置 中的master改为backup 然后更改优先级就可以了。


root@dr107 ~ # 

root@dr107 ~ # cat !$

cat /etc/keepalived/keepalived.conf


! Configuration File for keepalived  

global_defs {  

   notification_email {  

     acassen@firewall.loc   #设置报警邮件地址,可以设置多个,每行1个,  

     failover@firewall.loc  #需开启邮件报警及本机的Sendmail服务。  

     sysadmin@firewall.loc  

   }  

   notification_email_from Alexandre.Cassen@firewall.loc  

   smtp_server 192.168.168.12  #设置SMTP Server地址;  

   smtp_connect_timeout 30  

   router_id LVS_DEVEL  

}  

           ########VRRP Instance########  

vrrp_instance VI_1 {  

    state BACKUP    #指定Keepalived的角色,MASTER为主机服务器,BACKUP为备用服务器  

    interface eth0  #BACKUP为备用服务器  

    virtual_router_id 51  

    priority 50    #定义优先级,数字越大,优先级越高,主DR必须大于备用DR。  

    advert_int 1  

    authentication {  

        auth_type PASS  #设置验证类型,主要有PASS和AH两种  

        auth_pass 1111  #设置验证密码  主从要一致

    }  

    virtual_ipaddress {  

        192.168.168.12  #设置主DR的虚拟IP地址(virtual IP),可多设,但必须每行1个  

    }  

}  

           ########Virtual Server########  

virtual_server 192.168.168.12 80 {  #注意IP地址与端口号之间用空格隔开  

    delay_loop 6        #设置健康检查时间,单位是秒  

    lb_algo rr          #设置负载调度算法,默认为rr,即轮询算法,最优秀是wlc算法  

    lb_kind DR          #设置LVS实现LB机制,有NAT、TUNN和DR三个模式可选  

    nat_mask 255.255.255.0  

#    persistence_timeout 1  #会话保持时间,单位为秒  实验要注释掉方便看出轮询

    protocol TCP        #指定转发协议类型,有TCP和UDP两种  

    real_server 192.168.168.102 80 {  

        weight 1          #配置节点权值,数字越大权值越高  

        TCP_CHECK {  

            connect_timeout 3     #表示3秒无响应,则超时  

            nb_get_retry 3        #表示重试次数  

            delay_before_retry 3  #表示重试间隔  

        }  

    }  

    real_server 192.168.168.103 80 {  #配置服务器节点,即Real Server2的public IP  

        weight 1            #配置节点权值,数字越大权值越高  

        TCP_CHECK {  

            connect_timeout 3       #表示3秒无响应,则超时  

            nb_get_retry 3          #表示重试次数  

            delay_before_retry 3    #表示重试间隔  

        }  

    }  

然后开启keepalived

root@dr107 ~ #  /etc/init.d/keepalived   start

root@dr107 ~ # ipvsadm -Ln  查看

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.168.12:80 rr

  -> 192.168.168.102:80           Route   1      0          0         

  -> 192.168.168.103:80           Route   1      0          0 


##################都配置成功了,可以宕机检验了。#######################

****************************以下时网上找到的理论知识  *********************************************                                

1. LVS简介:

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。章文嵩博士目前工作于阿里集团,主要从事集群技术、操作系统、对象存储与数据库的研究。(摘自《BAIDU百科》)

2. LVS集群的组成:

LVS服务器系统由三部分组成:

1)负载均衡层:

位于整个集群系统的最前端,避免单点故障一般最少由2台或2台以上负载调度器组成。

2)服务器群组层:

是一组真正运行应用服务器的机器组成,Real Server可以是Web、FTP、DNS、Mail 、视频等服务器中的一个或N个,每个Real Server之间通过高速的LAN/WAN相连接。为了节省宝贵的资源,在生产环境中,Director Server同时身兼Real Server的角色!

3)共享存储层:

为Real Server提供共享存储空间和内容一致性的存储区域。可以为磁盘阵列、Red Hat的GFS文件系统、Oracle的OCFS2文件系统等。

Director Server是整个LVS的核心!到目前为止,Director server只能安装在Linux、FreeBSD上,如果Linux内核是2.6及以上时,则已经内置了LVS的各个模块,不用作任何的设置就支持LVS功能。

Real Server服务器几乎为所有有系统平台,如:Windows、Linux、Solaris、AIX、BSD等系统平台。

常见的3中模式 还有第四种

1、NAT模式-网络地址转换

        Virtualserver via Network address translation(VS/NAT)

这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。

技术分享

大致可分为几个步骤

1)客户端请求数据,目标IP为VIP

2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。

3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。

4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。

5)客户端收到的就只能看到VIP\DIP信息。

NAT模式优缺点:

1、NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点

2、只需要在LB上配置一个公网IP地址就可以了。

3、每台内部的节点服务器的网关地址必须是调度器LB的内网地址。

4、NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。


2、TUN模式

virtual server via ip tunneling模式:采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。

VS/TUN的工作,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。

技术分享

1)客户请求数据包,目标地址VIP发送到LB上。

2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。

3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。

4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,做arp抑制)



3、DR模式(直接路由模式)

Virtual server via direct routing (vs/dr)

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。

DR模式是互联网使用比较多的一种模式。DR模式原理过程简述:

VS/DR模式的工作,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。

技术分享

DR模式小结:

1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。

2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)

3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面

4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。

5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。

6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。




























LVS-DR+keepalived 搭建web高可用负载均衡

标签:lvs-dr+keepalived配置

原文地址:http://19941018.blog.51cto.com/11889001/1925338

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!