用LVS在Linux上搭建负载均衡集群服务

LVS实现负载均衡

Linux 服务器集群系统(以下简称 LVS), 是一个由章文嵩博士发起的自由软件项目,现在已经是 Linux 标准内核的一部分。LVS 从 Linux 内核还在 2.0 版本的时代开始,就得到广泛的应用,目前Linux 的内核已经是 2.6 版,完全内置了 LVS 的各个模块,已经不需要在给内核打任何补丁。

基于NAT方式的LVS

硬件需求与网络拓扑结构

用LVS在Linux上搭建负载均衡集群服务

使用NAT方式时,director同时是一台NAT网关,它必须有一个公网IP,当收到请求时按照调度算法把请求转发给局域网中的某台realserver,realserver处理完请求后把结果返回给director,此时director将结果返回给 client。因为NAT方式完全依赖于director,需要d机有较强的数据吞吐,同时这也导致了d成为一个瓶颈。根据官方的文档当realserver少于20台时用NAT比较合适。

对于普通的玩家而言,很少有多台设备的。一般都只用一台PC,因此这里要使用虚拟机virtualbox,所以系统是Debian。

测试环境大致如下:

clinet: host主机 debian。

LB:virtualbox主机debian。

RS1...n:virtualbox主机 debian。

拓扑结构为:

client                        ---------->           LB              ----------->                  RS1

vboxnet0 ip:192.168.56.1                   eth0 ip:192.168.56.2                        eth0 ip:192.168.0.2

    netmask:255.255.255.0                  netmask:255.255.255.0                       netmask:255.255.255.0

                                                                                       gateway:192.168.0.1

                                           eth1 ip:192.168.0.1                                    RS2

                                           netmask:255.255.255.0                        eth0 ip:192.168.0.3

                                                                                        netmask:255.255.255.0

                                                                                        gateway:192.168.0.1

                                                                                                   .

                                                                                                   .

                                                                                                   .

                                                                                                   RSn

这里需要注意的事:

LB virtualbox主机启用了两块网卡,eth0在virtualbox上的模式为host-only,专门连本地机器client;eth1在virtualbox上的模式为Internal,专门跟虚拟机间的系统相联。

RS virtualbox主机启用了一块网卡,在virtualbox上的模式为Internal,专门跟虚拟机间的系统相联。

配置LVS

在LB上的配置

1.添加realserver

ipvsadm -C //清除ipvsadm表

ipvsadm -A -t 192.168.56.2:8080 -s rr //使用ipvsadm安装LVS服务,rr为轮询方式

ipvsadm -a -t 192.168.56.2:8080 -r 192.168.0.2:8080 -m -w 1 //增加第一台realserver,-m为NAT方式,-w为优先级

ipvsadm -a -t 192.168.56.2:8080 -r 192.168.0.3:8080 -m -w 1 //增加第二台realserver

/etc/init.d/ipvsadm save //默认保存到/etc/ipvsadm.rules

2.开启ip转发

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

注:永久修改要修改sysctl.conf

如果想开机保证能运行,需要在/etc/rc.local添加以下内容:

/etc/init.d/ipvsadm restart //确保ipvsadm启动

/etc/init.d/ipvsadm load /etc/ipvsadm.rules //加载规则

echo "1" >/proc/sys/net/ipv4/ip_forward //开启ip转发

在RS上的配置

1.在RS1、RS2…RSn上分别关闭ip转发

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

2.分别启动web服务

这里用的是resin-3.1.9,并对resin的首页进行了修改,使得可以分清具体访问的是哪个服务器。

测试

在LB上运行ipvsadm能看到初始数据为:

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port            Forward Weight ActiveConn InActConn

TCP 192.168.56.2:http-alt rr

-> 192.168.0.3:http-alt            Masq     1       0          0

-> 192.168.0.2:http-alt            Masq     1       0          0

在client的浏览器上多次访问http://192.168.56.2:8080 ,会看到页面有变化。 再次在LB上运行ipvsadm能看到类似以下数据:

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port            Forward Weight ActiveConn InActConn

TCP 192.168.56.2:http-alt rr

-> 192.168.0.3:http-alt            Masq      1      0         10

-> 192.168.0.2:http-alt            Masq      1      0         11

LVS+KeepAlived实现负载均衡

上面介绍了用LVS做负载均衡,但是有两个问题,一是如果RealServer中其中一台挂掉了,lvs不会自动的转发到正常的RealServer,而是继续转发到挂掉的RealServer上;二是因为只有一台loadBalancer,所以如果那台loadBalancer挂掉就等于整个网络挂掉了。

为了解决那两个问题,这里用到了KeepAlived,它主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。

基于NAT方式

硬件需求与网络拓扑结构

用LVS在Linux上搭建负载均衡集群服务

从上图可以看到跟上一节只用LVS做负载均衡的拓扑结构差不多,只是LoadBalancer多了一台做Backup服务器。

基于上节的实验环境,只需要增加一个虚拟机,系统和网卡跟上节的LB服务器一样,现把这服务器称为BLB服务器,其网卡IP设置如下:

eth0 ip:192.168.56.3

netmask:255.255.255.0

eth1 ip:192.168.0.253

netmask:255.255.255.0

另外有两个特殊的IP地址是最需要注意的:

一个是整个集群对外统一使用的IP地址,我们称它为VIP(Virtual IP),这里我们假设它为192.168.56.254,所有Client都通过这个IP访问真实服务,这是可跟DNS绑定的IP。

另一个特殊的IP是RealServer的gateway默认网关,我们称为V-gate(Virtual gate),上节我们指定RealServer的gateway为192.168.0.1,其对应的是LoadBalancer服务器的IP,现在由于多了一台LoadBalancer,为了使两台LoadBalancer都可以用到这个IP,我们先把上节LB的eth1 ip改为192.168.0.254。

这两个IP会在下面的KeepAlived配置文件中配置。

配置KeepAlived

使用KeepAlived是不需要配置LVS的转发规则的,如果在上节中配置了LVS的转发规则,可以用以下命令清除掉:

ipvsadm -C

要实现LVS+KeepAlived负载均衡,只需要修改/etc/keepalived/keepalived.conf文件即可。

修改文件时需要注意的是,由于没有语法检错,所以要注意单词拼写,还有每个“{”前都要有空格。

LB上的keepalived.conf文件配置如下:

# Configuration File for keepalived
 
global_defs {
   #每个load balancer 都有一个不同的ID
   lvs_id lvs01
}
 
#不使用vrrp_sync_groups的话,如果机器有两个网段,一个内网一个外网,
#每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题时,
#VRRP认为自己仍然健康,那么不会发送Master和Backup的切换,从而导致了问题。
#vrrp_sync_groups就是为了解决这个问题,可以把两个实例都放进一个Sync Group,
#这样的话,group里面任何一个实例出现问题都会发生切换。
vrrp_sync_group VG1 {
   group {
      VI_1
      VI_2
   }
}
 
#这个是外网网段的VRRP实例
vrrp_instance VI_1 {
        state MASTER
        interface eth0
 
        lvs_sync_daemon_interface eth0
 
    #每个virtual_router_id都要唯一
        virtual_router_id 51
 
    #这个是MASTERT和BACKUP服务器竞争的优先级,习惯MASTERT大于BACKUP
        priority 150
 
    #检测间隔,默认1s
        advert_int 1
 
    #这是两个服务器的同步验证,有PASS和AH两种方式
        authentication {
                auth_type PASS
                auth_pass 1111
        }
 
    #这里指定VIP当MASTER和BACKUP切换时,这些IP会添加到相应服务器上
        virtual_ipaddress {
                192.168.56.254 #这个是我们上面说的VIP
        #如果有多个,可以继续添加
        }
}
 
#这个是内网的实例
vrrp_instance VI_2 {
        state MASTER
        interface eth1
        lvs_sync_daemon_interface eth1
        virtual_router_id 52
        priority 150
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 1111
        }
        virtual_ipaddress {
                192.168.0.1 #这个是我们需要的V-gate
        }
}
 
 
#下面添加LVS的转发规则
virtual_server 192.168.56.254 8080 {
    delay_loop 6
 
    #调度规则,这里用rr指轮询方式
    lb_algo rr
 
    #这里是负载均衡的方式,我们基于NAT方式
    lb_kind NAT
 
    #这是对真实服务器健康检查的方式,这里用TCP方式
    protocol TCP
 
    real_server 192.168.0.2 8080 {
 
    #真实服务器的优先级
        weight 1
 
    #用TCP方式检查
        TCP_CHECK {
                connect_timeout 3 #连接超时时间
        }
    }
 
    real_server 192.168.0.3 8080 {
        weight 1
        TCP_CHECK {
                connect_timeout 3
        }
    }
}

