CentOS Linux 负载均衡高可用WEB集群之LVS+Keepalived配置
LB集群是locd balance集群的简称、翻译成中文是:负载均衡集群的意思;集群是一组相互独立的、通过高速网络互联的计算机相互之间构成一个组合,并以单一的系统的模式加以管理。LVS是Linux Virtual Server的简写,翻译中文是Linux虚拟服务器,是一个虚拟的服务器集群系统。
负载均衡集群:是为了企业提供更为实用,性价比更高的系统机构解决方案。负载均衡集群把用户的请求尽可能的平均分发到集群的各台计算机上处理,这样每个节点都可以承担一定的访问请求,这些请求访问在各个节点之间是动态分配,以实现负载均衡。负载均衡集群可以:1)、分担访问的流量(负载均衡);2)、保持业务的连续性(高可用)常见的负载均衡软件有:nginx、haproxy、LVS。
高可用集群:指在集群的计算机中,任意一个节点出现故障的情况下,节点上的所有任务自动转移到其他正常的节点上,并且在此过程中不影响整个集群的运行,保持业务的连续性。当一个机器宕机另一台进行接管。比较常用的高可用集群开源软件有:keepalive,heartbeat。
LVS有三种工作模式,三种工作模式如下:
工作模式 VS/NAT VS/TUN VS/DR
Real server Config dr gw Tunneling Non-arp device/tie vip
(节点服务器)
Server Network Private LAN/WAN LAN
Server number Low 10-20 High 100 High 100
(节点数量)
Real server gateway Load balance Own router Own router
优点 地址和端口转换 Wan环境加密数据 性能最高
缺点 效率低 需要隧道支持 不能跨域LAN
常用的调度算法:
固定调度算法:rr,wrr,dh,sh
rr:轮询算法,它将请求依次分配给不同的rs节点,也就是RS节点中均摊分配。这种算法简单,但只适合于RS节点处理性能差不多的情况
wrr:加权轮训调度,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。
dh:目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS
sh:源地址哈希调度(sourcehashing)以源地址为关键字查找一个静态hash表来获得需要的RS
动态调度算法:wlc,lc,lblc,lblcr
wlc:加权最小连接数调度,假设各台RS的全职依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS
lc:最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS.
lblc:基于地址的最小连接数调度(locality-basedleast-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。
LVS+Kkeepalived的VS-DR模式实现web服务的负载均衡高可用
安装的配置:
操作系统:CentOS release 6.7 (Final)
内核版本:2.6.32-573.el6.x86_64
LVS版本:ipvsadm v1.26
keepalived版本:Keepalived v1.2.13
服务器配置:
LVS主服务器:hostname:DR1;eth0:192.168.171.10,VIP:eth0:0192.168.171.100
LVS备服务器:hostname:DR2;eth0:192.168.171.20,VIP:eth0:0192.168.171.100
WEB服务器:
hostname:RS1;eth0:192.168.171.30,VIP:lo:0192.168.171.100
hostname:RS2;eth0:192.168.171.40,VIP:lo:0192.168.171.100
1、分别在两台web服务器(真实服务器)上操作
1)、关闭SELinux
vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效
2)、配置防火墙,开启80端口
vim /etc/sysconfig/iptables #编辑
-A RH-Firewall-1-INPUT -m state --state NEW-m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火墙
:wq! #保存退出
/etc/init.d/iptables restart #重启防火墙使配置生效
3)、绑定LVS虚拟服务器的虚拟IP地址(192.168.171.100)到lo:0,编写的脚本如下:
vim /usr/local/sbin/lvs_rs_dr.sh
#!/bin/bash
#description lvs rs shell
. /etc/rc.d/init.d/functions
vip=192.168.171.100
#打开vip
case "$1" in
start)
echo "Start LVS of Real Server."
/sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev lo:0
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 "close LVS of Real Server."
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
exit 0
chmod +x /usr/local/sbin/lvs_rs_dr.sh #增加脚本的执行权限
echo "/usr/local/sbin/ lvs_rs_dr.shstart" >> /etc/rc.local #添加开机启动(如果需要)
2、分别在两LVS服务器(调度器)上操作
1)、关闭SELinux
vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效
2)、配置防火墙规则
-A RH-Firewall-1-INPUT -d 224.0.0.18 -jACCEPT #允许VRRP(虚拟路由器冗余协议)组播地址通信
-A RH-Firewall-1-INPUT -m state --state NEW-m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火
:wq! #保存退出
/etc/init.d/iptables restart #重启防火墙使配置生效
3)、安装lvs软件(其实是管理LVS的一个工具),和安装高可用软件keepalived。
yum install ipvsadm #Linux 2.6内核已经集成了lvs软件,此处ipvsadm为lvs管理工具
modprobe ip_vs #加载ip_vs
yum install keepalived #yum安装可以解决软件依赖问题,建议源码安装
4)、配置keepalived
keepalived安装的默认配置文件在/etc/keepalived/keepalived.conf
在主服务器上修改keepalived.conf的配置,如下:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局定义部分
global_defs {
notification_email {
[email protected] #设置报警邮件地址,可以设置多个,
#每行一个,需要有sendmail的服务支持
}
notification_email_from [email protected] #设置邮件发送地址
smtp_server 127.0.0.1 #SMTP服务地址
smtp_connect_timeout 30 #设置SMTP服务超时时间
router_id LVS_DEVEL #运行keepalived服务器的一个标识
}
#vrrp实例定义部分
vrrp_instance VI_1 {
state MASTER #主服务器是MASTER,备用服务器是BACKUP
interface eth0 #指定HA监控的网络接口
virtual_router_id 51 #虚拟路由表示,同一个vrrp实例要相同,且唯一
priority 100 #定义优先级,数字越大,优先级越高
advert_int 1 #MASTER和BACKUP负载均衡器之间的检查时间间隔
authentication { #验证类型和密码
auth_type PASS #验证类型:PASS和AH
auth_pass 1111 #密码,同一VRRP实例需要相同
}
virtual_ipaddress {
192.168.171.100 #设置虚拟IP地址,可以多个,一行一个
}
}
#虚拟服务器定义部分
virtual_server 192.168.171.100 80 { #虚拟服务的IP和端口
delay_loop 3 #运行情况检查时间
lb_algo rr #负载调度算法
lb_kind DR #LVS负载均衡模式,NAT/TUN/DR
persistence_timeout50 #会话保持时间,在做测试的时候建议注释。
protocol TCP #指定转发协议类型,TCP/UDP
real_server 192.168.171.30 80 { #真实服务器,节点1
weight 1 #服务节点的权值
TCP_CHECK{
connect_timeout 3 #3秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
connect_port=80
}
}
real_server 192.168.171.40 80 { #真实服务器,节点2
weight 1
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port=80
}
}
}
从服务器keepalived.conf的配置和主服务器上基本相同,只需要修改两个地方:
state MASTER -> state BACKUP
priority 100 -> priority 90
3、开启服务,验证测试
1)、在后端的两台WEB服务器(RS)上执行 /usr/local/sbin/lvs_rs_dr.sh start ,开启lo:0虚拟ip
2)、在两台LVS服务器(DR)开启端口转发和开启keepalived服务器(先主后从),启动keepalived服务会自动生成vip和ipvsadm规则
echo 1 > /proc/sys/net/ipv4/ip_forward #也可以执行修改: vim /etc/sysctl.conf 文件里面的参数,使用/sbin/sysctl–p 使之生效
/etc/init.d/keepalived start #开启keepalived服务(先主后从)
3)、验证测试
在主lvs服务器上开启了keepalived服务,可以使用ip addr 查看虚拟的ip地址,使用ipvsadm –ln查看lvs的配置信息。
测试负载效果,使用浏览器访问:http://vip (192.168.171.100),为了更改的显示测试效果,我们修改后端WEB服务器是首页的默认主页内容:
RS1修改为:1111111111111111111RS1;
RS2修改为:1111111111111111111RS2;
在浏览器上可能因为缓存的缘故,会总是访问一台机器,可以使用Curl做测试(Windows下也可以安装)。
按照当前的配置会把访问的请求均衡分发给后端的机器。
4、模拟故障:
1)、主LVS上的keep服务出现故障(如keepalived服务被关闭了),查看备lvs是否接管服务。
2)、后端的RS(web服务器)其中的一台发生了故障,LVS服务器上的keepalived是否监测到,并将其故障的服务器剔除,不造成访问受限。
3)、主LVS服务器出现故障重新恢复工作后,查看其是否能重新接管服务。
4)、后端的RS(web服务器)发发生故障重新恢复工作后,检查其是否可以重新加入集群正常工作。