LVS集群
lvs简介
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统
LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。总结言之:一组干相同事情的主机
类型
无论是哪种群集,至少包括两台节点服务器,而对外表为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机能力,根据群集所针对的目标差异,可以分为以下三种类型:
负载均衡群集Load Balance Cluster(LB)
以提高应用系统的相应能力、尽可能处理更多的访问请求、减少延迟为目标、获得高并发、高负载(LB)的整体性能。
例如:DNS轮询,应用层交换,反向代理等
高可用集群High Availability Cluster(HA)
以提高应用系统的可靠性、尽可能减少中断时间为目标、确保服务的连续性、保证关键性业务的可靠性、达到高可用(HA)的容错效果。
例如:故障切换、双机热备、多机热备等
工作模式:有双工、主从俩种模式。双工即节点同时在线;主从则只有主节点在线,当出现故障时从节点自动切换为主节点。
高性能运算集群(High Performance Computer Cluster)HPC
以提高应用系统的CPU运算速度,扩展硬件资源和分析能力为目标,获得相当于大型,超级计算机的高性能运算(PHC)能力,
例如:科研计算、天气等
负载均衡实现方式
软件方式
- lvs (效率高,一般在大公司使用)
- haproxy (小中型公司抢手)
- nginx (小中型公司抢手)
硬件方式
- F5
工作原理
- 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
- 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
- LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。
四种工作模式
- NAT:地址转换,Network Address Translation
- DR:直接路由,Direct Routing,采用半开放式的网络结构
- TUN:隧道,IP Tunnel,采用开放式的网络结构
- FULLNAT模式
性能比较:DR>TUN>NAT>FULLNAT
DIP:负载服务器的IP
VIP:负载服务器的虚拟IP
RIP:真实web服务器的IP
CIP:客户端主机的IP
LVS-NAT
LVS-NAT模式
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文的目的地址修改为后端真实服务器(DNAT),发送给后端真实服务器;
3.后端服务器在处理完之后要将响应的报文返回给客户端,但是却不在同一网段;
4.LVS根据自己的追踪技术将后端真实服务响应客户端的报文原地址改为自己的ip地址(SNAT),发送给客户端。
要求:
1.LVS服务器需要有不同的网段。
2.真实服务器的网关必须设置为LVS的ip地址。
优点:
1.安全
2.可以实现不同网段的数据请求。
缺点:
因为在 VS/NAT 中请求和响应报文都需要通过负载调度器,伸缩能力有限, 当服务器结点数目升到 20 时,调度器本身有可能成为系统的新瓶颈。
LVS-TUN
LVS-TUN模式
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文重新封装,发送给后端真实服务器;
3.后端真实服务器将请求报文解封,在确认自身有vip之后进行请求处理;
4.后端真实服务器在处理完数据请求后,直接响应客户端。
要求:
1.lvs和后端真实服务器上都要有vip。
2.不会成为瓶颈。
3.请求的报文不能太大。
优点:
1.快速
2.不安全,不能抵抗DOS攻击
LVS-DR
**
LVS-DR模式
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文的mac地址改为后端真实服务器的mac地址;
3.后端真实服务器得到访问报文后进行ip查看,再确认自己有vip之后进行请求处理;
4.后端真实服务器在处理完数据请求后,直接响应客户端。
要求
1.LVS服务器和后端真实的服务器要处在同一vlan中。
2.LVS和后端服务器上都要有vip,并且后端真实服务器上的vip不能对外进行广播。
优点
1.LVS服务器只是修改了mac地址,所以非常快速,并且LVS不会成为瓶颈。
缺点
1.要求较高,LVS服务器必须和后端真实服务器处于同一vlan中;
2.后端真实服务器直接响应客户端,对于后端真实服务器来说,并不安全。
LVS-fullnat模式
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文的目的地址修改为后端真实服务器(DNAT),源地址改为自己的ip地址(SNAT),发送给后端真实服务器;
3.后端服务器在处理完之后要将响应的报文返回给lvs;
4.LVS将返回的数据包源地址改为自己(SNAT),目的地址改为客户端(DNAT),发送给客户端。
fullnat模式和nat模式相似,但是与nat不同的是nat模式只做了两次地址转换,fullnat模式却做了四次。
LVS-实战:搭建HTTP负载均衡集群
搭建lvs-nat模式的http负载集群
环境说明
LVS服务器(DR) | DIP:192.129.133 | VIP:192.168.129.250 |
---|---|---|
apache服务器(RS1) | IP:192.168.129.134 | VIP:192.168.129.250 |
apache服务器(RS2) | IP:192.168.129.135 | VIP:192.168.129.250 |
//关闭防火墙和seLinux
[root@DR ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# setenforce 0
[root@RS1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS1 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# setenforce 0
//下载httpd并修改显示内容
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# echo "Good evening 192.168.129.134" > /usr/share/httpd/noindex/index.html
[root@RS1 ~]# systemctl restart httpd
[root@RS1 ~]# curl 192.168.129.134
Good evening 192.168.129.134
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# echo "Good evening 192.168.129.135" > /usr/share/httpd/noindex/index.html
[root@RS2 ~]# systemctl restart httpd
[root@RS1 ~]# curl 192.168.129.135
Good evening 192.168.129.135
//配置 DR的VIP
[root@DR ~]# echo "IPADDR1=192.168.129.250" >> /etc/sysconfig/network-scripts/ifcfg-ens160
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.129.133
GATEWAY=192.168.129.2
PREFIX=24
DNS1=114.114.114.114
IPADDR1=192.168.129.250
[root@DR ~]# systemctl restart NetworkManager
[root@DR ~]# ifdown ens160;ifup ens160
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:20:9b:da brd ff:ff:ff:ff:ff:ff
inet 192.168.129.133/24 brd 192.168.129.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.129.250/24 brd 192.168.129.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe20:9bda/64 scope link
valid_lft forever preferred_lft forever
//配置 RS1网关为DR网关
[root@RS1 ~]# sed -ri 's/^(GATEWAY=).*/\1192.168.129.250/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR="192.168.129.133"
PREFIX="24"
GATEWAY="192.168.129.250"
DNS1="114.114.114.114"
[root@SR1 ~]# systemctl restart NetworkManager
[root@SR1 ~]# ifdown ens160;ifup ens160
[root@RS2 ~]# sed -ri 's/^(GATEWAY=).*/\1192.168.129.250/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR="192.168.129.134"
PREFIX="24"
GATEWAY="192.168.129.250"
DNS1="114.114.114.114"
[root@SR2 ~]# systemctl restart NetworkManager
[root@SR2 ~]# ifdown ens160;ifup ens160
DR上配置 转发规则
//LVS依赖于ipvsadm来进行配置,所以首先安装ipvsadm
[root@DR ~]# yum -y install ipvsadm
//开启转发功能
[root@DR ~]# vi /etc/sysctl.conf
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
//配置转发规则
[root@DR ~]# ipvsadm -A -t 192.168.129.250:80 -s rr
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.129.250:80 rr
[root@DR ~]# ipvsadm -a -t 192.168.129.250:80 -r 192.168.129.134:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.129.250:80 -r 192.168.129.135:80 -m
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.129.250:80 -s rr
-a -t 192.168.129.250:80 -r 192.168.129.134:80 -m -w 1
-a -t 192.168.129.250:80 -r 192.168.129.135:80 -m -w 1
//永久生效
[root@DR ~]# chmod +x /etc/rc.d/rc.local
[root@DR ~]# cat > /etc/sysconfig/ipvsadm << EOF
ipvsadm -A -t 192.168.129.250:80 -s rr
ipvsadm -a -t 192.168.129.250:80 -r 192.168.129.134:80 -m
ipvsadm -a -t 192.168.129.250:80 -r 192.168.129.135:80 -m
EOF
[root@DR ~]# echo "bash /etc/sysconfig/ipvsadm" >> /etc/rc.d/rc.local
[root@DR ~]# reboot
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.129.250:80 -s rr
-a -t 192.168.129.250:80 -r 192.168.129.134:80 -m -w 1
-a -t 192.168.129.250:80 -r 192.168.129.135:80 -m -w 1
//测试
[root@DR ~]# for i in $(seq 5);do curl 192.168.129.250:80;done
Good evening 192.168.129.135
Good evening 192.168.129.134
Good evening 192.168.129.135
Good evening 192.168.129.134
Good evening 192.168.129.135
搭建lvs-dr模式的http负载集群
环境说明
LVS服务器(DR) | DIP:192.129.135 | VIP:192.168.129.250 |
---|---|---|
apache服务器(RS) | IP:192.168.129.133 | VIP:192.168.129.250 |
apache服务器(RS) | IP:192.168.129.134 | VIP:192.168.129.250 |
//关闭三台虚拟机的防火墙与selinux
[root@DR ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# setenforce 0
[root@RS1 ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS1 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# setenforce 0
//RS上配置http并启动
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# echo "Hello " > /usr/share/httpd/noindex/index.html
[root@RS1 ~]# systemctl restart httpd
[root@RS1 ~]# curl 192.168.129.133
Hello
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# echo "how are you " > /usr/share/httpd/noindex/index.html
[root@RS2 ~]# systemctl restart httpd
[root@RS2 ~]# curl 192.168.129.134
how are you
//LVS上配置IP
[root@DR ~]# echo "IPADDR1=192.168.129.250" >> /etc/sysconfig/network-scripts/ifcfg-ens160
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.129.135
GATEWAY=192.168.129.2
PREFIX=24
DNS1=114.114.114.114
IPADDR1=192.168.129.250
[root@DR ~]# systemctl restart NetworkManager
[root@DR ~]# ifdown ens160;ifup ens160
[root@DR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:aa:87:a6 brd ff:ff:ff:ff:ff:ff
inet 192.168.129.135/24 brd 192.168.129.255 scope global secondary noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.129.250/24 scope global secondary ens160
valid_lft forever preferred_lft forever
inet6 fe80::830b:1a3a:1104:10b5/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//配置RS1与RS2的APR内核参数
[root@RS1 ~]# echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf
[root@RS1 ~]# echo 'net.ipv4.conf.all.arp_announce = 2' >> /etc/sysctl.conf
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1 #将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
net.ipv4.conf.all.arp_announce = 2 #将ARP请求的源IP设置为eth0上的IP,也就是RIP
[root@RS2 ~]# echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf
[root@RS2 ~]# echo 'net.ipv4.conf.all.arp_announce = 2' >> /etc/sysctl.conf
[root@RS2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
//RS1与RS2上配置VIP(一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告)
LVS服务器的eth0网卡的IP:192.168.129.250作为VIP
//永久生效在配置文件中加IP
[root@RS1 ~]# echo "IPADDR1=192.168.129.250" >> /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS1 ~]# systemctl restart NetworkManager
[root@RS1 ~]# ifdown ens160 ; ifup ens160
[root@RS2 ~]# echo "IPADDR1=192.168.129.250" >> /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS2 ~]# systemctl restart NetworkManager
[root@RS2 ~]# ifdown ens160 ; ifup ens160
#两台RS上都要做
//开机启动
[root@RS1 ~]# route add -host 192.168.129.250/32 dev ens160
[root@RS1 ~]# chmod +x /etc/rc.d/rc.local
[root@RS1 ~]# echo "route add -host 192.168.129.250/32 dev ens160" >> /etc/rc.d/rc.local
[root@RS2 ~]# route add -host 192.168.129.250/32 dev ens160
[root@RS2 ~]# chmod +x /etc/rc.d/rc.local
[root@RS2 ~]# echo "route add -host 192.168.129.250/32 dev ens160" >> /etc/rc.d/rc.local
#两台RS上都要做
//LVS依赖于ipvsadm来进行配置,所以我们首先先安装ipvsadm
[root@DR ~]# yum -y install ipvsadm
[root@DR ~]# cat > /etc/sysconfig/ipvsadm << EOF
ipvsadm -A -t 192.168.129.250:80 -s rr
ipvsadm -a -t 192.168.129.250:80 -r 192.168.129.133:80 -g
ipvsadm -a -t 192.168.129.250:80 -r 192.168.129.134:80 -g
EOF
[root@DR ~]# bash /etc/sysconfig/ipvsadm
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.129.250:80 -s rr
-a -t 192.168.129.250:80 -r 192.168.129.133:80 -g -w 1
-a -t 192.168.129.250:80 -r 192.168.129.134:80 -g -w 1
//永久生效
[root@DR ~]# chmod +x /etc/rc.d/rc.local
[root@DR ~]# echo "bash /etc/sysconfig/ipvsadm" >> /etc/rc.d/rc.local
[root@DR ~]# reboot
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.129.250:80 -s rr
-a -t 192.168.129.250:80 -r 192.168.129.133:80 -g -w 1
-a -t 192.168.129.250:80 -r 192.168.129.134:80 -g -w 1
-A:添加虚拟服务器
-t :指定vip及tcp端口
-s:指定算法
rr:轮询
-a :添加节点
-t :指定vip和端口
-r :指定节点ip及端口
-g:表示使用DR模式
-w:设置权重
测试