您的位置:首页 > 其它

RHCE学习<12>LVS负载均衡详解

2013-11-15 17:38 288 查看
一、LVS集群概念性介绍
1、什么是集群?
服务器集群就是指将很多服务器集中起来一起进行同一种服务,只提供一个访问入口(域名或IP地址)在客户端看来就象是只有一个服务器 集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。
2、集群三种类型
1>.负载均衡集群(laod balance cluster):以提高应用系统的响应能力,尽可能处理更多的访问请求,减少延迟为目标,获得高并发、高负载的整体性能。LB的负载分配依赖于主节点的分流算法,将来自客户机的访问请求分担给多个服务器节点,从而缓解整个系统的负载压力。
2>.高可用集群(high availability cluster):以提高应用系统的可靠性,尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果。HA的工作方式包括主主(双工)、主从两种模式,主主即所有节点同时在线,主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点。
3>.高性能计算集群(high performance computer cluster):以提高应用系统的CPU运算速度,扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力.通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。
3、LVS集群介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,很好的可伸缩性、可靠性和管理性。
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。
4、LVS负载均衡集群分层结构



1>.负载调度器(director):前端至少有一个负载调度器,负责响应并发来自客户机的访问请求,是整个集群的访问入口,对外使用VIP(虚拟IP),也就是集群IP地址,通常负载调度器使用主、备实现热备份,确定高可用。
2>.服务器池:后端多台真实服务器,提供应用服务的服务器,如:HTTP服务,负责处理调度器分发过来的客户请求,当某个节点故障时,负载调度器容错机制会将其隔离,等故障恢复后重新加入集群。
3>.共享存储:为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个集群数据一致性,一般使用NAS设备或NFS作为存储服务器。
5、LVS三种工作模式
负载调度技术可以基于IP、端口、内容等进行分发,其他基于IP效果是最好的。
基于IP有三种负载均衡模式:
1>.网络地址转换(NAT):类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口。服务器节点使用私有IP地址。与负载调度器位于同一个物理网络,安全性要优于其他两种方式。
2>.IP隧道(TUN):采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的INTERNET连接直接回应客户机,而不再经过负载调度器。服务器节点分散在互联网中的不同位置。具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。
3>.直接路由(DR):采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道。
以上三种工作模式中,NAT方式只需要一个公网IP地址,从而成为最易用的一种负载均衡模式,安全性也比较好,许多硬件负载均衡设备就是采用这种方式,相比较而言,DR和TUN模式的负载能力更强大,适用范围更广,但节点的安全性要稍差一些。
6、常用四种负载调度算法
1>.轮询(rr):将收到的访问请求按照顺序轮流分配给群集中的各个节点(真实服务器),均等地对侍每一台服务器,而不管服务器实际的连接数和系统负载。
2>.加权轮询(wrr):根据真实服务器的处理能力轮流分配收到的访问请求,调度器可以自动查询各节点的负载情况,并动态调整其权重。这样可以保证处理能力强的服务器承担更多的访问流量。
3>.最少连接(lc):根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。如果所有服务器节点性能相近,采用这种方式可以更好地均衡负载。
4>.加权最少连接(wlc):在服务器节点的性能差异较大的情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大比例的活动连接负载。
详细请参考:http://going.blog.51cto.com/7876557/1302796
二、LVS集群应用
1、网络地址转换(NAT)



LVS调度器具有两块网卡,分别连接内外网,节点1、节点2和NFS存储均位于私有网络,其默认网关为192.168.1.1
1>.LVS负载调度器配置

