搭建LVS和Keepalived,使用包版本为ipvsadm-1.26和keepalived-1.3.5,环境:CentOS7

安装ipvsadm:

*需要机器支持且加载ipvs模块,通过lsmod|grep ip_vs  查看是否有相关模块,如果没有可以通过modprobe ip_vs动态加载,不过每次重启失效,想要永久生效就在/etc/sysconfig/modules下增加脚本ip_vs.modules并且chmod 755 ip_vs.modules

#!/bin/sh
/sbin/modinfo -F filename ip_vs >/dev/null 2>&1
if [ $? -eq 0 ];then
    /sbin/modprobe ip_vs
fi

需要安装的依赖包有,libnl,libnl-devel,popt,popt-devel,popt-static,部分yum源没有popt-static,通过rpm包安装popt-static,然后直接make和make install

安装keepalived:

需要openssl,openssl-devel,libnfnetlink,libnfnetlink-devel,同样是部分源没有这个包,可以通过下载tar包安装,然后./configure --prefix=/usr/local/keepalived  &&  make  &&  make install


稍微讲一下概念,LVS是指Linux Virtual Server,虚拟服务器,主要用于服务器集群的负载均衡,[集群的机器把对外的服务绑定在某个Virtual IP(简称VIP)]就是客户端访问的,而后端提供服务的是Real IP(简称RIP),对应的服务器称为Virtual Server(LVS)和Real Server(RS)]。

LVS有两种模式:

NAT模式:NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

DR模式:

DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。


开始搭建LVS+Keepalived

配置RS:

网上有提供对应的启动脚本,比较方便,这里稍微介绍脚本


VIP=192.168.100.20                                                  #对外提供服务的ip地址
case "$1" in
start)
       ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP    #通过lo:0网卡别名绑定vip地址
       /sbin/route add -host $VIP dev 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
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       /sbin/route del $VIP >/dev/null 2>&1
       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 "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

关于关闭arp广播响应:

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

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

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

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

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

4-7 - 保留未使用 

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

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

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

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

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


Keepalived配置(MASTER):

以下是一个简单的配置方案

global_defs {  
   notification_email {  
        admin@youngyuyeah.com                           #出现keepalived告警时,邮件通知此邮箱
   }  
   notification_email_from root@youngyuyeah.com         #发件人名称
   smtp_server 192.168.100.2                            #发邮服务器的ip   
   smtp_connection_timeout 30                           #连接发邮服务器的时间
   router_id LVS_DEVEL                                  #设置lvs的id,唯一标识符
}  
vrrp_instance VI_1 {                                    #定义一个vrrp域
    state MASTER                                        #指定keepalived的为MASTER(需要大写)          
    interface eth0                                      #指定VIP绑定网卡
    virtual_router_id 51                                #虚拟路由编号,同一vrrp域内MASTER和BACKUP要相同
    priority 100                                        #优先级,数字越大,优先级越高,主必须大于从    
    advert_int 1                                        #检查间隔,默认为1s
    authentication {                                    #主从间通讯密码
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.100.20                                  #定义VIP为192.168.100.20,可以有多个,换行写
    }  
}
virtual_server 192.168.100.20 80 {  
    delay_loop 6                                        #设置健康检查时间,单位是秒                    
    lb_algo wrr                                         #设置负载调度的算法为wlc                   
    lb_kind DR                                          #设置LVS实现负载的机制,有NAT、TUN、DR三个模式   
    nat_mask 255.255.255.0                
    persistence_timeout 0          
    protocol TCP
    real_server 192.168.100.21 80 {                     #指定RS的IP地址
        weight 3                                        #配置节点权值,数字越大权重越高              
        TCP_CHECK {  
        connect_timeout 10         
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
    }  
    real_server 192.168.100.22 80 {                     #另一个RS的IP地址
        weight 3              
        TCP_CHECK {  
        connect_timeout 10         
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
    }  
}


而Keepalived(BACKUP)的配置可以在MASTER的基础上修改几个地方即可:

vrrp_instance VI_1 {  
    state BACKUP                                        #这里改为BACKUP
    interface eth0  
    virtual_router_id 51  
    priority 99                                         #这里改为99,master优先级是100
    nopreempt                                           #[如果需要backup机器切换之后维持主的身份,可以添加这个项]
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.100.20  
    }  
}

最后测试:

①启动两台机器,通过ipvsadm -L -n 是否已经有对应RIP的均衡池,

②访问VIP看是否正常(两台keepalived只有一台能有VIP,同时出现是有异常的)

③停止其中RS的web服务,看是否会切换至另一个RS

④模拟MASTER宕机,通过ifconfig查看VIP是否漂移至BACKUP上。


更多的使用方法,后期再继续补充