赞
踩
LVS负载均衡
集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。
集群组成后,可以利用多个计算机和组合进行海量请求处理(负载均衡),从而获得很高的处理效率,也可以用多个计算机做备份(高可用HA),使得任何一个机器坏了整个系统还是能正常运行。
负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
负载通常包括应用程序处理负载和网络流量负载,每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。
负载均衡技术类型:基于 4 层负载均衡技术、基于 7 层负载均衡技术
负载均衡实现方式:硬件负载均衡设备、软件负载均衡
硬件负载均衡产品:F5 、深信服 、Radware
软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)
负载均衡根据所采用的设备对象(软/硬件负载均衡),应用的OSI网络层次(网络层次上的负载均衡),及应用的地理结构(本地/全局负载均衡)等来分类。下面着重介绍的是根据应用的 OSI 网络层次来分类的负载均衡类型。
负载均衡可以大概分为以下几类:
二层负载均衡(mac)
数据链路层 mac地址
一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应
三层负载均衡(ip)
网络层 ip地址
一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应。
四层负载均衡(tcp)
传输层 port
在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器。
应用层 url ip+port
根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。
在实际应用中,比较常见的就是四层负载及七层负载,二层和三层基本淘汰掉了。下面也重点说下这两种负载。
所谓四层负载均衡,也就是主要通过报文中的目标ip地址和端口,再加上负载均衡设备设置的服务器选择方式(分发策略,轮询),决定最终选择的内部服务器。
在三层负载均衡的基础上,通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,即通过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
实现四层负载均衡的有:
所谓七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
在四层负载均衡的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据IP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。所以从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。
对应的负载均衡器除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI等信息,实现七层负载均衡。此种负载均衡器能理解应用协议。
实现七层负载均衡的软件有:
四层负载均衡 | 七层负载均衡 | |
---|---|---|
基于 | IP+Port | URL或主机IP等 |
类似于 | 路由器 | 代理服务器 |
复杂度 | 低 | 高 |
性能 | 高;因无需解析内容) | 中;需要算法识别URL 和HTTP head等信息 |
安全性 | 低 | 高 |
额外功能 | 无 | 会话保持,图片压缩等 |
总结:从上面的对比看来四层负载与七层负载最大的区别就是效率与功能的区别。四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,而七层负载均衡的优势则体现在功能多,控制灵活强大。在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑。
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
可以通过LVS提供的负载均衡技术实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
优点:
高并发连接:LVS基于内核工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。
稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
缺点:
工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。
核心组件:
LVS的管理工具和内核模块 ipvsadm/ipvs
ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
ipvs:工作于内核上的程序,可根据用户定义的集群实现请求转发;
专业术语:
VS:Virtual Server | 虚拟服务 |
---|---|
Director, Balancer | 负载均衡器、分发器 |
RS:Real Server | 后端请求处理服务器 |
CIP: Client IP | 客户端IP |
VIP:Director Virtual IP | 负载均衡器虚拟IP |
DIP:Director IP | 负载均衡器真实IP |
RIP:Real Server IP | 后端请求处理服务器IP |
当客户端的请求到达负载均衡器的内核空间时,首先会到达 PREROUTING 链。
当内核发现请求数据包的目的地址是本机时,将数据包送往 INPUT 链。
LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
最后经由POSTROUTING链发往后端服务器。
LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器/负载均衡器(IP负载均衡,他修改的是IP地址) --利用三层功能
LVS/DR :直接路由模式,只有进站的数据流量经过分发器/负载均衡器(数据链路层负载均衡,因为他修改的是目的mac地址)–利用二层功能mac地址
LVS/TUN: 隧道模式,只有进站的数据流量经过分发器/负载均衡器
LVS/full-nat:双向转换,通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,转发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的源IP地址改为自己的VIP,将目的地址改为客户端IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。
优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
原理:负载均衡器和RS都使用同一个IP对外服务。但只有DB对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DB,而DB收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。
优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与LVS-TUN相比,LVS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。
原理:互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理海量的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
原理:客户端对VIP发起请求,Director接过请求发现是请求后端服务。Direcrot对请求报文做full-nat,把源ip改为Dip,把目标ip转换为任意后端RS的rip,然后发往后端,rs接到请求后,进行响应,相应源ip为Rip目标ip还是DIP,又内部路由路由到Director,Director接到响应报文,进行full-nat。将源地址为VIP,目标地址改为CIP
请求使用DNAT,响应使用SNAT
lvs-fullnat(双向转换)
通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发:
cip:vip dip:rip
rip:dip vip:cip
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
安装lvs管理软件 ipvsadm
yum -y install ipvsadm
程序包:ipvsadm(LVS管理工具)
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file
配置文件:/etc/sysconfig/ipvsadm-config
命令选项
-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录 -t #表示为tcp服务 -u #表示为udp服务 -s --scheduler #使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 wlc 例:ipvsadm -A -t 192.168.1.2:80 -s wrr -a --add-server #在服务器表中添加一条新的真实主机记录 -t --tcp-service #说明虚拟服务器提供tcp服务 -u --udp-service #说明虚拟服务器提供udp服务 -r --real-server #真实服务器地址 -m --masquerading #指定LVS工作模式为NAT模式 -w --weight #真实服务器的权值 -g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式) -i --ip #指定LVS的工作模式为隧道模式 -p #会话保持时间,定义流量呗转到同一个realserver的会话存留时间 例:ipvsadm -a -t 192.168.1.2:80 -r 192.168.2.10:80 -m -w 1 -E -edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。 -D -delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。 -C -clear #清除内核虚拟服务器表中的所有记录。 -R -restore #恢复虚拟服务器规则 -S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式 -e -edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录 -d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录 -L|-l –list #显示内核虚拟服务器表 --numeric, -n:#以数字形式输出地址和端口号 --exact: #扩展信息,精确值 --connection,-c: #当前IPVS连接输出 --stats: #统计信息 --rate : #输出速率信息 参数也可以从/proc/net/ip_vs*映射文件中查看 -Z –zero #虚拟服务表计数器清零(清空当前的连接数量等)
实验环境最好是纯净的。如果你有主机是克隆的,那么网卡设备的UUID可能相同,去配置文件里把UUID那一行去掉,然后重启网卡。
环境说明:
主机名 | 网卡信息 (ens32是nat,ens34是仅主机) | 部署的服务 | 操作系统 |
---|---|---|---|
DR | DIP: 192.168.92.130(ens32) VIP: 192.168.118.128(ens34) | ipvsadm | Centos8 |
RS1 | RIP: 192.168.92.131(ens32) GW: DR的DIP | httpd | Centos8 |
RS2 | RIP: 192.168.92.132(ens32) GW: DR的DIP | httpd | Centos8 |
Client | CIP: 192.168.92.149(ens32) | 无 | Centos8 |
1.关闭DR、RS1、RS2、的防火墙与SELinux
systemctl enable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.Real Server配置
real-server所有服务器—默认网关均指向DR的DIP
RS1
[root@RS1 ~]# dnf -y install httpd
[root@RS1 ~]# echo 'RS1' > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd
[root@RS1 ~]# route add default gw 192.168.92.130 dev ens32
RS2
[root@RS2 ~]# dnf -y install httpd
[root@RS2 ~]# echo 'RS2' > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd
[root@RS2 ~]# route add default gw 192.168.92.130 dev ens32
3.DR配置
先给LVS服务器新添一张仅主机模式的网卡,作为VIP。
#新增网卡的IP [root@DR ~]# ip a | grep ens34 3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.118.128/24 brd 192.168.118.255 scope global dynamic noprefixroute ens34 #开启路由转发功能 [root@DR ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf [root@DR ~]# sysctl -p net.ipv4.ip_forward = 1 #安装ipvsadm并添加分发规则 [root@DR ~]# dnf -y install ipvsadm [root@DR ~]# ipvsadm -A -t 192.168.118.128:80 -s rr #rr是轮询 [root@DR ~]# ipvsadm -a -t 192.168.118.128:80 -r 192.168.92.131:80 -m [root@DR ~]# ipvsadm -a -t 192.168.118.128:80 -r 192.168.92.132:80 -m [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.118.128:80 rr -> 192.168.92.131:80 Masq 1 0 0 -> 192.168.92.132:80 Masq 1 0 0 [root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm [root@DR ~]# systemctl restart ipvsadm.service [root@DR ~]# systemctl enable ipvsadm.service
4.client测试
[root@client ~]# curl 192.168.118.128
RS2
[root@client ~]# curl 192.168.118.128
RS1
[root@client ~]# curl 192.168.118.128
RS2
[root@client ~]# curl 192.168.118.128
RS1
环境说明:
DR模式要求DR的DIP 和 所有RS的RIP必须在同一个网段及广播域
所有节点网关均指定真实网关
主机名 | 真实IP | VIP | 部署的服务 | 操作系统 |
---|---|---|---|---|
DR | DIP: 192.168.92.130 | lo: 192.168.92.200 | ipvsadm | Centos8 |
RS1 | RIP: 192.168.92.131 | lo: 192.168.92.200 | httpd | Centos8 |
RS2 | RIP: 192.168.92.132 | lo: 192.168.92.200 | httpd | Centos8 |
Client | CIP: 192.168.92.149 | 无 | 无 | Centos8 |
1.关闭DR、RS1、RS2、的防火墙与SELinux
systemctl enable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.DR配置
#配置lo网卡ip [root@DR ~]# dnf -y install net-tools [root@DR ~]# ip a s lo 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 192.168.92.200/0 brd 192.168.92.200 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever #永久生效lo网卡配置 [root@DR ~]# echo "ifconfig lo 192.168.92.200/32 broadcast 192.168.92.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local [root@DR ~]# chmod +x /etc/rc.d/rc.local #安装ipvsadm并添加规则 [root@DR ~]# dnf -y install ipvsadm [root@DR ~]# ipvsadm -A -t 192.168.92.200:80 -s rr [root@DR ~]# ipvsadm -a -t 192.168.92.200:80 -r 192.168.92.131:80 -g [root@DR ~]# ipvsadm -a -t 192.168.92.200:80 -r 192.168.92.132:80 -g [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.92.200:80 rr -> 192.168.92.131:80 Route 1 0 0 -> 192.168.92.132:80 Route 1 0 0 [root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm [root@DR ~]# systemctl restart ipvsadm.service [root@DR ~]# systemctl enable ipvsadm.service
3.Real Server配置
RS1
#安装httpd,配置首页 [root@RS1 ~]# dnf -y install httpd [root@RS1 ~]# echo 'RS1' > /var/www/html/index.html [root@RS1 ~]# systemctl enable --now httpd #配置内核参数 [root@RS1 ~]# echo 'net.ipv4.conf.lo.arp_ignore = 1' >> /etc/sysctl.conf [root@RS1 ~]# echo 'net.ipv4.conf.lo.arp_announce = 2' >> /etc/sysctl.conf [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.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 #在lo接口上绑定VIP [root@RS1 ~]# dnf -y install net-tools [root@RS1 ~]# ifconfig lo 192.168.92.200/32 broadcast 192.168.92.200 netmask 255.255.255.255 up [root@RS1 ~]# ip a s lo 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 192.168.92.200/0 brd 192.168.92.200 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever #永久生效lo网卡配置 [root@RS1 ~]# echo "ifconfig lo 192.168.92.200/32 broadcast 192.168.92.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local [root@RS1 ~]# chmod +x /etc/rc.d/rc.local #添加路由 [root@RS1 ~]# route add -host 192.168.92.200/32 dev lo
RS2
#安装httpd,配置首页 [root@RS2 ~]# dnf -y install httpd [root@RS2 ~]# echo 'RS2' > /var/www/html/index.html [root@RS2 ~]# systemctl enable --now httpd #配置内核参数 [root@RS2 ~]# echo 'net.ipv4.conf.lo.arp_ignore = 1' >> /etc/sysctl.conf [root@RS2 ~]# echo 'net.ipv4.conf.lo.arp_announce = 2' >> /etc/sysctl.conf [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.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 #在lo接口绑定VIP [root@RS2 ~]# dnf -y install net-tools [root@RS2 ~]# ifconfig lo 192.168.92.200/32 broadcast 192.168.92.200 netmask 255.255.255.255 up [root@RS2 ~]# ip a s lo 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 192.168.92.200/0 brd 192.168.92.200 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever #永久生效lo网卡配置 [root@RS2 ~]# echo "ifconfig lo 192.168.92.200/32 broadcast 192.168.92.200 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local #添加路由 [root@RS2 ~]# chmod +x /etc/rc.d/rc.local [root@RS2 ~]# route add -host 192.168.92.200/32 dev lo
client测试访问
[root@client ~]# curl 192.168.92.200
RS1
[root@client ~]# curl 192.168.92.200
RS2
[root@client ~]# curl 192.168.92.200
RS1
[root@client ~]# curl 192.168.92.200
RS2
环境说明:
DR模式要求DR的DIP 和 所有RS的RIP必须在同一个网段及广播域
所有节点网关均指定真实网关
https与http的配置差别就是多一个ssl加密,其余基本相同
主机名 | 真实IP | VIP | 部署的服务 | 操作系统 |
---|---|---|---|---|
DR | DIP: 192.168.92.130 | lo: 192.168.92.210 | ipvsadm | Centos8 |
RS1 | RIP: 192.168.92.131 | lo: 192.168.92.210 | httpd(https) | Centos8 |
RS2 | RIP: 192.168.92.132 | lo: 192.168.92.210 | httpd(https) | Centos8 |
Client | CIP: 192.168.92.149 | 无 | 无 | Centos8 |
1.关闭DR、RS1、RS2、的防火墙与SELinux
systemctl enable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.Real Server配置
RS1
#配置内核参数 [root@RS1 ~]# vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 [root@RS1 ~]# sysctl -p net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 #lo网卡绑定VIP [root@RS1 ~]# dnf -y install net-tools [root@RS1 ~]# ifconfig lo 192.168.92.210/32 broadcast 192.168.92.210 netmask 255.255.255.255 up [root@RS1 ~]# ip a s lo 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 192.168.92.210/0 brd 192.168.92.210 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever #永久生效lo网卡配置 [root@RS1 ~]# echo 'ifconfig lo 192.168.92.210/32 broadcast 192.168.92.210 netmask 255.255.255.255 up' > /etc/rc.d/rc.local [root@RS1 ~]# chmod +x /etc/rc.d/rc.local #添加路由 [root@RS1 ~]# route add -host 192.168.92.210/32 dev lo #下载httpd,配置https [root@RS1 ~]# dnf -y install httpd mod_ssl #配置https要有ssl模块,默认是有的 [root@RS1 ~]# cat /etc/httpd/conf.modules.d/00-ssl.conf LoadModule ssl_module modules/mod_ssl.so #配置ssl证书 [root@RS1 ~]# mkdir /etc/httpd/ssl [root@RS1 ~]# cd /etc/httpd/ssl [root@RS1 ssl]# openssl genrsa -out httpd.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ..................................................+++++ ....+++++ e is 65537 (0x010001) [root@RS1 ssl]# openssl req -new -key httpd.key -out httpd.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HB Locality Name (eg, city) [Default City]:WH Organization Name (eg, company) [Default Company Ltd]:RT Organizational Unit Name (eg, section) []:YW Common Name (eg, your name or your server's hostname) []:www.yefeng.com Email Address []:yefeng@example.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: [root@RS1 ssl]# openssl x509 -req -days 365 -in httpd.csr -signkey httpd.key -out httpd.crt Signature ok subject=C = CN, ST = HB, L = WH, O = RT, OU = YW, CN = www.yefeng.com, emailAddress = yefeng@example.com Getting Private key [root@RS1 ssl]# ls httpd.crt httpd.csr httpd.key #下面这两行配置不是新增而是在原有默认配置基础上作修改 [root@RS1 ssl]# vi /etc/httpd/conf.d/ssl.conf SSLCertificateFile /etc/httpd/ssl/httpd.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key #测试能否访问 [root@RS1 ssl]# curl -k https://192.168.92.131 RS1
RS2
[root@RS2 ~]# cat >> /etc/sysctl.conf <<EOF > net.ipv4.conf.lo.arp_ignore = 1 > net.ipv4.conf.lo.arp_announce = 2 > net.ipv4.conf.all.arp_ignore = 1 > net.ipv4.conf.all.arp_announce = 2 > EOF [root@RS2 ~]# sysctl -p net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 #配置lo网卡绑定VIP [root@RS2 ~]# dnf -y install net-tools [root@RS2 ~]# ifconfig lo 192.168.92.210/32 broadcast 192.168.92.210 netmask 255 .255.255.255 up [root@RS2 ~]# ip a s lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group defaul t qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 192.168.92.210/0 brd 192.168.92.210 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever #永久生效lo网卡配置 [root@RS2 ~]# echo "ifconfig lo 192.168.92.210/32 broadcast 192.168.92.210 netmask 255.255.255.255 up" >>/etc/rc.d/rc.local [root@RS2 ~]# chmod +x /etc/rc.d/rc.local #添加路由 [root@RS2 ~]# route add -host 192.168.92.210/32 dev lo #下载httpd,配置https [root@RS2 ~]# dnf -y install httpd mod_ssl #创建ssl证书存放位置 [root@RS2 ~]# mkdir /etc/httpd/ssl [root@RS2 ~]# cd /etc/httpd/ssl/ #将RS1的ssl证书传过来用 [root@RS2 ssl]# scp root@192.168.92.131:/etc/httpd/ssl/httpd.* . The authenticity of host '192.168.92.131 (192.168.92.131)' can't be established. ECDSA key fingerprint is SHA256:41MUAgoOJ7cipkGboXt2n0BlrxuPxp2IVlgXn0ahNgg. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.92.131' (ECDSA) to the list of known hosts. root@192.168.92.131's password: httpd.crt 100% 1277 290.0KB/s 00:00 httpd.csr 100% 1033 254.8KB/s 00:00 httpd.key 100% 1679 494.0KB/s 00:00 [root@RS2 ssl]# ls httpd.crt httpd.csr httpd.key #下面这两行配置不是新增而是在原有默认配置基础上作修改 [root@RS1 ssl]# vi /etc/httpd/conf.d/ssl.conf SSLCertificateFile /etc/httpd/ssl/httpd.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key #配置httpd首页,启动并设为开机自启 [root@RS2 ssl]# echo 'RS2' > /var/www/html/index.html [root@RS2 ssl]# systemctl enable --now httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service. #测试访问 [root@RS2 ssl]# curl -k https://192.168.92.132 RS2
DR配置
#配置lo网卡绑定VIP [root@DR ~]# dnf -y install net-tools [root@DR ~]# ifconfig lo 192.168.92.210/32 broadcast 192.168.92.210 netmask 255.255.255.255 up [root@DR ~]# ip a s lo 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 192.168.92.210/0 brd 192.168.92.210 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever #lo网卡配置永久生效 [root@DR ~]# echo "ifconfig lo 192.168.92.210/32 broadcast 192.168.92.210 netmask 255.255.255.255 up" >> /etc/rc.d/rc.local [root@DR ~]# chmod +x /etc/rc.d/rc.local #安装ipvsadm并添加规则 [root@DR ~]# dnf -y install ipvsadm [root@DR ~]# ipvsadm -A -t 192.168.92.210:443 -s rr [root@DR ~]# ipvsadm -a -t 192.168.92.210:443 -r 192.168.92.131:443 -g [root@DR ~]# ipvsadm -a -t 192.168.92.210:443 -r 192.168.92.132:443 -g [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.92.210:443 rr -> 192.168.92.131:443 Route 1 0 0 -> 192.168.92.132:443 Route 1 0 0 [root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm [root@DR ~]# systemctl restart ipvsadm.service [root@DR ~]# systemctl enable ipvsadm.service
client测试
[root@client ~]# curl -k https://192.168.92.210
RS2
[root@client ~]# curl -k https://192.168.92.210
RS1
[root@client ~]# curl -k https://192.168.92.210
RS2
[root@client ~]# curl -k https://192.168.92.210
RS1
环境说明:
主机名 | 真实IP | VIP | 部署的服务 | 操作系统 |
---|---|---|---|---|
DR | DIP: 192.168.92.130 | tunlo: 192.168.92.220 | ipvsadm | Centos8 |
RS1 | RIP: 192.168.92.131 | tunlo: 192.168.92.220 | httpd(https) | Centos8 |
RS2 | RIP: 192.168.92.132 | tunlo: 192.168.92.220 | httpd(https) | Centos8 |
Client | CIP: 192.168.92.149 | 无 | 无 | Centos8 |
1.关闭DR、RS1、RS2、的防火墙与SELinux
systemctl enable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.Real Server配置
RS1
#启用ipip模块,tunl0绑定VIP [root@RS1 ~]# dnf -y install net-tools [root@RS1 ~]# modprobe ipip [root@RS1 ~]# ifconfig tunl0 192.168.92.220 broadcast 192.168.92.220 netmask 255.255.255.255 [root@RS1 ~]# echo "ifconfig tunl0 192.168.92.220 broadcast 192.168.92.220 netmask 255.255.255.255" >> /etc/rc.d/rc.local [root@RS1 ~]# chmod +x /etc/rc.d/rc.local #修改内核参数 [root@RS1 ~]# vim /etc/sysctl.conf net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 [root@RS1 ~]# sysctl -p net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 #安装httpd,配置网站首页 [root@RS1 ~]# dnf -y install httpd [root@RS1 ~]# echo "RS1" > /var/www/html/index.html [root@RS1 ~]# systemctl enable --now httpd
RS2
#启用ipip模块,tunl0绑定VIP [root@RS2 ~]# dnf -y install net-tools [root@RS2 ~]# modprobe ipip [root@RS2 ~]# ifconfig tunl0 192.168.92.220 broadcast 192.168.92.220 netmask 255.255.255.255 [root@RS2 ~]# echo "ifconfig tunl0 192.168.92.220 broadcast 192.168.92.220 netmask 255.255.255.255" >> /etc/rc.d/rc.local [root@RS2 ~]# chmod +x /etc/rc.d/rc.local #修改内核参数 [root@RS2 ~]# vim /etc/sysctl.conf net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 [root@RS2 ~]# sysctl -p net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 #安装httpd,配置网站首页 [root@RS2 ~]# dnf -y install httpd [root@RS2 ~]# echo "RS2" > /var/www/html/index.html [root@RS2 ~]# systemctl enable --now httpd
DR配置
#修改内核参数,开启IP转发 [root@DR ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@DR ~]# sysctl -p net.ipv4.ip_forward = 1 #配置VIP [root@DR ~]# dnf -y install net-tools [root@DR ~]# ifconfig tunl0 192.168.92.220 broadcast 192.168.92.220 netmask 255.255.255.255 [root@DR ~]# ip a |grep tunl0 3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000 inet 192.168.92.220/32 brd 192.168.92.220 scope global tunl0 [root@DR ~]# echo "ifconfig tunl0 192.168.202.201 broadcast 192.168.202.201 netmask 255.255.255.255" >> /etc/rc.d/rc.local [root@DR ~]# chmod +x /etc/rc.d/rc.local #安装ipvsadm并添加规则 [root@DR ~]# dnf -y install ipvsadm [root@DR ~]# ipvsadm -A -t 192.168.92.220:80 -s rr [root@DR ~]# ipvsadm -a -t 192.168.92.220:80 -r 192.168.92.131:80 -i [root@DR ~]# ipvsadm -a -t 192.168.92.220:80 -r 192.168.92.132:80 -i [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.92.220:80 rr -> 192.168.92.220:80 Tunnel 1 0 0 -> 192.168.92.220:80 Tunnel 1 0 0 [root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm [root@DR ~]# systemctl restart ipvsadm.service [root@DR ~]# systemctl enable ipvsadm.service
client测试
[root@client ~]# curl http://192.168.92.220
RS2
[root@client ~]# curl http://192.168.92.220
RS1
[root@client ~]# curl http://192.168.92.220
RS2
[root@client ~]# curl http://192.168.92.220
RS1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。