目录
何为LVS?
LVS——Linux Virtual Server,即Linux虚拟服务器(虚拟主机、共享主机),虚拟主机在这里就不再赘述了,相信大家都明白。
而LVS是一个虚拟的服务器集群系统,其实现的是一个高性能、高可用的服务器。目前LVS已经被集成到Linux内核模块中。
LVS的构成
①从物理层面上讲,LVS的主要组成:
负载调度器(load balancer/ Director),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
服务器池(server pool/ Realserver),是一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务
如下图所示:
补充:一般为了实现高可用会使用两台以上的调度服务器,作为备份,提高安全性。(后面的实验部署DR模式+keepalive会使用两台负载调度服务器)
②从软件层面上讲,LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1.ipvs(ip virtual server):工作在内核空间的一段代码,叫ipvs,是真正生效实现调度的代码。
2.ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server),然后由内核代码实现真正的调度算法及功能。
何为群集?
群集,或者说集群,英文是cluster,由多台主机构成,但是对外只表现为一个整体(同一服务),客户端是无法察觉到究竟有多少台服务器,并且对自己访问的是哪一台真实服务器一无所知。
根据针对目标差异,可将群集分为负载均衡群集、高可用群集(HA)、高性能运算群集三类。
群集的类型
负载均衡群集
负载均衡+群集,可以提高应用系统的响应能力、处理更多访问请求、减少延迟,从而获得高并发、高负载的整体性能。
当然,负载均衡的处理并不是简单的平均分配,而是依赖于实际情况下的调度分流算法。而算法就涉及开发人员的思想和生产环境的实际情况了。
高可用群集
提高应用系统的可靠性、减少主断时间,确保服务的连续性,达到高可用的容错效果。
HA(high availability)的工作方式包括双工和主从两种模式。这就涉及到“去中心化”和“中心化”思想,而上一篇文章所介绍的MHA就是典型的master高可用群集的架构模式,只不过我们使用的是MySQL数据库,从而搭成该高可用的架构。
高性能运算群集
高性能运算群集——High Performance Computer Cluster,提高应用系统的CPU运算速度、扩展硬件资源和分析能力,获得相当于大型、超级计算机的高性能运算能力。
高性能运算群集的高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型计算机具备的计算能力。
负载均衡群集是目前企业用的最多的群集类型,群集的负载调度技术有三种工作模式:地址转换——NAT、IP隧道——ip Tunnel、直接路由——Directing Route。
NAT模式
NAT(Network Address Translation)网络地址转换,内网主机可以通过路由NAT实现访问外网主机
LVS-NAT 模型类似于 DNAT,工作机制与 DNAT 一样,当客户端请求的是集群服务时,LVS 修改请求报文的目标地址为 RIP,转发至后端的 RealServer,并修改后端响应报文的源地址为 VIP,响应至客户端。
LVS-NAT的特点:
RS和DIP应该使用私网地址,且RS的网关要指向DIP
请求和响应报文都要经由director转发,所以配置时需要将director的转发功能开启,极高负载的场景中,director可能会成为系统性能瓶颈
支持端口映射
RS可以使用任意OS
RS的RIP和Director的DIP必须在同一IP网络
TUN模式
LVS-TUN的特点:
- RIP,DIP,VIP必须是公网地址
- RS的网关不能指向DIP
- 请求报文必须经由director调度,但响应报文必须不能经由director
- 不支持端口映射
- RS的OS必须支持隧道功能
lvs-fullnat:keepalived
- director通过同时修改请求报文的目标地址和源地址进行转发
lvs-fullnat的特点:
- VIP是公网地址,RIP和DIP是私网地址,RIP与DIP无须在同一网络中
- RS接收到的请求报文的源地址为DIP,因此要响应给DIP
- 请求报文和响应报文都必须经由Director
- 支持端口映射机制
- RS可以使用任意OS
LVS DR 模式
- client请求资源,请求报文经过路由到达交换机,然后交换机查看目标IP为VIP,则修改源和目标MAC后再封装报文发送给director,IPVS则将报文源MAC修改为DIP的MAC地址,目标MAC修改为RIP的MAC地址,然后经POSTROUTING链发送出去,通过交换机转送给RS。DR模式会lo接口上配置一个虚拟地址VIP,当RS收到报文拆封发现目标MAC地址是自己,目标IP地址也是自己的lo地址VIP,就会处理请求。
- RS响应请求,由于请求报文的目标IP是VIP,所以响应报文就通过lo接口传送到eth0网卡发出。
特点
- 保证前端路由将目标地址为VIP的报文全部发送给DS,而不是RS
- RS的RIP可以使用私有地址,但也可以使用公网地址
- RS和director必须在同一物理网络中
- 请求报文有director调度,但响应报文不一定经由director
- 不支持端口映射
- RS的网关不能指向DIP
调度算法:
- rr,轮询算法(round robin),调度器会将所有的请求平均分配给每个服务器。
- wrr,加权轮询(weight round robin),给每个RS分配权重比例。
- lc,最小连接(least connections),把新请求分配到当前连接数最小的服务器上,,集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载
- wlc,加权最小连接(weight least connections),在lc算法上为每台服务器分配上权重比
lvs的DR模式配置http负载均衡
环境:
director:
dip: 192.168.75.143
vip: 192.168.75.145
RS1: 192.168.75.144
RS2: 192.168.75.142
部署:
在RS1上配置httpd,使网页可以访问
//关防火墙和selinux
[root@RS1 ~]# systemctl stop firewalld
[root@RS1 ~]# systemctl disable firewalld
[root@RS1 ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
//编辑httpd
[root@RS1 ~]# yum install httpd
[root@RS1 ~]# vim /var/www/html/index.html
[root@RS1 ~]# cat /var/www/html/index.html
this is RS1
ip: 192.168.75.144
//安装net-tools工具
[root@RS1 ~]# yum install -y net-tools
在RS2上配置httpd,使网页可以访问
//关闭防火墙和selinux
[root@RS2 ~]# systemctl stop firewalld
[root@RS2 ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# setenforce 0
[root@RS2 ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
//下载配置httpd
[root@RS2 ~]# yum install -y httpd
[root@RS2 ~]# cat /var/www/html/index.html
This is RS2
ip: 192.168.75.142
//安装net-tools工具
[root@RS2 ~]# yum install -y net-tools
LVS上安装ipvsadm工具
yum install -y ipvsadm
网卡配置
//将为网关设为lvs的dip
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.75.143 0.0.0.0 UG 100 0 0 ens33
192.168.75.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@RS1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.75.144
NETMASK=255.255.255.0
GATEWAY=192.168.75.143
DNS1=223.5.5.5
//RS2同理
[root@RS2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.75.143 0.0.0.0 UG 100 0 0 ens33
192.168.75.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@RS2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.75.142
NETMASK=255.255.255.0
GATEWAY=192.168.75.143
DNS1=223.5.5.5
部署
开启lvs主机的转发功能
[root@lvs ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1
//使其生效
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]#
LVS配置定义集群
//LVS配置定义集群
[root@lvs ~]# ipvsadm -A -t 192.168.75.145:80 -s rr
// 添加 tcp vip 指定调度算法 轮询
//将后端的RS加入集群:
[root@lvs ~]# ipvsadm -a -t 192.168.75.145 -r 192.168.75.142 -m
[root@lvs ~]# ipvsadm -a -t 192.168.75.145 -r 192.168.75.144 -m
//查看
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress :Port Scheduler Flags
->RemoteAddress:Port Forward weight ActiveConn InActConn
TCP 172.16.75.145:80 rr
->192.168.75.144:80 Masq 1 0 0
-> 192.168.75.142:80 Masq 1 0 0
//验证
[root@localhost ~]# for i in $(seq 10);do curl 192.168.75.145:80;done
This is RS1 ip: 192.168.75.144
This is RS2 ip: 192.168.75.142
This is RS1 ip: 192.168.75.144
This is RS2 ip: 192.168.75.142
This is RS1 ip: 192.168.75.144
This is RS2 ip: 192.168.75.142
This is RS1 ip: 192.168.75.144