最近学习服务高可用,负载均衡相关知识,了解到了lvs
和keepalived
这两个简单易用且功能强大的工具,接下来对我的学习进行总结一番。
VRRP (Virtual Router Redundancy Protocol,虚拟路由器冗余协议)
lvs是osi中的4层负载均衡,与7层负载均衡不同的是,lvs不解析应用协议(HTTP/FTP等),根据报文的ip和端口,决定选择最终最优的内部服务器。
lvs有两种工作模式:NAT和DR
VRRP协议可以认为是实现路由器高可用的协议,简单的说,当一个路由器故障时可以由另一个备份路由器继续提供相同的服务。
设计产生了虚拟路由器冗余协议(VRRP),采用了静态缺省路由的方法,并且很好的避免了单点故障。协议定义的选举过程提供了一个当负责转发的主路由器失效时,备份路由器可以接替负责转发的动态容错机制。VRRP协议的这一优点使得每一个端主机不用配置任何动态路由协议或者路由发现协议,就可以获得更高的可靠性
NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。
DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。
DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。
DR-Master:192.168.59.1
DR-Backup:192.168.59.2
RS-Node1:192.168.59.3
RS-Node2:192.168.59.4
VIP:192.168.59.5
四台虚拟机关闭防火墙service iptables stop.
两台DR虚拟机安装keepalived+ipvsadmyum -y install keepalived ipvsadm
两台DR配置keepalived.conf
文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #报警邮箱,可注释掉
}
notification_email_from [email protected]
smtp_server 192.168.59.1 #这里一定要真实IP
smtp_connect_timeout 30
router_id localhost #通常为hostname,但不一定非得是
}
vrrp_instance VI_1 { #vrrp实例定义部分
state MASTER #设置lvs的状态,MASTER和BACKUP两种,必须大写
interface eth0 #设置对外服务的接口
virtual_router_id 51 #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示
priority 150 #定义优先级,数字越大优先级越高
advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #主要有PASS和AH两种
auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同
}
virtual_ipaddress {
192.168.59.5 #VIP,可以写多个,每行一个
}
}
virtual_server 192.168.20.134 80 { #设置虚拟服务器,需要指定虚拟ip和服务端口
delay_loop 6 #健康检查时间间隔
lb_algo rr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
nat_mask 255.255.255.0
persistence_timeout 0 #设置会话保持时间,对动态网页非常有用
protocol TCP #转发协议,TCP和UDP两种
# sorry_server 192.168.59.6 80 #相当于一个备用节点,在所有 real server 失效后,这个备用节点会启用
real_server 192.168.59.3 80{ #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 1 #设置权重,数字越大权重越高
TCP_CHECK {
connect_port 80 #连接端口,要和上面的保持一致
connect_timeout 3 #连接超时为10秒
nb_get_retry 3 #重连次数
delay_before_retry 3 #重试间隔
}
}
real_server 192.168.59.4 80{
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
从DR与主DR的配置文件唯一不同的地方如下两处:
state BACKUP #(从DR要写成BACKUP)
priority 100 #(从DR优先级要比主DR数字小)
启动keepalived
/etc/init.d/keepalived start
两台RS安装httpd,分别给主页面作一个不同的标识便于测试
yum -y install httpd
echo "node1" >>/var/www/html/index.html
echo "node2" >>/var/www/html/index.html
两台RS编写如下脚本,此脚本用于节点服务器绑定 VIP
vim /lvs/RS.sh
#!/bin/bash
#description:start realserver
vip=192.168.20.134
source /etc/rc.d/init.d/functions
case $1 in
start)
echo "Start 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)
echo "Stop Realserver"
/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
两台RS分别执行上面写好的脚本
bash /lvs/RS.sh start
用ifconfig
查看VIP是否绑定成功
lo:0 Link encap:Local Loopback
inet addr:192.168.59.5 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
注意
inet addr
后面显示的是vip
两台RS启动httpd
service httpd start
浏览器输入VIP地址:http://192.168.20.134
刷新浏览器循环呈现node1和node2表示OK.
关掉主DR的keepalived查看VIP是否漂移到从DR,浏览器访问还正常表示OK.
keepalived详解dr