一、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.11 |
eth1:192.168.0.1 |
从LVS负载调度器 |
eth0:218.245.4.12 |
eth1:192.168.0.2 |
Web节点1 |
eth0:218.245.4.13 |
eth1:192.168.0.3 |
Web节点2 |
eth0:218.245.4.14 |
eth1: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 { [email protected] #故障接受邮件地址,可以多个 } notification_email_from [email protected] #故障发送邮件地址 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
至此网站集群架构配置完成!