LVS是Linux Virtual Server的简称,即Linux虚拟服务器,最初是由国内的章文嵩博士于1998年发起的自由软件项目。目前LVS项目已经被集成到Linux内核中,在Linux2.4内核之前,要使用LVS功能就必须重新编译内核以支持LVS功能模块,但从Linux2.4之后,LVS的各个功能模块已经被内置入Linux内核中,无需进行额外的安装和内核重新编译,便可直接使用LVS提供的各种功能。LVS具有良好的可靠性、可扩展性和可操作性,加上其实现最优的集群服务性能所需的低廉成本,LVS的负载均衡功能经常被用于高性能、高可用的服务器群集中。
在LVS项目架构的服务器集群系统中,通常包含三个功能:最前端的负载均衡、中间的物理服务器群 以及最底端的数据共享存储。在LVS负载均衡集群架构中,尽管整个集群内部有多个物理节点在处理用户发出的请求,但是在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS的核心功能是为集群服务提供软件负载均衡,执行效率最高的是IP负载均衡技术,LVS采用的便是IP负载均衡。LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,其主要安装在集群的Director Server上,并在Director Server上虚拟出一个服务IP地址,用户对服务的访问只能通过该虚拟IP地址实现。这个虚拟IP通常称为LVS的VIP(VirtualIP),用户的访问请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中按照一定的负载均衡算法选取一个服务节点响应用户的请求。IPVS实现数据路由转发的机制有三种,分别是NAT、TUN和DR技术。
Keepalived最初是由Alexandre Cassen使用C语言编写的开源软件项目,主要目标是简化LVS项目的配置并增强其稳定性,即Keepalived是对LVS项目的扩展增强。Keepalived为Linux系统和基于Linux的架构提供了负载均衡和高可用能力,其负载均衡功能主要源自集成在Linux内核中的LVS项目模块IPVS(IP VirtualServer),基于IPVS提供的4层TCP/IP协议负载均衡,Keepalived也具备负载均衡的功能,此外,Keepalived还实现了基于多层TCP/IP协议(3层、4层、5/7层)的健康检查机制,
因此,Keepalived在LVS负载均衡功能的基础上,还提供了LVS集群物理服务器池健康检查和故障节点隔离的功能。除了扩展LVS的负载均衡服务器健康检查能力,Keepalived还基于虚拟路由冗余协议(Virtual Route Redundancy Protocol, VRRP)实现了LVS负载均衡服务器的故障切换转移,即Keepalived还实现了LVS负载均衡器的高可用性。Keepalived就是为LVS集群节点提供健康检查和为LVS负载均衡服务器提供故障切换的用户空间进程。
Keepalived可实现多机热备,每个热备组可有多台服务器,最常用的就是双机热备,双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器。
Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器、管理服务器池,而不仅仅用作双机热备。
DR模式–通过改写请求报文的MAC地址,将请求直接发送到选中的Real Server,而Real Server则将响应直接返回给客户端。因此,这种技术不仅避免了VSNAT中的IP地址转换,同时也避免了VSTUN中的IP隧道开销,所以VSDR是三种负载调度机制中性能最高的实现方案。但是,在这种方案下,DirectorServer与Real Server必须在同一物理网段上存在互联。
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址。在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
当一个ARP广播发送到LVS-DR集群时因为负载均衡器和节点服务器都是连接到相同的网络上的,它们都会接收到ARP广播。此时只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP播。要对节点服务器进行处理,使其不响应针对VIP的ARP请求使用虚接口lo:0承载VIP地址,需设置内核参数arp_ignore=1 系统只响应目的IP为本地IP的ARP请求
模拟简单实验
两台LVS负载均衡
两台web服务器
一台客户端
LVS调度服务器选用DR模式,并与两台web服务端 配置同一个VIP,当客户机请求访问,是通过VIP进入访问。为验证 两台web服务端采用轮询的方式响应客户端请求,两台web服务器首页内容不同,以此验证。在企业应用中,单台服务器承担应用存在单点故障的危险,在企业应用集群中,存在了至少两处单点故障危险,单点故障一旦发生,企业服务将发生中断,造成极大的危害。Keepalived工具是专为LVS和HA设计的一款健康检查工具:既支持故障自动切换(Failover),也支持节点健康状态检查(Health Checking)
(两台LVS服务器步骤一样,只有ens33的IP地址不同,同步操作)
# yum install keepalived ipvsadm- y --安装双击热备 LVS相关软件包
# vi /etc/sysctl.conf --开启路由转发功能,proc响应关闭重定向功能
末行插入
net.ipv4.ip_forward=1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
# sysctl -p 生效
采用脚本形式 为VIP创建虚拟服务器,使用rr算法
# cd /etc/init.d/
# vi dr.sh
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10
RIP1=192.168.100.201
RIP2=192.168.100.202
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev ens33:0
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting-------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down
route del $VIP
echo "ipvsamd stoped-------[ok]"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped-----------"
exit 1
else
echo "ipvsamd Runing--------[ok]"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
# chmod +x dr.sh
# cd /etc/sysconfig/network-scripts
# cp -p ifcfg-ens33 ifcfg-ens33:0
# vim ifcfg-ens33:0
全删,添加:
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
选仅主机模式,配置静态IP
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
改为:
BOOTPROTO=static
ONBOOT=yes
添加:
IPADDR=192.168.100.110
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
# service network restart 重启网卡
# ifup ens33:0
# ifconfig 查看VIP是否配置成功
# service dr.sh start 开启LVS服务
# systemctl stop firewalld 关闭防火墙
# setenforce 0
(两台LVS中keepalived配置文件的修改不同,一台为主,一台为备)
在Keepalieved的热备配置基础上,添加"virtual_ server VIP端口{…}”区段来配置虚拟服务器,主要包括对负载调度算法、群集工作模式、健康检查间隔、真实服务器地址等参数的设置
主:
# cd /etc/keepalived/
# vim keepalived.conf
global_defs {
..........
smtp_server 127.0.0.1 --指向本地
router_id LVS_01 --指定名称,备份服务器不同名称
vrrp_instance VI_1 {
state MASTER --热备状态,MASTER表示主服务器
interface ens33 --承载VIP地址的物理接口
virtual_router_id 10 --组号相同(主从要相同)虚拟路由器的ID号,每个热备组保持一致
..........
auth_pass abc123 --验证密码,要么不改,要么都改一样
priority 100 --优先级备份服务器要小于主服务器
...........
virtual_ipaddress {
192.168.100.10 --改为VIP地址(2dd删除,留一个)
}
...........
virtual_server 192.168.100.10 80 { --改为VIP地址和端口
...........
lb_kind DR --改为DR模式
............
real_server 192.168.100.201 80 { --改为节点web服务器地址
weight 1 --下行9dd删除重新编辑
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
从41行开始,9yy复制到49行下
real_server 192. 168. 100. 202 80 { --改为另一台节点web服务器地址
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
剩下全删
# cd /etc/keepalived
# scp keepalived.conf [email protected]:/etc/keepalived/
# systemctl start keepalived.service
在另一台LVS服务器上修改:
# cd /etc/keepalived
# vim keepalived.conf
修改:
state BACKUP --改为备份服务器角色状态
router_id LVS_02 --指定名称,不能跟主服务器一样
priority 90 --优先级要低于主服务器
# systemctl start keepalived.service --开启keepalived双机热备服务
在LVS调度器中执行ipvsadm -In命令 可查看群集节点状态
在LVS调度器中执行ipvsadm -Inc命令 可查看负载连接及分配情况
(两台web步骤一样,只有ens33 IP地址不同,首页内容不同)
# yum install httpd -y
# systemctl stop firewalld.service
# setenforce 0
# cd /var/www/html/
# echo "this is kgc" > index.html
(创建虚拟服务器,抑制ARP响应)
# cd /etc/init.d/
# vim web.sh
#!/bin/bash
VIP=192.168.100.10
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 Stopd"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
# chmod +x web.sh
VIP地址仅用作Web响应数据包的源地址,并不监听客户机的访问请求
# cd /etc/sysconfig/network-scripts
# cp -p ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0
全删,添加:
DEVICE=lo:0
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes
选仅主机模式,绑定静态IP
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
改为:
BOOTPROTO=static
添加:
IPADDR=192.168.100.201
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
# service network restart 重启网卡
# ifup lo:0
# ifconfig 查看VIP是否配置成功
# service dr.sh start 开启LVS服务
# systemctl stop firewalld 关闭防火墙
# setenforce 0
自检:在LVS配置keepalived之前,可以访问两台web网站首页,验证网站是否搭建成功。
web1:
用一台win 10 浏览器检验:
首先先绑定IP地址 子网 网关,要是同网段的192.168.100.0网段的
首先ping通VIP
#ping 192.168.100.10 --ping VIP
如果不通,两台DR服务器重启网卡服务,再ping一次试试
ping通之后,浏览器里输入VIP地址,可以看到其中一台web服务器首页内容,清除缓存,过1分钟,再次刷新,会看到另一台web服务器的首页内容。
群集测试:
在客户机浏览器中,能够通过群集的VIP地址(192.168.10.72)正常访问Web页面内容
当主、从调度器任何一个失效时, Web站点仍然可以访问
只要服务器池有两台及以上的真实服务器可用,就可以实现访问量的负载均衡