LB(Load balance)负载均衡集群
LVS-[NAT+DR]单实例实验
LVS+keeplived实验
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
逻辑可分为:
1调度层 (Director):它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
2[服务器池(server pool)/集群层(Real server)]:是一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
3共享存储:它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
从实现上可分为三种模式
1.网络地址转换模式NAT模式:调度器将请求的目标ip即vip地址改为realserver的ip 返回包也经过调度器。调度器再把源地址修改为vip地址
2.隧道模式TUN模式:调度器将请求来的数据包封装加密通过ip隧道转发到后端的real server 上,而realserver 会直接报数据包返回给客户端,而不经过调度器。
3直接路由模式DR 模式:调度器将请求来的数据包的目标mac地址改为realserver的mac地址返回的时候,不进过调度器,直接返回客户端。
Director接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户。
例如:客户端cip-----------eth0:192.168.1.5 mac:01:29:0c:8d:1a
调度器Director dip---eth0:192.168.1.6 mac:02:29:0c:8d:1b
集群层服务器a rip ---eth0:192.168.1.7 mac:03:29:0c:8d:1c
DR 原理:当一个客户端(client)发送一个web请求包到调度器(Direcotr)时,调度器服务器根据负载均衡算法从服务器池(serverpool)中选择一台服务器(realserver),然后将client客户端的请求包的目标mac地址改为选择的服务器(real-server)的mac地址,发送给被选择的服务器(Real-server)即:目标服务器,最后该服务器(Real-server)收到包拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,注:【此时源src-ip与目标dsc-ip对调】发送到局域网。如果client与LVS同一网段,那么client(192.168.57.135)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。
实例说明例如:
1.客户端发送一个web请求包 信息如下:
源ip(src-ip):192.168.1.5 ---》 目标ip(dsc-ip):192.168.1.6
源mac(Src-mac):01:29:0c:8d:1a ---》 目标mac(dsc-ip):mac:02:29:0c:8d:1b
2.当调度器服务器Director收到包后将client客户端的请求包的目标mac地址改为选择的服务器(real-server)的mac地址,发送到局域网(广播):被选择的服务器(Real-server)。
此时包信息如下:
源ip(src-ip):192.168.1.5 ------》目标ip(dsc-ip):192.168.1.6
源mac(Src-mac):02:29:0c:8d:1b ---- 》目标mac(dsc-ip):mac:03:29:0c:8d:1c
3.Real-server服务器收到包拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,注:【此时源src-ip与目标dsc-ip对调】发送到局域网。
此时报信息如下:
源ip(src-ip):192.168.1.6 ---》 目标ip(dsc-ip):192.168.1.5
源mac(Src-mac): mac:03:29:0c:8d:1c---》 目标mac(dsc-ip):mac:01:29:0c:8d:1a
4.如果client与LVS同一网段,那么client将直接收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。
DR模型详解:
DR模型:直接路由模型,每个Real Server上都有两个IP:VI(流动ip)和RIP(外网ip),但是VIP是隐藏的,就是不能提高解析等功能,只是用来做请求回复的源IP的,Director调度服务器上只需要一个网卡,然后利用别名来配置两个IP:VIP和DIP
注释:Director在接受到外部主机的请求的时候转发给Real Server的时候并不更改目标地址,只是通过arp解析的MAC地址进行封装然后转给Real Server,Real Server在接受到信息以后拆除MAC帧封装,然后直接回复给CIP。
企业中最常用的就是LB架构就是DR模型
特点和架构要求:
1、各个集群节点必须和Director在同一个物理网络中
2、RIP地址不能为私有地址,可以实现便捷的远程管理和监控
3、Director仅仅负责处理入站请求,响应报文则由Real Server直接发往客户端。
4、集群节点Real Server 的网关一定不能指向DIP,而是指向外部路由
5、Director不支持端口映射
6、Director能够支持比NAT多很多的Real Server
注意:由于在负载均衡集群和高可用集群的时候要求服务器的时间必须一致,否则将会出现服务不协调等致命性的错误,我们这里把DR设置成为时间服务器,来为RS1和RS2提供时间校准,从而来保证负载均衡集群的正常运行!(关于时间服务器NTP-SERVER的搭建和配置我会在后两天的时间里发表博文详细介绍时间服务器的安装和配置),当然如果没有时间服务器也可以自己手动设置各个服务器的时间来保证时间的一致性!
LB三种模式比较
这几种模式的简单比较:
1.NAT
优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配Internet的保留私有地址,只有负载均衡器需要一个合法的IP地址。
缺点:扩展性有限。当服务器节点(普通PC服务器)数据增长到20个或更多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包都需要经过负载 均衡器再生。假使TCP包的平均长度是536字节的话,平均包再生延迟时间大约为60us(在Pentium处理器上计算的,采用更快的处理器将使得这个 延迟时间变短),负载均衡器的最大容许能力为8.93M/s,假定每台物理服务器的平台容许能力为400K/s来计算,负责均衡器能为22台物理服务器计 算。
2.TUN
优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能 为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用TUN方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个 Virtual Server能达到1G的吞吐量。
缺点:但是,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,我仅在Linux系统上实现了这个,如果你能让其它操作系统支持,还在探索之中。
3. DR
优点:和TUN一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与TUN相比,DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器,其中包括:Linux、Solaris 、FreeBSD 、windows、IRIX 6.5;HPUX11等。
不足:要求负载均衡器的网卡必须与物理网卡在一个物理段上。
三种IP负载均衡技术的优缺点比较:
杂项 NAT TUN DR
服务器操作系统 任意 支持隧道 多数(支持Non-arp )
服务器网络 私有网络 局域网/广域网 局域网(外网组成)
服务器数目(100M网络) 10-20 100 多(100)
效率 一般 高 最高
四、LVS的几种调度算法
1.轮叫调度(Round Robin)(简称rr)
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
2.加权轮叫(Weighted Round Robin)(简称wrr)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3.最少链接(Least Connections)(LC)
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
4.加权最少链接(Weighted Least Connections)(WLC)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
5.基于局部性的最少链接(Locality-Based Least Connections)(LBLC)
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近 使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。
6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)(LBLCR)
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器 组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台 服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程 度。
7.目标地址散列(Destination Hashing)(DH)
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
8.源地址散列(Source Hashing)(SH)
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
9. 最短的期望的延迟(Shortest Expected Delay Scheduling SED)(SED)
基于wlc算法。这个必须举例来说了
ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算
A(1+1)/1
B(1+2)/2
C(1+3)/3
根据运算结果,把连接交给C 。
10.最少队列调度(Never Queue Scheduling NQ)(NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算
试验:LVS NAT模式
环境:三台服务器:Direcotr(lvs)两台realserver。RS1和RS2
Direcotr有块网卡eth0 外网:192.168.1.105 内网网卡eth1:192.168.2.105
RS1 一块激活的内网网卡eth1:192.168.2.106
RS2 一块激活的内网网卡eth1:192.168.2.107
安装配置:
1.Direcotr(lvs)配置
(1)安装核心服务ipvsadm
yum install -y ipvsadm
(2)Direcotr上编辑nat实现脚本
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
#director服务器上开启路由转发功能;
echo 1 >/proc/sys/net/ipv4/ip_forward
#关闭icmp的重定向
echo 0 >/proc/sys/net/ipv4/conf/all/send_redirects
echo 0 >/proc/sys/net/ipv4/conf/default/send_redirects
echo 0 >/proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 >/proc/sys/net/ipv4/conf/eth1/send_redirects
#dirctor设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
#针对nat表 postrouteing列 -s从内外网发送过来的包,-j作为一个MASQUERADE伪装.
#director设置ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.1.105:80 -s rr
$IPVSADM -a -t 192.168.1.105:80 -r 192.168.2.106:80 -m
$IPVSADM -a -t 192.168.1.105:80 -r 192.168.2.107:80 -m
#-s 制定算法.-m 设置为nat模式 -w 设定权重 .先不设置。
2.RS1配置
(1)安装nginx
yum install -y nginx
(2)配置RS1-eth1:192.168.2.106
网关指向lvs设定为-eth1:192.168.1.105
(3)配置测试页面:
echo "rs1--rs1---rs1---1111111">/usr/share/nginx/html/index.html
(4)启动nginx:
server nginx start
RS2配置
(1)安装nginx
yum install -y nginx
(2)配置RS1-eth1:192.168.2.107
网关指向lvs设定为-eth1:192.168.1.105
(3)配置测试页面:
echo "rs2--rs2---rs2---222222">/usr/share/nginx/html/index.html
(4)启动nginx:
server nginx start
测试:运行Direcotr配置文件
sh /usr/local/sbin/lvs_nat.sh
curl测试:
curl 192.168.1.105
平均分担 成功。
设置权重测试
vim /usr/local/sbin/lvs_nat.sh
$IPVSADM -A -t 192.168.1.105:80 -s wrr
$IPVSADM -a -t 192.168.1.105:80 -r 192.168.2.106:80 -m -w 2
$IPVSADM -a -t 192.168.1.105:80 -r 192.168.2.107:80 -m -w 1
#-s 制定算法.-m 设置为nat模式 -w 1是权重为2
测试:curl 192.168.1.105
成功。
试验:LVS DR模式
环境说明:
如果client与LVS同一网段,那么client将直接收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。这里为了实验方便统一将ip设置到同一网段:192.168.1.0网段。
客户端cip------------eth0:192.168.1.108
调度器(LVS)Director dip---eth0:192.168.1.5
集群层服务器 rip1 ---eth0:192.168.1.6
集群层服务器 rip1 ---eth0:192.168.1.7
配置:director
清空之前NAT实验的ipvsadm 规则
查看:ipvsadm -ln
清空:ipvsadm -C
清空防火墙规则:iptables -t nat -F
设置网卡eth0 ip:192.168.1.105
编辑增加配置文件
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
#director服务器上开启路由转发功能;
echo 1 >/proc/sys/net/ipv4/ip_forward
#设置增加vip.
#这里我们增加变量代替ip
vip=192.168.1.5
rs1=192.168.1.106
rs2=192.168.1.107
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
#在绑eth0上面绑定vip.
route add -host $vip dev eth0:0
#加载rule
ipvsadm -C
ipvsadm -A -t $vip:80 -s wrr
ipvsadm -a -t $vip:80 -r $rs1:80 -g -w 1
ipvsadm -a -t $vip:80 -r $rs2:80 -g -w 1
保存退出。
运行:lvs_nat.sh
sh /usr/local/sbin/lvs_nat.sh
查看ip 显示eht0:0 为192.168.1.105
配置RS1 RS2
设置RS1eth0 为192.168.1.106
设置RS2eth0 为192.168.1.107
RS1,RS2增加相同的配置文件
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
#设置增加vip
vip=192.168.1.5
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
#在回环地址上绑定vip.
route add -host $vip lo:0
#关闭ARP广播响应
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
保存退出
RS1,RS2运行lvs_lnet.sh
sh /usr/local/sbin/lvs_nat.sh
查看ip都出现lo:0为192.168.1.105
测试
开启第四台电脑:192.168.1.108测试
curl 192.168.1.5
测试ok
改变权重测试
保存退出后查看ipvsadm规则
发现权重并没有生效,所以需要在配置文件中添加down 掉eth0:0行在启动即可。
ifconfig eth0:0 down如图
在查看:已经生效
测试:cur 192.168.1.5
成功
问题1:为什么需要开启第四台机测试不能用director测试吗?
因为:director ,rs1. rs2 都配置了 vip (192.168.1.5),本机测试则显示本机web信息。Director测试时,Director 配置文件中子网掩码设置为255.255.255.255,即无法收到返回的数据包。
试验:LVS结合keeplived配置
1.实验环境:
准备一台主服务器配置master:(keeplived+lvs),和一台从服务器slave(从)(keeplived+lvs),及两台RS1,RS2,和一台客户端 总共5台虚拟机,当然RS2也可作为一台keeplived+lvs的存服务器,即四台服务器就可以。这里我们准备五台服务器进行试验。
1.主:192.168.1.105
2.从:192.168.1.108
3.RS1:192.168.1.106
4.RS2:192.168.1.107
5.CIP:192.168.1.220
主,从都安装lvs 核心程序和keeplived程序:
yum install -y ipvsadm
yum install -y keeplived
之前我们做个ipvsadm试验这里我们无需再次安装只需清空ipvsadm规则,即停掉eth0:0
ipvsadm -C
ifconfig eth0:0 down
编辑主 :keepalived配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
jimo291@gmail.com #email 通知
}
notification_email_from jimo291@gmail.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS1 # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_sync_group test { #设置vrrp组
group {
loadbalance
}
}
vrrp_instance loadbalance {
state MASTER #设置lvs的状态,报错MASTER和BACKUP两种,必须大写
interface eth0 #设置对外服务的接口
lvs_sync_daemon_inteface eth0 #设置lvs监听的接口
virtual_router_id 51 #设置虚拟路由表示
priority 180 #设置优先级,数值越大,优先级越高
advert_int 5 #设置同步时间间隔
authentication { #设置验证类型和密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置lvs vip
192.168.1.5
}
}
virtual_server 192.168.1.5 80 {
delay_loop 6 #健康检查时间间隔
lb_algo rr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
#persistence_timeout 20 #设置会话保持时间,对bbs等很有用
protocol TCP #协议
real_server 192.168.1.106 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.107 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
保存退出。
编辑增加ipvsadm配置文件
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
#director服务器上开启路由转发功能;
echo 1 >/proc/sys/net/ipv4/ip_forward
保存退出。
主执行此脚本
sh /usr/local/sbin/lvs_nat.sh
配置从:
主从配置文件没有多大区别所以我们直接上传覆盖修改即可
scp /etc/keepalived/keepalived.conf 192.168.1.108:/etc/keepalived/
更改priority 180为170
更改stat MASER 为 state BACKUP
router_id LVS1 为router_id LVS2
保存即可。
Keepliaved 的配置文件详细介绍论坛:HA集群有详细介绍这里不多说。
配置图:
scp /usr/local/sbin/lvs_nat.sh 192.168.1.108:/usr/local/sbin/
主从都启动keepalived
service keepalived start
从执行此脚本
sh /usr/local/sbin/lvs_nat.sh
RS1配置
安装nginx
yum install -y nginx
etho ip 192.168.1.106
RS2配置
yum install -y nginx
echo ip 192.168.1.106
在RS1,RS2上增加相同配置
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
#设置增加vip
vip=192.168.1.5
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
#在回环地址上绑定vip.
route add -host $vip lo:0
#关闭ARP广播响应
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
保存退出。
启动nginx
service nginx start
RS1,RS2都执行此脚本
sh /usr/local/sbin/lvs_nat.sh
查看主:ipvsadm -ln 规则
Ipvsadm 规则
查看从:
ip addr
OK 查看从理论说从是不会显示vip的,只有当主宕掉以后从才会加载vip
测试查看
service keepalived stop
ip addr
Ok 当我们停掉主keeplived时 再次查看从
vip 自动加载ok
测试客户端192.168.1.220测试
客户端测试没有问题。
当我们停掉RS1时
Service nginx stop
客户端测试:
查看DR
菜鸟入门级配置完结