BLB上的keepalived.conf文件配置:

跟LB上的配置几乎一样,只需要修改以下几点:

1.lvs_id改为lvs02

2.state改为BUCKUP

3.priority改为100,只要比MASTER小就可以。

测试

启动KeepAlived

在启动KeepAlived前要确保LoadBalancer服务器对应的LVS为MASTER和BACKUP,可通过以下指令来设置:

dpkg-reconfigure ipvsadm

还要确保ip转发已经启动,可通过以下指令:

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

通过以下指令启动LB和BLB下的keepalived服务:

/etc/init.d/keepalived start

通过以下指令可查看启动情况:

tail -f /var/log/messages

若启动成功会出现以下相似信息:

Feb 24 22:53:57 debian kernel: [  876.649352] IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 51

Feb 24 22:53:58 debian Keepalived_vrrp: VRRP_Instance(VI_2) Transition to MASTER STATE

Feb 24 22:53:58 debian Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE

Feb 24 22:53:59 debian Keepalived_vrrp: VRRP_Instance(VI_2) Entering to MASTER STATE

Feb 24 22:53:59 debian Keepalived_vrrp: VRRP_Group(VG1) Syncing instances to MASTER STATE

Feb 24 22:53:59 debian Keepalived_vrrp: VRRP_Instance(VI_1) Entering to MASTER STATE

另外通过ip a命令可反应keepalived启动成功,分别在MASTER和BACKUP上运行ip a命令,会看到192.168.56.254和192.168.0.1出现在MASTER上,而不会出现在BACKUP上。

测试RealServer的健康状态检查

停掉ReslServer上的resin服务,或停掉网络,然后在MASTER上用ipvsadm命令查看,会发现对应IP的那条转发规则自动删掉,使用tail -f /var/log/messages查看,会得到如下信息:

Feb 24 01:53:11 debian Keepalived_healthcheckers: TCP connection to [192.168.0.3:8080] failed !!!

Feb 24 01:53:11 debian Keepalived_healthcheckers: Removing service [192.168.0.3:8080] from VS [192.168.56.254:8080]

测试失败切换(FailOver)

在MASTER上使用/etc/init.d/keepalived stop命令把keepalived服务停掉,然后用ipvsadm命令查看,会发现所有规则被清空。

然后在BUCKUP上使用tail -f /var/log/messages查看,会得到如下信息:

Feb 24 22:53:57 debian kernel: [  876.649352] IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 51

Feb 24 22:53:58 debian Keepalived_vrrp: VRRP_Instance(VI_2) Entering to MASTER STATE

然后在MASTER上使用/etc/init.d/keepalived start命令把keepalived启动,然后用ipvsadm命令查看,会发现转发规则又出来了,在BUCKUP用tail -f /var/log/messages查看,会看到又变回了BUCKUP STATE。

邮件提醒功能

当LoadBalancer服务器或RealServer服务器出现问题时,为了使我们能第一时间知道,我们可以让keepalived能过邮件通知我们哪个服务器出问题了。

只需要修改keepalived.conf文件即可,首先在global_defs里添加以下内容:

