**html
**前端
随着业务的扩展和用户数量的增长,现有服务器的压力不断增长,而且随着对系统稳定性要求的不断提升,须要负载均衡设备对现有服务器进行负载均衡,将大量的用户请求分发到多台服务器上面,同时实现服务器的冗余备份,单台设备故障不影响系统的正常服务。
除了实现上述功能以外,还要求负载设备具备高速的流量处理能力,即要求设备不能成为现有系统的网络瓶颈,同时设备还要求具备较高的安全性,不能下降现有系统的安全级别。linux
一、高性能,系统必须具备高速的流量处理能力,不能成为系统的网络瓶颈。
二、高可靠性,系统运行稳定,单一设备故障不能影响系统的正常运行。
三、良好的系统扩充能力,随着访问量的增长可以知足系统扩充需求。
四、系统具备良好的可管理性。
五、不对现有的系统进行大规模的调整。web
说起IPVS就不得不提LVS(Linux vitual server),LVS是由章文嵩博士开发的一款开源软件,其体系架构以下图:算法
一组服务器经过高速的局域网或者地理分布的广域网相互链接,在它们的前端有一个负载调度器(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)
经过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文经过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。bash
二、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运做方式的比较:
注:
以上三种方法所能支持最大服务器数目的估计是假设调度器使用100M网卡,调度器的硬件配置与后端服务器的硬件配置相同,并且是对通常Web服务。使用更高的硬件配置(如千兆网卡和更快的处理器)做为调度器,调度器所能调度的服务器数量会相应增长。当应用不一样时,服务器的数目也会相应地改变。因此,以上数据估计主要是为三种方法的伸缩性进行量化比较。
简单来讲:
NAT:就是数据进出都经过调度器,性能不是很好。
TUN:请求通过调度器,由后端真实服务器直接响应,必须支持隧道协议,有ip隧道的开销,也有额外公网ip需求。
DR: 客户端请求经过调度器,调度器转发给真实服务器,真实服务器会直接返回给客户端而不经过LVS,性能最好,这个模式也是最经常使用的。
针对不一样的网络服务需求和服务器配置,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架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用Server Array表示,最底层的数据共享存储层,用Shared Storage表示。在用户看来全部的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS的体系架构如图:
ipvs常常会和keepalived配合使用以保证高可用性,下图中是配合keepalived使用,即实现了负载,又保证了高可用。以下图所示:
所需软件:ipvsadm、keepalived
这两个软件包在系统盘中自带,使用rpm或yum命令安装以后进行配置便可,不须要额外的硬件设备或软件受权需求。
注:
上图是以简单的web应用为例,若是负载均衡设备和真实服务器之间加入session共享更优。
以DR模型为例,DR模型也是用的最多的一个类型。
Keepalived环境说明
说明:
将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的形式访问服务器。
原文地址:http://rdc.hundsun.com/portal...
更多干货,扫码跟住哟~