前沿导读
随着业务的不断扩展和用户数量的不断增加,现有服务器的压力不断增加,并且随着对系统稳定性要求的不断提高,需要负载均衡设备对现有服务器进行负载均衡,将大量的用户请求分发到多台服务器上面,同时实现服务器的冗余备份,单台设备故障不影响系统的正常服务。
除了实现上述功能之外,还要求负载设备具有高速的流量处理能力,即要求设备不能成为现有系统的网络瓶颈,同时设备还要求具有较高的安全性,不能降低现有系统的安全级别。
我们的目标是什么?
系统建设的总体目标:
1、高性能,系统必须具有高速的流量处理能力,不能成为系统的网络瓶颈。
2、高可靠性,系统运行稳定,单一设备故障不能影响系统的正常运行。
初识主角IPVS!
提到IPVS就不得不提LVS(Linux Virtual Server),LVS的全称是Linux vitual server,是由章文嵩博士开发的一款开源软件,其体系架构如下图:
一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer)。负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访 问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检 测节点或服务进程故障和正确地重置系统达到高可用性。由于这种负载调度技术是在Linux内核中实现的,所以称之为Linux虚拟服务器(Linux Virtual Server)。
在调度器的实现技术中,IP负载均衡技术是效率最高的。本文也主要讲ipvs, ipvs工作在kernel中,是真正的用于实现根据定义的集群转发规则把客户端的请求转发到特定的realserver,而ipvsadm是工作在用户空间的一个让用户定义ipvs规则的工具。故我们只要在server上装了ipvsadm软件包就可以定义ipvs规则,而在linux kernel的2.6版本之后kernel是直接支持ipvs的。
IPVS负载的三种模式:
Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。这样集群系统的吞吐量就有很大提升。
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。
Virtual Server via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。
IPVS是怎么运作的?
NAT | DR | TUN | |
对外响应的处理方式 | 内部网路,可不同网段. 真实机网关需要指向调度机,所有输入输出进过调度机 | 单一网段的区域网络,所有响应真实机自行处理,返回用户 | 任何区域网络和Internet网络,所有响应真实机自行处理,返回用户 |
真实服务器理论上的最大数量 | 10-20 | >100 | >100 |
群集的最大效率 | 低 | 最佳 | 佳 |
对于真实服务器的要求 | 无 | 必须支持封包过滤或是能够忽略ARP封包 | 必须持持IP Tunneling技术 |
realserver网关 | 调度器的ip地址 | 自己的网关 | 自己的网关 |
注: 以上三种方法所能支持最大服务器数目的估计是假设调度器使用100M网卡,调度器的硬件配置与后端服务器的硬件配置相同,而且是对一般Web服务。使用更 高的硬件配置(如千兆网卡和更快的处理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应地改变。所以,以上数据估计主要是为三种方法的伸缩性进行量化比较。
简单来说:
NAT:简单理解,就是数据进出都通过调度器,性能不是很好。
TUN:简单理解:请求经过调度器,由后端真实服务器直接响应,必须支持隧道协议,有ip隧道的开销,也有额外公网ip需求。
DR: 简单理解,客户端请求通过调度器,调度器转发给真实服务器,真实服务器会直接返回给客户端而不通过LVS,性能最好,这个模式也是最常用的。
IPVS常见负载调度算法
针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下八种负载调度算法:
轮叫(Round Robin)
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
加权轮叫(Weighted Round Robin)
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
最少链接(Least Connections)
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
基于局部性的最少链接(Locality-Based Least Connections)
"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。
目标地址散列(Destination Hashing)
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
源地址散列(Source Hashing)
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
IPVS集群设计
使 用IPVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用Server Array表示,最底层的数据共享存储层,用Shared Storage表示。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS的体系架构如图:
ipvs经常会和keepalived配合使用以保证高可用性,下图中是配合keepalived使用,即实现了负载,又保证了高可用。如下图所示:
所需软件:ipvsadm、keepalived
这两个软件包在系统盘中自带,使用rpm或yum命令安装之后进行配置即可,不需要额外的硬件设备或软件授权需求。
注:
上图是以简单的web应用为例,如果负载均衡设备和真实服务器之间加入session共享更优
IPVS集群配置
以DR模型为例,DR模型也是用的最多的一个类型。
Keepalived环境说明
日志文件: | /var/log/keepalived/keepalived.log 默认keepalived日志会写入/var/log/messages文件中;这里将keepalived日志文件单独存放以便查看。 |
系统服务: | keepalived (service keepalived start|stop|status) |
主配置文件: | /etc/keepalived/keepalived.conf |
说明:
将lvs负载部分写入到keepalived主配置文件即可,由keepalived负责调度。
修改日志文件存放位置
两个节点均执行:
修改/etc/sysconfig/keepalived文件:
更改KEEPALIVED_OPTIONS="-D –d –S 0"
修改/etc/rsyslog.conf文件,添加以下行即可:
local0.* var/log/keepalived/keepalived.log
重启rsyslog服务:
# service rsyslog restart
之后keepalived日志文件即可在/var/log/keepalived/keepalived.log文件中查看
配置keepalived集群
修改主配置文件(主节点)
该配置文件中可以加入检查后端应用的脚本。
# cd etc/keepalived/
# cp keepalived.conf keepalived.conf.old
# >keepalived.conf
# vi keepalived.conf
! Configuration File for keepalived
global_defs { router_id LVS_web }
#定义脚本 #vrrp_script chk_port { # script "/etc/keepalived/check_port.sh" # interval 5 #}
vrrp_instance web_1 { state BACKUP interface eth0 virtual_router_id 100 priority 200 advert_int 1 authentication { auth_type PASS auth_pass 1111 }
#master恢复后不抢占 nopreempt
virtual_ipaddress { 192.168.0.100 }
#执行脚本 #track_script { # chk_port #}
}
virtual_server 192.168.0.100 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP
real_server 192.168.0.30 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.40 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.50 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }
}
|
修改主配置文件(备节点)
# cd etc/keepalived/
# cp keepalived.conf keepalived.conf.old
# >keepalived.conf
# vi keepalived.conf
! Configuration File for keepalived
global_defs { router_id LVS_web }
vrrp_instance web_1 { state BACKUP interface eth0 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } nopreempt
virtual_ipaddress { 192.168.0.100 }
}
virtual_server 192.168.0.100 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP
real_server 192.168.0.30 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.40 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.50 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }
}
|
这样keepalived+lvs端即配置完毕。
Keepalived服务启动与关闭:
启动:
# service keepalived start
关闭:
# service keepalived stop
状态查看
# service keepalived status
配置realserver端
由于负载之后是由Realserver端直接响应客户端,所以需要在realserver端写入vip地址并忽略arp请求,这里以脚本的形式写入vip,将该脚本写入services方便控制。
这里脚本名称命名为realserver,路径为/etc/init.d/目录。
/etc/init.d/realserver
#!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.0.100 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up 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 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 echo "LVS-DR real server Running." ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down 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 "LVS-DR real server Stopped." ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac |
# chkconfig realserver on
# service realserver start
这样一个简单的ipvs的DR模型的负载均衡群集创建完成,之后即可通过vip:port的形式访问服务器。
不想走丢的话,请关注公众号 恒生DBA公社:hs_dba