LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
使用集群技术和Linux操作系统实现一个高性能、高可用的服务器。有很好的可伸缩性(Scalability),很好的可靠性(Reliability),很好的可管理性(Manageability)。
可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。而IP负载均衡技术是在负载调度器的实现技术中效率最高的。
VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。
在分析VS/NAT的缺点和网络服务的非对称性的基础上提出了:
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
一般来说,LVS集群采用三层结构,其主要组成部分为:
负载调度器(load balancer)它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
调度器
调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。
1、开源,免费
2、在网上能找到一些相关技术资源
3、具有软件负载均衡的一些优点
1、最核心的就是没有可靠的支持服务,没有人对其结果负责;
2、功能比较简单,支持复杂应用的负载均衡能力较差,如算法较少等;
3、开启隧道方式需重编译内核;
4、配置复杂;
5、主要应用于LINUX,没有专门用于WINDOWS的版本,不过可以通过配置,使windows成为LVS集群中的real server(win2003、win2008中)。
1、工作在内核空间的IPVS模块,是LVS集群系统的核心软件;LVS的能力实际上都是由IVPS模块实现
2、工作在用户空间的ipvsadm管理工具;其作用是向用户提供一个命令接口,用于将配置的虚拟服务、真实服务等传给IPVS模块
IPVS主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务,这个虚拟IP一般称为LVS的VIP,即Virtual IP;访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求
三台虚拟机
vm1:负载调度器IP 172.25.76.1
vm2:后端服务器IP 172.25.76.2 需要安装httpd服务
vm3:后端服务器IP 172.25.76.3 需要安装httpd服务
(在真机浏览器测试查看服务是否成功开启;编写发布文件内容,方便后续测试使用)
在vm1上:
安装ipvsadm工具
yum install -y ipvsadm
systemctl status ipvsadm
重启后服务正常
将http服务永久加入到火墙中去,另外重启火墙服务
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
在vm1和vm2上安装HTTPD服务,测试在真机浏览器是否能够看到发布文件
ipvsadm命令详解
参数 | 含义 |
---|---|
-A --add-service | 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 |
-D --delete-service | 删除内核虚拟服务器表中的一条虚拟服务器记录。 |
-C --clear | 清除内核虚拟服务器表中的所有记录。 |
-R --restore | 恢复虚拟服务器规则 |
-S --save | 保存虚拟服务器规则,输出为-R 选项可读的格式 |
-a --add-server | 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 |
-n --numeric | 输出IP 地址和端口的数字形式 |
-L-l --list | 显示内核虚拟服务器表 |
-s --scheduler scheduler | 使用的调度算法,有这样几个选项rr/wrr/lc/wlc/lblc/lblcr/dh/sh/sed/nq |
-e --edit-server | 编辑一条虚拟服务器记录中的某条真实服务器记录 |
-d --delete-server | 删除一条虚拟服务器记录中的某条真实服务器记录 |
-r --real-server server-address | 真实的服务器[Real-Server:port] |
-t --tcp-service service-address | 说明虚拟服务器提供的是tcp 的服务 |
-u --udp-service service-address | 说明虚拟服务器提供的是udp 的服务 |
-g --gatewaying | 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) |
ipvsadm -A -t 172.25.76.10:80 -s rr
#添加一台新的虚拟服务器:ip为172.25.76.10,端口为80,提供TCP服务,使用负载均衡的调度算法
ipvsadm -a -t 172.25.76.10:80 -r 172.25.76.2:80 -g
#在虚拟服务器172.25.76.10:80中添加一台新的真实服务器:IP为172.25.76.2,端口80,提供TCP服务,指定LVS的工作模式为直接路由模式(LVS的默认模型)
ipvsadm -a -t 172.25.76.10:80 -r 172.25.76.3:80 -g
#在虚拟服务器172.25.76.10:80中添加一台新的真实服务器:IP为172.25.76.3,端口80,提供TCP服务,指定LVS的工作模式为直接路由模式(LVS的默认模型)
ipvsadm -ln
#以IP 地址和端口的数字形式查看虚拟服务器表
ipvsadm-save -n > /etc/sysconfig/ipvsadm
#将策略添加到配置文件中
cat /etc/sysconfig/ipvsadm
#查看内容
lsmod == list modules即显示所有载入系统的模块
vm1这个负载均衡器中添加
ip addr add 172.25.76.10/24 dev eth0
#给eth0设备添加ip为172.25.76.10/24的VIP
在真机测试访问VIP172.25.76.100,发现是负载均衡的。说明之前的配置全部生效。
但在这种情况下,客户端访问VIP时可能会得到后端真实主机的MAC地址,会很不安全
ip addr show eth0
arp -an | grep 172.25.76.10
arp -d 172.25.76.10
ping -c1 172.25.76.10
发现在删除之前的访问记录后再次访问会得到后端真实主机vm2的MAC地址
解决办法:
修改arp策略,使得客户端在访问VIP时得到的一直是虚拟主机的MAC地址即可
yum isntall -y arptables
#安装arp策略管理工具
arptables:用于过滤arp包;基本思路和iptables一样,不过,arptables处理arp协议有关的包,这些包在iptables中并不会处理;arptables可用于灵活的arp管理,如果善于运用的话,不失为一个优秀的arp防火墙,既能防止别的机器对自己进行arp欺骗,又能防止本机病毒或错误程序向其他机器发起arp攻击
arptables -A INPUT -d 172.25.76.10 -j DROP
#进来的ARP,如果目的地IP是VIP的,丢弃
arptables -A OUTPUT -s 172.25.76.10 -j mangle --mangle-ip-s 172.25.76.2
#发出去的ARP包,如果源IP是VIP的,更改成realserver的IP
保存并查看配置文件内容
修改策略后继续测试
发现删除现有的访问记录后再次访问到的是虚拟主机的MAC地址,策略修改生效
四台虚拟机:
vm1主机为主负载调度器,配置keepalived服务,IP=172.25.76.1
vm2主机为后端服务器,配置httpd服务,IP=172.25.76.2
vm3主机为后端服务器,配置httpd服务,IP=172.25.76.3
vm4主机为备份负载调度器,配置keepalived服务,IP=172.25.176.4
手动搭建LVS模式中,某台后端服务器宕机后,客户端会出现访问失败的情况,例如:
将一个后端服务器vm3宕机
测试在客户端访问,发现只有负载到vm2时才能访问成功,到vm3时会显示访问失败
解决办法:
使用Keepalived可以使得在一个后端服务器宕机后,客户端访问不会出现访问失败的问题
使用keepalived搭建LVS前删除VIP、清空LVS集群以便后续查看效果
ip addr del 172.25.76.10/24 dev eth0
#删除之前添加的VIP
ipvsadm -C
#清空LVS集群
查看ip addr
在vm1正虚拟服务器中安装keepalized服务并修改配置文件/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
#修改1
root@localhost
}
#修改2
notification_email_from keepalived@localhost
#修3
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#修改4
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#修改5
172.25.76.10
}
}
#修改6
virtual_server 172.25.76.10 80 {
delay_loop 3
lb_algo rr
#修改7
lb_kind DR
#修改8
#persistence_timeout 50
protocol TCP
#修改9
real_server 172.25.76.2 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.76.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
启动keepalived服务后,调度器主机自动获取keepalived配置文件中的VIP和LVS集群
给vm2和vm3也分别添加VIP
真机客户端访问VIP,此时时负载均衡的
关掉vm3的httpd服务
再次客户端访问VIP,发现可以正常访问
当重启vm3主机的httpd服务后,客户端访问又会恢复为负载均衡效果
以上配置的单点keepalived主机,在此主机故障后,客户端将再也无法访问,直至此主机故障被修复
解决办法:
配置vm4为其热备主机,实现其高可用性
热备主机vm4的keepalived配置文件与keepalived服务master主机配置文件只有以下区别,为提到的配置全部相同
vrrp_instance VI_1 {
#修改1
state BACKUP
interface eth0
#修改2
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
配置完成后,启动热备机vm4的keepalived服务,down掉master端vm1的keepalived服务,查看效果
客户端访问为正常的负载均衡,获取到的是热备主机vm4的MAC地址
当master端vm1重启keepalived服务后,VIP会自动回退至master端
至此,高可用实现