LVS
LVS 架构
LVS是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层(Director)、server集群层(Real server)和共享存储层。
LVS-DR
DR(调度器将请求来的数据包的目标mac地址改为real server的mac地址,返回的时候也不经过调度器,直接返回给客户端),其实该过程就就是利用“以太网”通讯是通过mac地址的原理,从而让realserver将数据直接返回给目标地址,而不经过DR返回数据
案例lvs-dr
第一步:完成IP地址的配置以及网络配置
第二步:安装相应软件
在RS-1和RS-2上安装nginx,方便测试
yum -y install nginx
Director上安装ipvsadm
yum -yinstall ipvsadm
第三步:配置DR
vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward #启动路由转发功能
ipv=/sbin/ipvsadm
vip=172.16.1.100
rs1=172.16.1.2
rs2=172.16.1.3
ifconfig eth1:0 $vipbroadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth1:0
$ipv -C #清除ipvsadm的规则
$ipv -A -t $vip:80 -s wrr #加权轮训算法
#-A 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
#-a
#-s 表示使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc
#调度算法
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
#-a 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
#-t 说明虚拟服务器提供的是tcp的服务[vip:port] or[real-server-ip:port]
#-r 真实的服务器[Real-Server:port]
#-g 指定LVS 的工作模式为直接路由模式
#-w 真实服务器的权值,如上的配置,两天服务器的权重一样,如访问两次服务,那么一次在rs1上,一次在rs2上。
第四步:配置RS
两台rs上:vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=172.16.1.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore #关闭ARP
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
第五步:启动脚本
然后director上执行: bash /usr/local/sbin/lvs_dr.sh
两台rs上执行: bash/usr/local/sbin/lvs_dr_rs.sh
第六步:在RS-1和RS-2上配置用于测定的web页面,web.html
RS-1上的配置: echo "rs1 web server" >/usr/share/nginx/html/web.html
RS-2上的配置: echo "rs2 web server" >/usr/share/nginx/html/web.html
注意:需启动nginx
第7步:通过curl 172.16.1.100/web.html,其执行结果如下
第8步:在DR上通过ipvsadm可以查看到如下的InActConn为7:7与其定义的 wrr调度方式一致。
其中在这三种IP负载均衡的技术中,DR和TUN模式都需要在真实服务器上对arp_ignore和arp_announce参数进行配置,主要是实现禁止响应对VIP的ARP请求。
在lvs环境中,需要设定以下的参数
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
三、调度算法
LVS主要的调度算法
轮询调度-加权轮询调度-最小连接调度-加权最小连接调度-基于局部性的最少连接-
带复制的基于局部性的最少连接-目标地址散列调度-源地址散列调度
1:轮询算法(RR)就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器
2:加权轮询算法(WRR)主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
3:最小连接调度算法(LC)将把请求调度到连续数量最小的服务器上,
4:加权最小连接算法(WLC)则是给每台服务器一个权值,调度器会尽可能保持服务器连接数量与权值之间的平衡
5:基于局部性的最少连接调度算法(lblc)是请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近的该目标IP地址所有使用的服务器,如果这台服务器依然可用,并且用能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器。
6:带复杂的基于局部性最少的连接算法(lblcr)激励的不是一个目标IP与一台服务器之间的连接记录,他会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负责过高
7:目标地址散列调度算法(DH)也是根据目标IP地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标IP的请求会固定发给该服务器。
8:源地址散列调度算法(SH)与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源
LVS+keeplived
ipvsadm的缺陷是不能判断realserver是否存活,从而导致数据还是会根据dr的调度,发送到存在问题的服务器上。而keepalived就存在检查机制,一单检测到realserver出现故障,就在ipvsadm的表中删除映射关系,从而保证数据的有效性。
keepalived会根据keepalived的配置,自动完成dr的配置,不用单独配置ipvsadm。
本实验主要针对master进行配置,用于测试是否可以完成负载
注意:前面虽然我们已经配置过一些操作,但是下面我们使用keepalived操作和之前的操作是有些冲突的,所以若是之前配置过DR,请首先做如下操作:dr上执行:
ipvsadm -C
ifconfig eth1:0 down
第一步:安装keepalived
yum install-y keepalived
第二步:安装好后,编辑配置文件
vim /etc/keepalived/keepalived.conf #建议备份keepalived.conf的原始配置
vrrp_instance VI_1 {
state MASTER #备用服务器上为 BACKUP
interface eth1
virtual_router_id 51
priority 100 #备用服务器上为90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.200
}
}
virtual_server 192.168.0.200 80 {
delay_loop 6 #(每隔10秒查询realserver状态)
lb_algo wlc #(lvs 算法)
lb_kind DR #(Direct Route)
persistence_timeout 60 #(同一IP的连接60秒内被分配到同一台realserver)
protocol TCP #(用TCP协议检查realserver状态)
real_server 192.168.0.116 80 {
weight 100 #(权重)
TCP_CHECK {
connect_timeout 10 #(10秒无响应超时)
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.0.117 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
第三步:DR和RS的其他配置
以上为主director的配置文件,从director的配置文件只需要修改
state MASTER -> state BACKUP
priority 100 -> priority 90
配置完keepalived后,需要开启端口转发(主从都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward
最后,两个director上启动keepalived服务(先主后从):
/etc/init.d/keepalived start
另外,需要注意的是,启动keepalived服务会自动生成vip和ipvsadm规则,不需要再去执行上面提到的/usr/local/sbin/lvs_dr.sh 脚本。
然后,两个rs上执行 /usr/local/sbin/lvs_dr_rs.sh脚本(如上所示的lvs DR配置的rs脚本)
第四步:关闭192.168.0.117的eth1网口,如下所示,表示keepalived的切换过程
三、LVS-NAT
如下图所示,当192.168.0.111访问realserver提供的服务时,会将请求发送给DR,DR根据其调度算法,确定是将该请求发送给realserver1还是realserver2,当realserver收到该请求后,会将回应信息发送给DR,再由DR回应给192.168.0.111。这就是LVS-NAT的一个工作原理。
案例:
需求:三台服务器一台作为director, 两台作为real server
Director 有一个外网ip (192.168.0.115) 和一个内网ip(172.16.1.1), 两个real server上只有内网ip(172.16.1.2)和(172.16.1.3) 并且需要把两个real server的内网网关设置为director的内网ip(172.16.1.1)。
第一步:配置IP和网络信息
略……
第二步:DR上的配置如下脚本(命名为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/eth1/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth2/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s172.16.1.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.0.200:80 -s wrr
$IPVSADM -a -t 192.168.0.200:80 -r172.16.1.2:80 -m -w 1
$IPVSADM -a -t 192.168.0.200:80 -r172.16.1.3:80 -m -w 1
第三步:运行lvs_nat.sh脚本
sh lvs_nat.sh
第四步:安装nginx,在目录的html目录下,配置如下内容(测试使用),并启动nginx
rs1上: echo "rs1 server" >/usr/share/nginx/html/index.html
rs2上: echo "rs2server" >/usr/share/nginx/html/index.html
第五步:测试结果