1.LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。
2.三个主要组成部分:
负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的。它可以是用IP负载均衡技术的负载调度器,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。
服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
后端存储(backend storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
3.负载均衡方式:
1)NAT:需要修改/etc/sysctl.conf的forward,不需要启动realserver脚本
2)TUN:返回给用户的IP为VIP,需要启动realserver脚本
3)DR:返回给用户的IP为VIP,需要启动realserver脚本,无隧道开销
理论上性能:DR>TUN>NAT
4.负载调度算法
1)轮叫调度(Round-Robin):以轮叫的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。
##平均对待每一台real server,而不管服务器上的实际负载均衡状况和连接状态。
2)加权轮叫调度(Weighted Round-Robin)
##根据real server的不同处理能力来调度请求,可以对每台real server 设置不同的调度权值
3)最小连接调度(Least-Connection):把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一。
##动态地将网路请求调度到已建立的连接数最少的服务器上。如果集群系统的real server具有相近的性能,可以较好的均衡负载。
4)加权最小连接调度(Weighted Least-Connection):最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。
##每个服务器节点可以用相应的权值来表示处理能力,而系统管理源可以动态的设置相应的权值,默认值为1.加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。
5)基于局部性的最少链接(Locality-Based Least Connections):针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。
6)带复制的基于局部性最少链接(Locality-Based Least Connections with Replication):也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。
7)目标地址散列调度(Destination Hashing):针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。
8)源地址散列调度(Source Hashing):正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。
9)最短预期延时调度(Shortest Expected Delay)
10)不排队调度(Never Queue Scheduling)
##################案例1:LVS的DR模式 ###################### 1.网络架构 hostname:CentOS001 DIRECT SERVER:10.10.54.54 vip:10.10.54.53 real server:10.10.54.56(80/3306) real server:10.10.54.58(80/3306) 2.配置两台real server //在real server(56,58)上启动 [root@xiao56 ~]# cat /etc/init.d/realserver ============================================ #!/bin/bash #description:start realserver #script_name:realserver_config VIP=10.10.54.53 source /etc/init.d/functions case "$1" in start) echo "start LVS of realserver." /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 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 ;; stop) /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 "Usage: $0 {start|stop}" exit 1 esac ================================================= [root@xiao56 ~]# chmod +x /etc/init.d/realserver [root@xiao56 ~]# /etc/init.d/realserver start ######## arp_ignore: 0---为默认值,回应任何网络接口上对任何本地IP地址的ARP查询请求 1---只回答目标IP地址是来访问网路接口本地地址的ARP查询请求 arp_announce:对网路接口上,本地IP地址发出的ARP请求,作出相应级别的限制:确定不同程度的限制,宣布对来自本地源IP地址发出ARP请求的接口。 0---为默认值,在任意网络接口上的任何本地地址。 2---对查询目标使用最适当的本地地址。 3.配置direct server(54) //在direct server上编译ipvsadm,keepalived软件包 ##下载 wget http://www.keepalived.org/software/keepalived-1.2.9.tar.gz http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz ##编译ipvsadm [root@CentOS001 softs]# tar xvf ipvsadm-1.26.tar.gz [root@CentOS001 softs]# cd ipvsadm-1.26 1)安装依赖包 yum -y install wget libnl* popt* gcc.x86_64 gcc-c++.x86_64 gcc-objc++.x86_64 kernel-devel.x86_64 make popt-static.x86_64 ## popt-static.x86_64需要额外新加张盘 [root@CentOS001 ~]# vim /etc/yum.repos.d/CentOS-ftp.repo ============================================= [Packages] name=Packages baseurl=ftp://10.201.1.221/Packages gpgcheck=0 enabled=1 [Packages2] name=Packages2 baseurl=ftp://10.201.1.221/Packages2 gpgcheck=0 enabled=1 ============================================== ##记得yum clean all 2)[root@CentOS001 ipvsadm-1.26]# make && make install 3)确认lvs模块 [root@tech2 ipvsadm-1.26]# modprobe -l|grep ipvs ========================================= kernel/net/netfilter/ipvs/ip_vs.ko kernel/net/netfilter/ipvs/ip_vs_rr.ko kernel/net/netfilter/ipvs/ip_vs_wrr.ko kernel/net/netfilter/ipvs/ip_vs_lc.ko kernel/net/netfilter/ipvs/ip_vs_wlc.ko kernel/net/netfilter/ipvs/ip_vs_lblc.ko kernel/net/netfilter/ipvs/ip_vs_lblcr.ko kernel/net/netfilter/ipvs/ip_vs_dh.ko kernel/net/netfilter/ipvs/ip_vs_sh.ko kernel/net/netfilter/ipvs/ip_vs_sed.ko kernel/net/netfilter/ipvs/ip_vs_nq.ko kernel/net/netfilter/ipvs/ip_vs_ftp.ko ====================================== 4)编译keepalive安装 AA)[root@CentOS001 softs]# tar xvf keepalived-1.2.9.tar.gz BB)vim INSTALL In order to compile Keepalived needs the following libraries : =========================== * OpenSSL, <www.openssl.org> * popt ============================= 5)编译 aa)./configure --prefix=/usr/local/keepalived --enable-snmp --sysconfigdir=/etc/ Keepalived configuration ------------------------ Keepalived version : 1.2.9 Compiler : gcc Compiler flags : -g -O2 Extra Lib : -Wl,-z,relro -Wl,-z,now -L/usr/lib64 -lnetsnmpagent -lnetsnmphelpers -lnetsnmpmibs -lnetsnmp -Wl,-E -Wl,-rpath,/usr/lib64/perl5/CORE -lssl -lcrypto -lcrypt -lnl Use IPVS Framework : Yes IPVS sync daemon support : Yes IPVS use libnl : Yes Use VRRP Framework : Yes Use VRRP VMAC : Yes SNMP support : Yes SHA1 support : No Use Debug flags : No ------------------------------- ##安装 yum install -y net-snmp.x86_64 net-snmp-devel.x86_64 bb)make && make install 6)修改配置文件路径 [root@CentOS001 sbin]# cp /usr/local/keepalived/sbin/keepalived /sbin/ [root@CentOS001 bin]# cp /usr/local/keepalived/bin/genhash /bin/ 7)备份配置文件 [root@CentOS001 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak 8)创建VIP [root@CentOS001 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0:1 =========================== DEVICE=eth0:1 ONBOOT=no BOOTPROTO=static IPADDR=10.10.54.53 NETMASK=255.255.255.0 GATEWAY=10.10.54.254 ========================== [root@CentOS001 ~]# /etc/init.d/network restart 9)配置配置文件 [root@CentOS001 keepalived]# cat keepalived.conf ============================================ ! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server mail.ssr.com smtp_connect_timeout 30 router_id LVS_MASTER1 ---表示运行keepalived服务器的一个标识,发邮件时显示在邮件主题中的信息 } vrrp_instance VI_2 { --vrrp实例 state MASTER --主用MASTER标识,从用BACKUP标识 interface eth0 virtual_router_id 51 --虚拟路由标识,是一个数字,同一个VRRP实例使用唯一的标识 ---即同一个vrrp_instance下,MASTER和BACKUP必须一致 priority 100 --优先级,从的优先级要低于主的,用于主从模式,BACKUP的要低于100 advert_int 1 --master和backup检查的时间间隔 authentication { auth_type PASS --认证的类型:PASS和AH auth_pass 1111 } virtual_ipaddress { --虚拟IP,通信中会转移,不发送ARP广播 10.10.54.53/24 dev eth0 label eth0:1 --对外提供服务的IP } } virtual_server 10.10.54.53 80 { delay_loop 6 --设置运行情况检查时间,单位为S lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 --会话保持时间,单位为S,同一台机器只能开启一个,否则用telnet测试会显示不完全 protocol TCP ##HTTP balance real_server 10.10.54.56 80 { weight 1 --权重 TCP_CHECK { connect_timeout 3 nb_get_retry 3 --失败重试的次数 delay_before_retry 3 --重试的时间间隔,,单位为S connect_port 80 } } real_server 10.10.54.58 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } virtual_server 10.10.54.53 3306 { delay_loop 6 --设置运行情况检查时间,单位为S lb_algo rr lb_kind DR # nat_mask 255.255.255.0 # persistence_timeout 50 --会话保持时间,单位为S,同一台机器只能开启一个,否则用telnet测试会显示不完全 protocol TCP ##mysql balance real_server 10.10.54.56 3306 { weight 1 --权重 TCP_CHECK { connect_timeout 3 nb_get_retry 3 --失败重试的次数 delay_before_retry 3 --重试的时间间隔,,单位为S connect_port 3306 } } real_server 10.10.54.58 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } } ================================================================ [root@CentOS001 ~]# /etc/init.d/keepalived restart 注:一个virtual_server内的端口号必须一致,否则会出现连接不上。 4.测试 telnet 10.10.54.53 80/3306 解析:退出重新连接会漂移到另一台realserver上,测试mysql时要启动服务,并授予权限。 ##查看连接数 [root@CentOS001 keepalived]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.10.54.53:80 rr -> 10.10.54.56:80 Route 1 0 0 -> 10.10.54.58:80 Route 1 0 0 TCP 10.10.54.53:3306 rr -> 10.10.54.56:3306 Route 1 1 1 -> 10.10.54.58:3306 Route 1 0 3 扩展: NGINX-->七层 LVS是四层负载均衡 按照OSI模型,IP协议映射到3层网络层协议,TCP和UDP协议映射到4层传输层协议。 要实现一套负载均衡系统,必须基于OSI模型4层以上。以一个例子来做说明原因:假设我们要设计一套支持HTTP,以轮询为分发策略的负载均衡系统,后端有两台Real Server。如果我们的负载均衡系统是基于3层(网络层),要发起HTTP请求,首先需要进行TCP三次握手以建立可靠的传输连接。三次握手会发出若干个数据包,由于基于3层的负载均衡器没有能力知道这些数据包是为了建立连接,只能将数据包以轮询的方式,分别发送到Real Server A和Real Server B。这样TCP的三次握手根本就无法成功。 负载均衡系统必须建立在面对网络连接的基础上,而不是面对数据包的基础上。这套系统需要能够理解传输层网络连接,保证一次连接之内的所有数据包都转发到同一后端真实服务器上去。OSI模型4层(传输层)才能提供可靠的数据传输服务,因此它必须基于OSI模型4层之上。