LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立(中国人的项目),可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。本文主要记录利用lvs结合keepalived实现一个高可用的Linux群集系统。
lvs有三种工作模式:NAT(地址转换)、IP Tunneling(IP隧道)、Direct Routing(直接路由)。 工作效率最低的是NAT模式,但NAT模式可以用于各种系统,各种环境的负载均衡,只需要一个公网ip即可实现 IP Tunneling模式,调度器将连接分发到不同的后端real server,然后由real server处理请求直接相应给用户,大大提高了调度器的调度效率,后端real server没有物理位置和逻辑关系的限制,后端real server可以在Lan/Wlan,但是后端real server必须支持IP隧道协议。DR(Direct Routing)是效率最高的,与IP Tunneling类似,都是处理一般连接,将请求给后端real server,然后由real server处理请求直接相应给用户,Direct Routing与IP Tunneling相比,没有IP封装的开销,但由于采用物理层,所以DR模式的调度器和后端real server必须在一个物理网段里,中间不能过路由器(也就是一个交换机相连)。
lvs支持8种不同的调度算法:轮叫(rr)、加权轮叫(wrr)、最小连接(lc)、加权最小连接(wlc)、基于局部性最小连接(lblc)、带复制的基于局部性最少链接(lblcr)、目标地址散列(dh)和源地址散列(sh)。
下面就介绍如何来安装和配置lvs+keepalived,本文使用环境:操作系统:CentOS 7 64bit
主调度器:192.168.131.40/24
备调度器:192.168.131.41/24
后端real server: 192.168.131.42/24
后端real server: 192.168.131.43/24
Virtual IP:192.168.131.44/24
lvs在2.6的内核中是默认支持的,所以我们就不需要在来安装,但是我们需要
安装用户配置工具ipvsadm
yum -y install ipvsadm # 分别在主从lvs上执行安装ipvsadm
1、查看内核模块是否支持
lsmod | grep ip_vs #发现没有
2、加载ip_vs模块
ipvsadm #执行ipvsadm命令加载
3、再次查看内核模块是否支持
安装keepalived
yum install keepalived
lvs服务器主,备配置keepalived,编辑配置文件/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# notification_email {
# coldnight@linuxzen.com # 发生故障时发送的邮箱
# }
# notification_email_from linuxzen@linuxzen.com # 使用哪个邮箱发送
# smtp_server linuxzen.com # 发件服务器
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 标示为主lvs
interface eth0 # HA检测端口,根据实际网卡名称,也可能是eth1,或ens3
virtual_router_id 51 # 主备的virtual_router_id 必须相同
priority 100 # 优先级,备lvs要比主lvs稍小
advert_int 1 # VRRP Multicast 广播周期秒数
authentication { # 定义认证
auth_type PASS # 认证方式为口令认证
auth_pass 1111 # 定义口令
}
virtual_ipaddress { # 定义vip
192.168.131.44 # 多个vip可换行添加
}
}
virtual_server 192.168.131.44 80 {
delay_loop 6 # 每隔6秒查看realserver状态
lb_algo rr # 调度算法为轮叫
lb_kind DR # lvs工作模式为DR(直接路由)模式
nat_mask 255.255.255.0
persistence_timeout 50 # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
protocol TCP # 用TCP监测realserver的状态
real_server 192.168.131.42 80 { # 定义realserver
weight 1 # 定义权重
TCP_CHECK { # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
connect_timeout 3 # 三秒无响应超时
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.131.43 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
配置备用lvs的keepalived,只需要将state MASTER 改为state BACKUP,降低priority 100 的值,如priority 90。
两台后端real server
为了测试方便,都安装好nginx,并修改主页为各自的ip地址,方便对比,然后编写脚本lvsrs
在/etc/init.d目录下创建lvsrs文件,编辑添加如下内容:
#!/bin/bash
VIP=192.168.131.44
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
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}"
exit 1
esac
exit 0
编辑完毕保存退出,然后给这个脚本执行权限:
chmod +x /etc/init.d/lvsrs
因为realserver脚本中用到了/etc/rc.d/init.d/functions,所以一并设置权限
chmod +x /etc/rc.d/init.d/functions
最后分别启动LVS主备上的keepalived.service
systemctl start keepalived.service
和realserver上的脚本
/etc/init.d/lvsrs start
负载和可用性测试
开启每个服务器的相关服务,关闭防火墙(systemctl stop firewalld.service),开始进行测试测试LVS层。
执行ip a命令,主服务器会存在一个虚拟IP,从服务器不会存在这个虚拟IP。现在浏览网页显示正常。虚拟IP如图所示:
当停止主lvs上的keepalived服务时,同样在备lvs上执行ip a命令,也会看到上图所示虚拟IP,这样证明主备之间的切换正常。
显示集群中服务器ip信息:ipvsadm -ln
查看日志:tail -f /var/log/messages