一、服务器集群与负载均衡简介
服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。集群化操作可以减少单点故障数量,并且实现了群集化资源的高可用性。这些集群可以是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,继续提供服务,从而保证了高可用性,具体如下图:
- 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表示;
在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
五、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的存在。
②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。
(3)DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。
六、构建实战:LVS+Keepalived实现负载均衡
6.1 实验结构总览
(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网页测试
(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服务器;
(2)Web服务器发生故障时:
- A发生故障后,只从B获取服务;
这里模拟WEB服务器A(172.25.20.3)发生故障,暂停其http服务:service httpd stop
再来看看这时从外部访问VIP时,便会只从WEB服务器B(172.25.20.4)获取服务:
A故障修复后,又可从A获取服务;
主负载均衡服务器发生故障时,备机立即充当主机角色提供请求转发服务:
这里模拟主负载服务器(172.25.20.1)发生故障,暂停其keepalived服务:service keepalived stop
学习小结
LVS是一个可以工作在网络第四层的负载均衡软件,因此它相对于Nginx一类工作在第七层的负载均衡软件有着无可比拟的性能优势,LVS有四种负载均衡方式,本次只是基于其中一种(DR负载均衡模式),并借助Keepalived实现了一个最小化的负载均衡测试环境,在今后的学习中,会接触到更深层次的东西,在学习的道路上也会不断成长,在不断的探索中也能体会到不一样的快乐