一、LVS(Linux Virtual Server)
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,LVS工作在ISO模型中的第四层,由于其工作在第四层,因此与iptables类似,必须工作在内核空间上。因此lvs与iptables一样,是直接工作在内核中的,叫ipvs,主流的linux发行版默认都已经集成了ipvs,因此用户只需安装一个管理工具ipvsadm即可。
ipvs中实现了三种负载均衡技术:
1、VS/NAT --- Virtual Server via Network Address Translation
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端真实服务器;真实服务器的响应报文通过调度器时,报文源地址被重写再返回给客户,完成整个负载调度过程。但通常在流量比较大的情况下会造成调度器的瓶颈。因为服务数据的返回必须通过调度器出去。
2、VS/TUN --- Virtual Server via IP Tunneling
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器 把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。但是目前支持TUN 只有Linux系统
3、VS/DR --- Virtual Server via Direct Routing
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术 可极大地提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上。也就是说,在这种结构中,数据从外部到内部真实服务器的访问会通过调度器进来,但是真实服务器对其的应答不是通过调度器出去。 即在大多数情况下,真实服务器可以通过各自的网关或者专用的网关对数据进行外发,从而降低调度器负载。
LVS优点:
1、抗负载能力强,因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的 lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和 cpu方面基本无消耗。
2、配置性低,这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。
3、工作稳定,因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定的。
4、无流量,上面已经有所提及了。lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。
5、基本上能支持所有应用,因为lvs工作在4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等等。
但是LVS需要手工动态增加命令,所以需要Keepalived来实现自动配合。
二、Keepalived
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
Keepalived根据配置文件进行监控,向LVS提供信息,自动检测各调度器可用性,从而实现虚拟IP(即master机)由哪台机器服务。就是指定哪些机器一块虚拟出哪个IP。还有在虚拟的IP上提供哪个端口映射到哪些后端真实服务器从而实现后端服务的负载均衡(可自动检测出哪些不可用)
三、环境准备
一般需要4台机器,2台做为双机备份的调度器(VIP同时只能存在其中一台机上,另一台闲着的),另2台做为真实应用服务器(realserver)如web服务器。其中调度器可以增加为多台(浪费),realserver也可以增加为多台。
1、CentOS01 --- MASTER,ip:192.168.1.103
2、CentOS02 --- realserver,ip:192.168.1.104
3、CentOS03 --- realserver,ip:192.168.1.104
4、CentOS04 --- BACKUP,ip:192.168.1.102
四、LVS + Keepalive安装配置
1、CentOS02中安装httpd服务器
yum install httpd
2、CentOS02中启动httpd
service httpd start
3、CentOS02中http的项目发布到目录/var/www/html,创建index.html文件
touch index.html
4、关闭防火墙 --- 所有服务器
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
关闭防火墙后,访问index.html
5、CentOS02中进入/etc/init.d/目录,创建realserver脚本
touch realserver
realserver脚本内容如下:--- 配置虚拟IP(VIP)
#!/bin/bash
#description:realserver
SNS_VIP=192.168.1.135 #定义虚IP(VIP)
. /etc/rc.d/init.d/functions #导脚本库
case "$1" in #case语句 $1传递给该shell脚本的第一个参数
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP #设置Lo:0 VIP netmask 及广播
/sbin/route add -host $SNS_VIP dev lo:0 ##route del 增加本地路由
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 # -p (default /etc/sysctl.conf) 将标准信息输入设备空文件
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1 #route del 删除本地路由
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}" #$0 是脚本本身的名字
exit 1 #表示进程正常退出
esac #case结束
exit 0 #表示进程非正常退出
参数说明:arp_ignore、arp_announce,用于
arp_ignore:用来配置对arp请求的响应模式,每种模式表示的含义如下:
0 :(默认值)回应任何网络接口上对任何本地IP地址的arp查询请求
1 :只回答目标IP地址是来访网络接口本地IP地址的ARP查询请求
2 :只回答目标IP地址是来访网络接口本地IP地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 :不回应该网络接口的arp请求,而只对设置的唯一和连接地址做出回应
4-7 :保留未使用
8 :不回应所有(本地地址)的arp查询
arp_announce:用来配置发送arp请求的模式,每种模式含义如下:
0:(默认值)使用任何interface上的任何本地地址,在此模式下无论使用哪个接口发送arp请求,arp请求包里的源ip地址在arp层不会做修改,也就是arp请求包里的源ip地址为即将发送ip数据包的源ip地址。
1:避免这个interface的不在目标子网里的本地地址,当ARP请求包里的目的IP地址是需要经过路由达到的时候很有用,此时会检查来访IP是否为所有接口上的子网段内ip之一,如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
2:对arp请求包使用最适当的本地IP地址,在此模式下将忽略即将发送IP数据包的源地址,并尝试选择与能与该目的地址通信的本地地址,首先是选择与目标IP地址属于同一子网的接口IP地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送,当内网的机器要发送一个到外部的ip包,那么它就会请求路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用即将发送ip包的源ip地址作为arp里面的源ip地址(0模式),而不是使用发送设备上面的,如果设置arp_announce为2,则使用发送设备上的ip地址。
6、CentOS02中给realserver脚本授权
chmod 775 /etc/init.d/realserver
7、CentOS02启动realserver
/etc/init.d/realserver start
8、CentOS03中执行1-7步骤
9、CentOS01中安装keepalived
yum -y install ipvsadmin keepalived
10、CentOS01中修改/etc/keepalived/keepalived.conf配置文件
global_defs { ##全局配置部分
# notification_email { ##下面几行均为全局通知配置,可以实现出现问题后报警,但功能有限,因此注释掉,并采用Nagios监视lvs运行情况
# [email protected]
# }
# notification_email_from [email protected]
# smtp_server smtp.exmail.qq.com
# smtp_connect_timeout 30
router_id LVS_DEVEL ##设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 { ##设置vrrp组,唯一且同一LVS服务器组要相同
state MASTER ##主机LVS服务器设置为MASTER,备机LVS服务器设置为BACKUP
interface ens33 # #设置对外服务的接口
virtual_router_id 51 ##设置虚拟路由标识
priority 100 #设置优先级,数值越大,优先级越高,backup设置为99,这样就能实现当master宕机后自动将backup变为master,而当原master恢复正常时,则现在的master再次变为backup。
advert_int 1 ##设置同步时间间隔
authentication { ##设置验证类型和密码,master和buckup一定要设置一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { ##设置VIP,可以多个,每个占一行
192.168.1.135
}
}
virtual_server 192.168.1.135 80 {
delay_loop 6 ##健康检查时间间隔,单位s
lb_algo wrr ##负载均衡调度算法设置为加权轮叫,详细调度算法查看本文中第五项介绍
lb_kind DR ##负载均衡转发规则
nat_mask 255.255.255.0 ##网络掩码,DR模式要保障真实服务器和lvs在同一网段
persistence_timeout 50 ##会话保持时间,单位s,在会话保持的时间内,继续访问虚IP,对应的real_server不变化
protocol TCP ##协议
real_server 192.168.1.104 80 { ##真实服务器配置,80表示端口
weight 3 ##权重
TCP_CHECK { ##服务器检测方式设置 keepalived的健康检查方式 有:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
connect_timeout 5 ##连接超时时间
nb_get_retry 3 ##失败重试次数
delay_before_retry 3 ##失败重试的间隔时间
connect_port 80 ##连接的后端端口
}
}
real_server 192.168.1.105 80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
11、CentOS01中启动keepalived
service keepalived start
12、访问CentOS01中配置的虚IP(VIP)
如果无法访问,查看日志:
tail -f /var/log/messages
13、CentOS04中执行9-11 创建备机,注意如下几点:
(1)步骤10中keepalived.conf文件中的MASTER改成BACKUP
(2)步骤10中priority的值由100改成99(只要比100下就可以)
五、LVS中的调度算法
1:轮叫调度(Round-Robin Scheduling)
2: 加权轮叫调度(Weighted Round-Robin Scheduling)
3:最小连接调度(Least-Connection Scheduling)
4:加权最小连接调度(Weighted Least-Connection Scheduling)
5:基于局部性的最少链接(Locality-Based Least Connections Scheduling)
6:带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
7:目标地址散列调度(Destination Hashing Scheduling)
8:源地址散列调度(Source Hashing Scheduling)
9:最短预期延时调度(Shortest Expected Delay Scheduling)
10:不排队调度(Never Queue Scheduling)
对应: rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq