一、服务器集群与负载均衡简介

服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。集群化操作可以减少单点故障数量,并且实现了群集化资源的高可用性。这些集群可以是Web应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。

负载均衡服务器(load-balancing server)是进行负载分配的服务器。通过负载均衡服务器,将服务请求均衡分配到实际执行的服务中,从而保证整个系统的响应速度。在实际应用中,在Web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。

二、Keepalived概要

如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测web服务器的状态,如果某台web服务器故障,Keepalived将检测到并将其从系统中剔除,当该web服务器工作正常后Keepalived自动将其加入到服务器群中,这些工作全部自动完成,而不需要人工干预,只需要人工修复故障的web服务器即可。
    主要用作RealServer的健康检查,以及负载均衡设备MASTER和BACKUP之间failover的实现。

2、工作原理
Keepalived基于VRRP协议来实现高可用解决方案,利用其避免单点故障,通常这个解决方案中,至少有2台服务器运行Keepalived,即一台为MASTER,另一台为BACKUP,但对外表现为一个虚拟IP,MASTER会发送特定消息给BACKUP,当BACKUP收不到该消息时,则认为MASTER故障了,BACKUP会接管虚拟IP,继续提供服务,从而保证了高可用性,具体如下图:

负载均衡 健康检查M_TCP 负载均衡keepalive_keepalive

  • 3层机理是发送ICMP数据包即PING给某台服务器,如果不同,则认为其故障,并从服务器群中剔除。
  • 4层机理是检测TCP端口号状态来判断某台服务器是否故障,如果故障,则从服务器群中剔除。
  • 5层机理是根据用户的设定检查某个服务器应用程序是否正常运行,如果不正常,则从服务器群中剔除。

三、lvs简介

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。
- LVS的特点:
- 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
- 易用,配置非常简单,且有多种负载均衡的方法。
- 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

四、LVS的体系结构

传送门->此处只做简介,具体关于LVS详细介绍及配置,请浏览Running_free的blog:http://t.cn/Rp1K2Zt

  使用LVS架设的服务器集群系统有三个部分组成:

  (1)最前端的负载均衡层,用Load Balancer表示;

  (2)中间的服务器集群层,用Server Array表示;

  (3)最底端的数据共享存储层,用Shared Storage表示;

  在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

负载均衡 健康检查M_TCP 负载均衡keepalive_负载均衡 健康检查M_TCP_02

五、LVS负载均衡机制

(1)LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。

(2)LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。

①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的存在。

负载均衡 健康检查M_TCP 负载均衡keepalive_web应用_03

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

负载均衡 健康检查M_TCP 负载均衡keepalive_web应用_04

(3)DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。

六、构建实战:LVS+Keepalived实现负载均衡

6.1 实验结构总览

负载均衡 健康检查M_TCP 负载均衡keepalive_web应用_05

(1)本次基于redhat搭建一个四台Linux(redhat6.5)系统所构成的一个服务器集群,其中两台负载均衡服务器(一台为主机,另一台为备机),另外两台作为真实的Web服务器(向外部提供http服务,这里仅仅使用了apache的httpd服务,如有兴趣可尝试其他服务,如nginx)。

  (2)本次实验基于DR负载均衡模式,设置了一个VIP(Virtual IP)为172.25.20.200,用户只需要访问这个IP地址即可获得网页服务。其中,负载均衡主机为172.25.20.1,备机为172.25.20.2。Web服务器A为172.25.20.3,Web服务器B为172.25.20.4。

6.2 基础准备工作

以下工作针对所有服务器,也就是说要在四台服务器中都要进行配置:

  • 绑定静态IP地址(172.25.20.1~4)
  • 设定主机名(server1~4)
  • IP地址与主机名的绑定(本地解析)
  • 关闭防火墙(iptables -nL 检验)

6.3 配置两台Web服务器

  以下操作需要在角色为Web服务器的两台中进行,不需要在负载均衡服务器中进行操作:

[root@server3 ~]# /etc/init.d/httpd status
httpd is stopped
[root@server3 ~]# /etc/init.d/httpd start
Starting httpd: Warning: DocumentRoot [/www] does not exist
httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.20.3 for ServerName
                                                           [  OK  ]