[root@lvs ~]# modprobe -l | grep ip_vs #查看RHEL6内核已经集成ip_vs模块,需要时自动调用
[root@lvs ~]# vi /etc/sysctl.conf #开启路由转发功能
net.ipv4.ip_forward = 1
[root@lvs ~]# sysctl -p  #刷新生效
[root@lvs ~]# yum install -y ipvsadm  #安装ipvs管理工具
#配置负载分发策略
[root@lvs ~]# ipvsadm -C  #清除lvs原有策略
[root@lvs ~]# ipvsadm -A -t 218.245.4.10:80 -s rr  #轮训算法
[root@lvs ~]# ipvsadm -a -t 218.245.4.10:80 -r 192.168.1.10:80 -m  #-m采用NAT模式
[root@lvs ~]# ipvsadm -a -t 218.245.4.10:80 -r 192.168.1.20:80 -m
[root@lvs ~]# service ipvsadm save  #配置信息保存/etc/sysconfig/ipvsadm
[root@lvs ~]# chkconfig ipvsadm on
[root@lvs ~]# ipvsadm -ln  #查看节点状态,下面Masq(地址伪装)说明是采用NAT模式
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  218.245.4.10:80 rr
-> 192.168.1.10:80             Masq    1      0          0
-> 192.168.1.20:80             Masq    1      0          0
参数说明:-A:添加虚拟服务器-t:指定VIP地址及TCP端口-s:调度算法-a:添加真实服务器节点-r:指定真实服务器IP地址及TCP端口-g:dr模式(-m:nat模式,-i:iptun模式)-w:设置权重2>.NFS共享存储配置
[root@nfs ~]# yum install nfs-utils
[root@nfs ~]# vi /etc/exports
/var/www/html 192.168.1.0/24(rw,sync,no_root_squash)
[root@nfs ~]# service rpcbind start
[root@nfs ~]# service nfs start
[root@nfs ~]# chkconfig rpcbind on
[root@nfs ~]# chkconfig nfs on
3>.两个集群节点配置一样(网关指向192.168.1.1)

[root@web1 ~]# yum install httpd
[root@web1 ~]# mount -t nfs 192.168.1.30:/var/www/html/ /var/www/html #挂载nfs共享
[root@web1 ~]# echo "web1" > /var/www/html/index.html
[root@web1 ~]# service httpd start
[root@web1 ~]# chkconfig httpd on
4>.测试及相关命令
为了看出效果,我们将两个节点网页设置不同,分别为web1和web2页面,在生产环境下必须是相同的。
从互联网中访问http://218.245.4.10这个集群IP,可以看到web1,再刷新又看到了web2,实验成功!
ipvsadm -Lnc #查看集群连接负载状态
ipvsadm -d -r 192.168.0.10:80 -t 218.245.4.10:80 #***某个节点
ipvsadm -D -t 218.245.4.10
service ipvsadm stop或 ipvsadm -C #清除策略
要想真实服务器连接互联网可以在LVS负载调度器做一个NAT,如下:
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -o eth0 -j NAT --to 218.245.4.10
2、直接路由(DR)