#这是定义需要发送提醒的邮箱

   notification_email { 

       [email protected]

    #若有多个可以继续添加 

   }

#发件箱地址,可以随便定义

   notification_email_from [email protected]

   #这里用到了jobcn的SMTP服务器,如果本机安装了sendmail服务,可以定义为127.0.0.1

   smtp_server 192.168.60.131

   smtp_connect_timeout 30

然后分别在实例VI_1和VI_2中添加如下内容:

smtp_alert

这样无论哪台服务器出现故障或恢复正常都会有邮件提示了。

注:由于两台LoadBalancer服务器的eth0用的是host-only模式,所以是不能访问192.168.60.131的邮件服务器,需要将它们更改为bridged模式,然后把IP改成相同网段的IP方可,同时keepalived.conf文件里的192.168.56.254(VIP)也要更改为相同网段的IP。

基于DR方式

硬件需求与网络拓扑结构

用LVS在Linux上搭建负载均衡集群服务

VS/DR 的工作流程下图所示:它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR 中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后 的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现 报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

用LVS在Linux上搭建负载均衡集群服务

在VS/DR中,根据缺省的TCP/IP协议栈处理,请求报文的目标地址为VIP,响应报文的源地址肯定也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。

由于LB和RS都要在同一个物理网段上,所以基于上节的实验,IP按以下方式修改:

RS1:

eth0 ip:192.168.56.4

RS2:

eth0 ip:192.168.56.5

注:把它们的gateway都去掉。

这里需要注意的事:

LB、BLB、RS1、RS2的eth0在virtualbox上的模式都改为Bridged以便为外面的机器都能访问到。

配置KeepAlived

LB上的keepalived.conf文件配置如下:

# Configuration File for keepalived
 
global_defs {
   #每个load balancer 都有一个不同的ID
   lvs_id lvs01
}
 
#这个是外网网段的VRRP实例
vrrp_instance VI_1 {
        state MASTER
        interface eth0
 
    #每个virtual_router_id都要唯一
        virtual_router_id 51
 
    #这个是MASTERT和BACKUP服务器竞争的优先级,习惯MASTERT大于BACKUP
        priority 150
 
    #检测间隔,默认1s
        advert_int 1
 
    #这是两个服务器的同步验证,有PASS和AH两种方式
        authentication {
                auth_type PASS
                auth_pass 1111
        }
 
    #这里指定VIP当MASTER和BACKUP切换时,这些IP会添加到相应服务器上
        virtual_ipaddress {
                192.168.56.254 #这个是我们上面说的VIP
        #如果有多个,可以继续添加
        }
}
 
#下面添加LVS的转发规则
#注意:这里的virtual_server的端口跟real_server的端口必须相同
virtual_server 192.168.56.254 8080 {
    delay_loop 6
 
    #调度规则,这里用rr指轮询方式
    lb_algo rr
 
    #这里是负载均衡的方式,我们基于DR方式
    lb_kind DR
 
    #这是对真实服务器健康检查的方式,这里用TCP方式
    protocol TCP
 
    real_server 192.168.56.4 8080 {
 
    #真实服务器的优先级
        weight 1
 
    #用TCP方式检查
        TCP_CHECK {
                connect_timeout 3 #连接超时时间
        }
    }
 
    real_server 192.168.56.5 8080 {
        weight 1
        TCP_CHECK {
                connect_timeout 3
        }
    }
}

BLB上的keepalived.conf文件配置:

跟LB上的配置几乎一样,只需要修改以下几点:

1.lvs_id改为lvs02

2.state改为BUCKUP

3.priority改为100,只要比MASTER小就可以。

配置RS服务器

在RS服务器上必须把VIP加到lo上,运行以下命令,或在/etc/network/interfaces文件里配置。

ifconfig lo:0 192.168.56.254 broadcast 192.168.56.254 netmask 255.255.255.255 up

测试

跟NAT模式的测试一样,不过与/proc/sys/net/ipv4/ip_forward里的值无关。

相关推荐