[root@server3 ~]# echo "<h1>from server333333</h1>">/var/www/html/index.html

  (1)开启http服务,(或者开启nginx服务,传送门:http://t.cn/Rp1WMC0

/etc/init.d/httpd start
chkconfig httpd on  ##将httpd设为自启动服务

  (2)自定义网页,并用以区别两台Web服务器,以下图所示为例,其中一台显示from server333333,而另一台显示from server444444;

echo "<h1>from server333333</h1>">/var/www/html/index.html

  (3)在宿主机访问Web网页测试

  

负载均衡 健康检查M_TCP 负载均衡keepalive_keepalive_06


负载均衡 健康检查M_TCP 负载均衡keepalive_web应用_07


  (4)编辑realserver脚本文件

[root@server3 ~]# vim /etc/init.d/realserver

SNS_VIP=172.25.20.200
/etc/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       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 >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_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

[root@server3 ~]# chmod +x /etc/init.d/realserver
[root@server3 ~]# scp /etc/init.d/realserver root@server4:/etc/init.d/

6.4配置主负载服务器

(1)LVS安装

[root@server1 ~]# yum install -y ipvsadm
[root@server1 ~]# chkconfig ipvsadm on
[root@server1 ~]# service ipvsadm start

(2)安装Keepalived相关包

yum install -y keepalived

(3)配置keepalived

[root@server1 ~]#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@server1 ~]# >/etc/keepalived/keepalived.conf
[root@server1 ~]# vim /etc/keepalived/keepalived.conf
`
global_defs {
   notification_email {
         redhat@mail.com
   }
   notification_email_from sns-lvs@gmail.com
   smtp_server 172.25.20.200     ##SMTP邮件服务器
   smtp_connection_timeout 30
   router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备
    interface eth1  #指定Keepalived的角色,MASTER为主,BACKUP为备
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.20.200  #定义虚拟IP(VIP)为172.25.20.200,可多设,每行一个
    }
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 172.25.20.200 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 172.25.20.3 80 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 172.25.20.4 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}


[root@server1 keepalived]# service keepalived status
keepalived is stopped
[root@server1 keepalived]# service keepalived start
Starting keepalived:                                       [  OK  ]

6.5 配置从负载服务器

LVS安装

[root@server1 ~]# yum install -y ipvsadm
[root@server1 ~]# chkconfig ipvsadm on
[root@server1 ~]# service ipvsadm start

keepalived 从负载服务器与主负载服务器大致相同,只是在keepalived的配置文件中需要改以下两处:

  (1)将state由MASTER改为BACKUP

  (2)将priority由100改为99(比MASTER优先级100低)

vrrp_instance VI_1 {  
    state BACKUP # 这里改为BACKUP
    interface eth1  
    virtual_router_id 51  
    priority 99 # 这里改为99,master优先级是100(比MASTER优先级100低)
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        172.25.20.200  
    }  
}

6.6 验证性测试

(1)指定请求的均衡转发:因为两个Web服务器的权重都一样,所以会依次转发给两个Web服务器;

负载均衡 健康检查M_TCP 负载均衡keepalive_keepalive_08


负载均衡 健康检查M_TCP 负载均衡keepalive_数据库服务器_09


负载均衡 健康检查M_TCP 负载均衡keepalive_web应用_10

(2)Web服务器发生故障时:

  • A发生故障后,只从B获取服务;
    这里模拟WEB服务器A(172.25.20.3)发生故障,暂停其http服务:service httpd stop

负载均衡 健康检查M_TCP 负载均衡keepalive_keepalive_11

再来看看这时从外部访问VIP时,便会只从WEB服务器B(172.25.20.4)获取服务:

负载均衡 健康检查M_TCP 负载均衡keepalive_web应用_12

  • A故障修复后,又可从A获取服务;
  • 负载均衡 健康检查M_TCP 负载均衡keepalive_负载均衡 健康检查M_TCP_13


  • 负载均衡 健康检查M_TCP 负载均衡keepalive_数据库服务器_14

  • 主负载均衡服务器发生故障时,备机立即充当主机角色提供请求转发服务:
    这里模拟主负载服务器(172.25.20.1)发生故障,暂停其keepalived服务:service keepalived stop
  • 负载均衡 健康检查M_TCP 负载均衡keepalive_负载均衡_15

负载均衡 健康检查M_TCP 负载均衡keepalive_keepalive_16

学习小结

  LVS是一个可以工作在网络第四层的负载均衡软件,因此它相对于Nginx一类工作在第七层的负载均衡软件有着无可比拟的性能优势,LVS有四种负载均衡方式,本次只是基于其中一种(DR负载均衡模式),并借助Keepalived实现了一个最小化的负载均衡测试环境,在今后的学习中,会接触到更深层次的东西,在学习的道路上也会不断成长,在不断的探索中也能体会到不一样的快乐