在DR模式的群集中,LVS负载调度器作为群集的访问入口,但不作为网关使用;服务器池中的所有节点都各自接入internet,发送给客户端的WEB响应数据包不需要经过LVS负载调度器。出站数据分别处理,因此调度器与节点都需要配置VIP来响应集群的访问,共享存储放到内网中,提供安全性。1>.LVS负载调度器配置虚拟IP地址(VIP)采用虚拟接口方式(eth0:0),为eth0绑定VIP,以便响应集群访问。
[root@lvs ~]# cd /etc/sysconfig/network-scripts/
[root@lvs network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@lvs network-scripts]# vi ifcfg-eth0:0
DEVICE=eth0:0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=218.245.4.10
NETMASK=255.255.255.0
[root@lvs network-scripts]# service network restart
[root@lvs ~]# vi /etc/sysctl.conf #不需要开启路由转发,因为都是同网段
#调度器和节点都需要共用VIP,为了避免ARP解析出现异常,应该关闭linux内核重定向响应。添加如下:
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
[root@lvs ~]# sysctl -p  #刷新生效
#配置负载分发策略
[root@lvs ~]# ipvsadm -C  #清除lvs原有策略
[root@lvs ~]# ipvsadm -A -t 218.245.4.10:80 -s rr
[root@lvs ~]# ipvsadm -a -t 218.245.4.10:80 -r 218.245.4.21 -g
[root@lvs ~]# ipvsadm -a -t 218.245.4.10:80 -r 218.245.4.22 -g
[root@lvs ~]# service ipvsadm save
[root@lvs ~]# chkconfig ipvsadm on
[root@lvs ~]# 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.0.202:80 rr
-> 192.168.0.203:80             Route   1      0          0
-> 192.168.0.204:80             Route   1      0          0
2>.NFS共享存储配置
[root@nfs ~]# yum install nfs-utils
[root@nfs ~]# vi /etc/exports
/var/www/html 192.168.1.0/24(rw,sync,no_root_squash)
[root@nfs ~]# service rpcbind start
[root@nfs ~]# service nfs start
[root@nfs ~]# chkconfig rpcbind on
[root@nfs ~]# chkconfig nfs on
3>.配置两个集群节点
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0  #lo配置VIP,为了来接受、处理目标VIP数据包
[root@web1 network-scripts]# vi ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=218.245.4.10
NETMASK=255.255.255.255  #子网掩码必须全为1
[root@web1 network-scripts]# service network restart
[root@web1 network-scripts]# route add -host 218.245.4.10 dev lo:0 #添加lo网关
[root@web1 network-scripts]# echo "/sbin/route add -host 218.245.4.10 dev lo:0" >> /etc/rc.local  #设置开机自动添加
[root@web1 network-scripts]# vi /etc/sysctl.conf  #忽略arp响应
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web1 network-scripts]# sysctl -p
[root@web1 ~]# yum install httpd
[root@web1 ~]# mount -t nfs 192.168.1.10:/var/www/html/ /var/www/html #挂载nfs共享存储
[root@web1 ~]# echo "web1" > /var/www/html/index.html
[root@web1 ~]# service httpd start
[root@web1 ~]# chkconfig httpd on
4>.测试从互联网中访问http://218.245.4.10这个集群IP,可以看到web1,再刷新又看到了web2,实验成功!三、LVS网站集群平台(LVS-DR+Keepalived+NFS)1、Keepalived软件Keepalived是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换和健检查功能,如判断LVS负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集。在非LVS群集环境中使用时Keepalived也可以作为热备软件使用。Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案-----由多台路由器组成一个热备组。通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。热备组内的每台服务器都可以成为主服务器,虚拟IP地址(VIP)可以在热备组内的服务器之间进行转移,所以也称为漂移IP地址,使用Keepalived时,漂移地址的实现不需要手动建立虚拟接口配置文件(如eth0:0),而是由Keepalived根据配置文件自动管理。2、拓扑图


3、资源分配说明
LVS负载调度器VIP(虚拟IP)218.245.4.10
主LVS负载调度器eth0:218.245.4.11eth1:192.168.0.1
从LVS负载调度器eth0:218.245.4.12eth1:192.168.0.2
Web节点1eth0:218.245.4.13eth1:192.168.0.3
Web节点2eth0:218.245.4.14eth1:192.168.0.4
NFS共享存储eth0:192.168.0.5
MySQL数据库的VIP(虚拟IP)192.168.0.6
主MySQL数据库eth0:192.168.0.7
从MySQL数据库eth0:192.168.0.8
4、设计目的:用Keepalived构建高可用性的LVS负载均衡群集并实现后台的mysql数据库服务器的双机热备功能。
使用Keepalived构建LVS群集更加简便易用,主要优势体现在:对LVS负载调度器实现热备切换,提高可用性,对WEB服务器池中的节点进行分健康检查,自动移除失败节点,恢复后再重新加入。
5、具体配置如下
1>.主从LVS负载调度器配置(LVS-DR)

[root@lvs-master ~]# yum -y install gcc gcc-c++ make pcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel ipvsadm
[root@lvs-master ~]# tar zxvf keepalived-1.2.7.tar.gz
[root@lvs-master ~]# cd keepalived-1.2.7
[root@lvs-master keepalived-1.2.7]# ./configure --prefix=/usr/local/keepalived
[root@lvs-master ~]# make && make install
[root@lvs-master ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@lvs-master ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@lvs-master ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@lvs-master ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@lvs-master ~]# chkconfig --add keepalived
[root@lvs-master ~]# chkconfig keepalived on

[root@lvs-master ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
user@test.com  #故障接受邮件地址,可以多个
}
notification_email_from root@test.com  #故障发送邮件地址
smtp_server 127.0.0.1   #本机来发送邮件
smtp_connect_timeout 30
router_id LVS_MASTER    #负载均衡器标识,备用服务器改为LVS_BACKUP
}
vrrp_instance VI_1 {   #定义VRRP热备
state MASTER   #MASTER表示主服务器,BACKUP表示备用服务器
interface eth0
virtual_router_id 50   #虚拟路由ID,主备必须相同
priority 100   #优先级越过,取得VIP控制权越高,备用服务器改为90
advert_int 1  #主备值之间通告间隔时间为1s
authentication {   #认证信息,每个热备组保持一致
auth_type PASS  #认证类型,主备切换时用到
auth_pass 1111  #认证密码,主从必须一样
}
virtual_ipaddress {   #虚拟IP(VTP),可以多个
218.245.4.10
}
}
virtual_server 218.245.4.10 80 {  #虚拟服务器IP、端口
delay_loop 6   #每个6秒健康检查realserver状态
lb_algo rr  #lvs调度算法,rr为轮训
lb_kind DR  #lvs负载均衡模式,DR为直接路由
persistence_timeout 50  #同一个IP连接50秒内保持在一个realserver
protocol TCP  #用tcp协议检查realserver状态
real_server 218.245.4.13 80 {  #第一个web节点地址、端口
weight 1  #节点权重
TCP_CHECK {   #健康检查方式
connect_port 80   #检查目标端口
connect_timeout 3 #检查失败重试秒数
nb_get_retry 3  #重试次数
delay_before_retry 3  #重试间隔3秒
}
}
real_server 218.245.4.14 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
测试:ip add show 命令查看VTP绑定绑定在了主调度器eth0上,将主调度器keepalived停止,VTP会自动切换到备用调度器。一直ping,会丢3-4个包。
2>.服务池Web节点配置

[root@web1 ~]# vi /etc/init.d/lvs-real
#!/bin/bash
#chkconfig: 345 99 20
VIP=218.245.4.10
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP #lo:0绑定VIP地址,抑制 ARP 广播
/sbin/route add -host $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 $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@web1 ~]# chmod +x /etc/init.d/lvs-real
[root@web1 ~]# service lvs-real start
[root@web1 ~]# chkconfig --add lvs-real
[root@web1 ~]# chkconfig lvs-real start
[root@web1 ~]# mount -t nfs 192.168.0.5:/var/www/html/ /var/www/html #挂载nfs共享
3>.主从MySQL数据库配置
请参考Mysql主从复制:http://going.blog.51cto.com/7876557/1290431
在Mysql主从复制基础上实现双机热备:

[root@mysql-master ~]# yum -y install gcc gcc-c++ make pcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel ipvsadm
[root@mysql-master ~]# tar zxvf keepalived-1.2.7.tar.gz
[root@mysql-master ~]# cd keepalived-1.2.7
[root@mysql-master keepalived-1.2.7]# ./configure --prefix=/usr/local/keepalived
[root@mysql-master keepalived-1.2.7]# make && make install
[root@mysql-master ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@mysql-master ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@mysql-master ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@mysql-master ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@mysql-master ~]# chkconfig --add keepalived
[root@mysql-master ~]# chkconfig keepalived on

[root@mysql-master ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id MYSQL-MASTER   #备用服务器改为MYSQL-BACKUP
}
vrrp_instance VI_1 {
state MASTER   #备用服务器改为BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.6
}
}
virtual_server 192.168.0.6 3306 {
delay_loop 2
lb_algo wrr  #使用加权轮叫,根据服务器负载来决定访问请求到主从服务器
lb_kind DR
persistence_timeout 50
  protocol TCP
real_server 192.168.0.7 3306 {
weight 1
notify_down /etc/keepalived/mysql.sh #监控到mysql宕机后执行的脚本
TCP_CHECK {
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.0.8 3306 {
weight 1
notify_down /etc/keepalived/mysql.sh
TCP_CHECK {
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

[root@mysql-master ~]# vi /etc/keepalived/mysql.sh  #当mysql关闭时,自动关闭本机keepalived,从而实现故障机器移除
#!/bin/bash
pkill keepalived
[root@mysql-master ~]# service keepalived restart


至此网站集群架构配置完成!

本文出自 “李振良的技术博客” 博客,请务必保留此出处http://lizhenliang.blog.51cto.com/7876557/1325313
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: