集群
什么是集群?
- 一组通过网络互联的计算组,并以单一系统的模式加以管理
- 讲很多服务器集中起来一起,提供同一种服务,在客户端看起来就像是只有一个服务器
- 可以自爱付出较低成本的情况下获得在性能,可靠性,灵活性方面的相对较高的收益
- 任务调度时集群系统中的核心技术
集群的目的
- 提高性能
如计算密集型应用,如:天气预报,核试验模拟
- 降低成本
相对百万美元的超级计算机,价格便宜
- 提高可扩展性
只要增加集群节点即可
- 增强可靠性
多个节点完成相同功能,避免单点失败
集群的分类
- 高性能计算机集群HPC
通过以及群开发的并行应用程序,解决复杂的科学问题
- 负载均衡(LB)集群
客户端负载在计算机集群中尽可能平均分摊
- 高可用(HA)集群
避免单点故障,当一个系统发生故障时,可以快速迁移
LVS介绍
- Linux虚拟服务器(Linux Virtual Server)是章文嵩在国防科技大学就读博士期间创建的
- LVS可以实现高可用的,可伸缩的WEB,Mail,Cache和Media等网络服务
- 最终目标是利用Linux操作系统和LVS集群软件实现一个高可用,高性能,低成本的服务器应用集群
- LVS,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发
- LVS是四层(传输层tcp/vdp),七层(应用层)的负载均衡工具,用的最多的是就是四层负载均衡功能的ipvs,七层的内容分发负载ktcpvs(kenrnel tcp virtual server),基于内容的调度,因为应用层交换处理复杂,但伸缩性有限.
- LVS是集成在Linux内核里
LVS集群的组成
- 前端:负载均衡层
由一台或多台负载均衡层调度器构成
- 中间:服务器群组成
由一组实际运行应用服务的服务器组成
- 底端:数据共享存储层
提供共享存储空间的存储区域
LVS与Nginx的区别
LVS的性能(效率)大于>Nginx
Nginx代理服务器:
数据封装:
- 客户端访问代理服务器的时候数据包是四层封装,代理服务器进行解压再查看访问数据
- 代理服务器充当客户端角色进行数据封装转发给后台服务器
- 后台服务进行解压数据包返回数据的同时进行数据封装交给代理服务器
- 再由代理服务器回传给客户端
IP地址角度:
- 客户端4.10===> Nginx代理4.5/2.5 ===>Web服务器2.100
- Web服务器2.100==>Nginx代理2.5/4.5===>客户端4.10
LVS调度器:
- LVS可以实现动态路由功能
IP地址角度:
- 客户端4.10===>LVS调度器4.5(NAT地址转换4.10/2.100)===>Web服务器2.100
- Web服务器2.100===>LVS调度器(NAT地址转换4.5/4.10===>客户端4.10
- 调度器不会处理客户端的数据包请求,通过NAT地址转换起到一个转发数据包给后端服务器的功能,(相当于客户端直接访问后端服务器)
- 由后端服务器处理完数据包通过LVS调度器回传给客户端
LVS与路由器的区别
- lvs除了能实现路由的功能,还能实现负载均衡,是一个动态的路由器
- 路由器NAT地址转换只能实现把公网转换成私网,在把私网转换成公网,导致客户端访问的都是同一台服务器.
LVS的缺点
- 功能少
- 不支持正则
- 不能做动态网站
- 不能做动静分离
- 不具备健康检查功能
LVS术语
- Director Server:调度服务器
将负载分发到Real Server的服务器
- Real Server:真实服务器
真正提供应用的服务器
- VIP :虚拟IP地址
公布给用户访问的虚拟IP地址
- RIP:真实IP地址
集群节点上使用的IP地址
- DIP:调度器连接节点服务器的IP地址
- CIP:客户端的IP地址
LVS工作模式
VS/NAT
- 通过网络地址转换实现的虚拟服务器
- 大并发访问时,调度器的性能成为瓶颈
- 处理客户端数据请求流量不大,返回数据的流量大
- 导致调度器处理数据流量的压力更大
NAT模式工作流程
NAT即网络地址转换,其作用是将源(客户端)的IP地址转发给后端服务器
后端服务器处理完数据后通过NAT地址回传给客户端
VS/TUN
- 通过隧道方式实现虚拟服务器
TUN模式工作流程
这个模式是基于调度器与后端服务器是跨地区的情况
客户端访问LVS调度器,LVS通过vpn技术把用户的请求转发到后端服务器
再由服务器把处理数据的结果通过vpn回传给客户端
这样做的最大缺点就是: 跨地区会导致网络延迟很大访问效率速度更低
VS/DR
- 直接使用路由技术实现虚拟服务器
- 节点服务器需要配置VIP,注意MAC地址广播
- 可以满足更大规模的集群
DR模式工作流程
由LVS调度转发客户端数据请求给后端服务器,由后端服务器处理
后端服务器处理完成后伪装成LVS调度器回传给客户端
LVS的负载均衡调度算法
- LVS目前实现了10中调度算法
- 常用的调度算法有四种
- 轮询(Round Robin)简称RR
- 加权轮询(Weighted Round Robin)简称WRR
- 最少连接(Least Connections)简称LC
- 加权最少连接(Weighted Least Connections)简称WLC
轮询:将客户端的请求平均分发到Real Server,
加权轮询:根据Real Server权重值进行轮询
最少连接:选择连接最少数的服务器
加权最少连接:根据Real Server权重值,选择连接数最少的服务器
最小延迟:找网速更快的服务器
网卡的延迟与网卡的带宽,数据的流量有关
最少队列调度:当已经达到最大的并发量时,客户端访问则自动进行排队,哪个服务器的排队最少则自动将客户端放到该队列
源地址散列(Source Hashing):根据请求的目标地址IP,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器
其他调度算法:
基于局部性的最少连接
带复制的基于局部性最少连接
目标地址散列(Destination Hashing)
最短的期望的延迟
最少队列调度
LVS-NAT集群
LVS的IP负载均衡技术是通过IPVS模块实现的
IPVS模块已成为Linux的组成部分
[root@proxy ~]# grep -i 'ipvs' /boot/config-3.10.0-862.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS SH scheduler
# IPVS application helper
ipvsadm命令用法
准备一台Linux服务器,安装ipvsadm软件包,练习使用ipvsadm命令,实现如下功能:
- 使用命令添加基于TCP一些的集群服务
- 在集群中添加若干台后端真实服务器
- 实现同一客户端访问,调度器分配固定服务器
- 会使用ipvsadm实现规则的增、删、改
- 保存ipvsadm规则
方案安装ipvsadm软件包,关于ipvsadm的用法可以参考man ipvsadm资料。
常用ipvsadm命令语法格式如表-1及表-2所示。
使用命令增(add)、删(delete)、改(edit)、清除所有(clear)LVS集群规则
1)创建LVS虚拟集群服务器(算法为轮询:rr)
[root@proxy ~]# yum -y install ipvsadm #下载ipvsadm
[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s rr #新建虚拟集群
新建一个虚拟服务器,协议是tcp服务,算法为轮询算法
[root@proxy ~]# 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.4.5:80 rr
2)为集群添加若干real server
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100:80 #添加真实服务器,添加到192.168.4.5的虚拟机群,添加realserver
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200:80
[root@proxy ~]# 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.4.5:80 rr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 1 0 0
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.201:80 -w 2
#再添加一台权重为2的服务器
[root@proxy ~]# 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.4.5:80 rr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 1 0 0
-> 192.168.2.201:80 Route 2 0 0
[root@proxy ~]# ipvsadm -e -t 192.168.4.5:80 -r 192.168.2.200:80 -w 3
#修改realserver192.168.2.200的权重为3
[root@proxy ~]# 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.4.5:80 rr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 3 0 0
-> 192.168.2.201:80 Route 2 0 0
当算法为轮询时,不论权重多少都依然自动执行轮询算法
3)修改集群服务器设置(修改调度器算法,将轮询修改为加权轮询)
[root@proxy ~]# ipvsadm -E -t 192.168.4.5:80 -s wrr
[root@proxy ~]# 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.4.5:80 wrr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 3 0 0
-> 192.168.2.201:80 Route 2 0 0
4)修改read server(使用-g,-m,-i选项,默认即为DR模式,-m为NAT模式,-i为Tunnel模式)
[root@proxy ~]# ipvsadm -e -t 192.168.4.5:80 -r 192.168.2.202 -g
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.202:80 -m
[root@proxy ~]# 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.4.5:80 wrr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 3 0 0
-> 192.168.2.201:80 Route 2 0 0
-> 192.168.2.202:80 Masq 1 0 0
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.203:80 -i
[root@proxy ~]# 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.4.5:80 wrr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 3 0 0
-> 192.168.2.201:80 Route 2 0 0
-> 192.168.2.202:80 Masq 1 0 0
-> 192.168.2.203:80 Tunnel 1 0 0
下面仅实验NAT模式与DR模式,TUN模式不常用
LVS-NAT集群
- LVS的IP负载均衡技术是用过IPVS模块实现的
- IPVS模块已成为Linux组成部分
LVS-NAT集群拓扑图
操作流程
- Real Server:
- 配置WEB服务器
- Director server:
- 在上安装并启用ipvsadm
- 创建虚拟服务器
- 向虚拟服务器中加入节点
- Client:
- 连接虚拟服务器测试
部署LVS-NAT集群
问题
使用LVS实现NAT模式的集群调度服务器,为用户提供Web服务:
- 集群对外公网IP地址为192.168.4.5
- 调度器内网IP地址为192.168.2.5
- 真实Web服务器地址分别为192.168.2.100、192.168.2.200
- 使用加权轮询调度算法,真实服务器权重分别为1和2
方案
实验拓扑结构主机配置细节如表所示。
使用4台虚拟机,1台作为Director调度器、2台作为Real Server、1台客户端,拓扑结构如图所示,注意:web1和web2必须配置网关地址。
步骤一:配置基础环境
1 ) 为web1和web2配置服务器网关
[root@web1 ~]# nmcli connection modify eth1 ipv4.method manual ipv4.gateway 192.168.2.5
[root@web1 ~]# nmcli connection up eth1
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
####################################################################
也可以更改/etc/sysconfig/network配置文件
[root@web1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.5 0.0.0.0 UG 104 0 0 eth1
192.168.2.0 0.0.0.0 255.255.255.0 U 104 0 0 eth1
[root@web2 ~]# nmcli connection modify eth1 ipv4.method manual ipv4.gateway 192.168.2.5
[root@web2 ~]# nmcli connection up eth1
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
[root@web2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.5 0.0.0.0 UG 104 0 0 eth1
192.168.2.0 0.0.0.0 255.255.255.0 U 104 0 0 eth1
2)设置Web服务器(下载可忽略)
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# vim /etc/httpd/conf/httpd.conf
95 ServerName www.example.com:80
[root@web1 ~]# echo 123123 > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
[root@web1 ~]# curl http://192.168.2.100
123123
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
95 ServerName www.example.com:80
[root@web2 ~]# echo 456456 > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
[root@web2 ~]# curl 192.168.2.200
456456
常见问题:如果httpd服务启动启动的比较慢?
解决方法:可以修改/etc/httpd/conf/httpd.conf文件,
将ServerName www.example.com:80这行的#注释符删除即可。
3 ) 客户端访问测试
[root@proxy ~]# curl 192.168.2.100
123123
[root@proxy ~]# curl 192.168.2.200
456456
步骤二:部署LVS-NAT模式调度器
1 ) 确认调度器的路由转发功能(如果已经开启,可以忽略)
[root@web1 ~]# cat /proc/sys/net/ipv4/ip_forward #确认路由是否开启,0是没开启,1是已经开启
1
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #临时修改
[root@proxy ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@proxy ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
#修改配置文件,设置永久规则
2)创建集群服务器
[root@proxy ~]# yum -y install ipvsadm
[root@proxy ~]# ipvsadm -C
[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s wrr
3)添加真实服务器
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100:80 -m
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200:80 -m
4)查看规则列表,并保存规则
[root@proxy ~]# 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.4.5:80 wrr
-> 192.168.2.100:80 Masq 1 0 0
-> 192.168.2.200:80 Masq 1 0 0
[root@proxy ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
步骤三:客户端测试
客户端使用curl命令反复连接http://192.168.4.5,查看访问的页面是否会轮询到不同的后端真实服务器。
lvs集成在内核,只要Linux启动,lvs就自动集成
[root@client ~]# curl 192.168.4.5
456456
[root@client ~]# curl 192.168.4.5
123123
[root@client ~]# curl 192.168.4.5
456456
[root@client ~]# curl 192.168.4.5
123123
LVS-DR集群
LVS-DR集群拓扑图
操作流程
- Real Server :
- 配置WEB服务器
- 配置辅助IP地址,调整内核参数
- Director Server :
- 在上安装并启用ipvsadm
- 配置辅助IP地址
- 创建虚拟服务器,向虚拟服务器中加入节点
- Client :
- 连接虚拟服务器测试
ARP广播问题
- 当客户端发起访问VIP时,对应的域名的请求时,根据网络通讯原理会产生ARR广播
- 因为负载均衡器和真实的服务器在同一网络并且VIP设置在集群中的每个节点上
- 此时集群内的真实服务器会尝试回答来自客户端的ARR广播,这就会产生问题,大家都说我是"VIP"
ARP防火墙
- 使用ARP防火墙也可以禁止对VIP的ARP请求
[root@client ~]# yum -y install arptables_if
[root@client ~]# arptables -A IN -d <virtual_ip> -j DROP
[root@client ~]# arptables -A IN -d OUT -s <virtual_ip> -j mangle \
>--mangle-ip-s <real_ip>
内核参数说明
- arp_ignore(定义回复ARR广播方式)
- 0(默认值)
- 回应所有的本地地址ARR广播,本地地址可以配置在任意网络接口
- 1
- 只回应配置在入站网卡接口上的任意IP地址的ARR广播
- arp_announce
- 0(默认)
- 使用配置在任意网卡接口上的本地IP地址
- 2
- 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.如果没有合适的地址被发现,将选择当前的发送网络接口或其他有可能接收到该ARR回应的网络接口来进行发送
部署LVS-DR集群
问题
使用LVS实现DR模式的集群调度服务器,为用户提供Web服务:
- 客户端IP地址为192.168.4.10
- LVS调度器VIP地址为192.168.4.15
- LVS调度器DIP地址设置为192.168.4.5
- 真实Web服务器地址分别为192.168.4.100、192.168.4.200
- 使用加权轮询调度算法,web1的权重为1,web2的权重为2
说明:
CIP是客户端的IP地址;
VIP是对客户端提供服务的IP地址;
RIP是后端服务器的真实IP地址;
DIP是调度器与后端服务器通信的IP地址(VIP必须配置在虚拟接口)。
方案
使用4台虚拟机,1台作为客户端、1台作为Director调度器、2台作为Real Server,拓扑结构如图所示。实验拓扑结构主机配置细节如表所示。
步骤一:配置实验网络环境
1)设置Proxy服务器的VIP和DIP
注意:为了防止冲突,VIP必须要配置在网卡的虚拟接口!!!
[root@proxy ~]# cd /etc/sysconfig/network-scripts/
[root@proxy network-scripts]# ls
ifcfg-eth0 ifdown-eth ifdown-sit ifup-eth ifup-ppp init.ipv6-global
ifcfg-eth1 ifdown-ippp ifdown-Team ifup-ippp ifup-routes network-functions
ifcfg-eth2 ifdown-ipv6 ifdown-TeamPort ifup-ipv6 ifup-sit network-functions-ipv6
ifcfg-eth3 ifdown-isdn ifdown-tunnel ifup-isdn ifup-Team
ifcfg-lo ifdown-post ifup ifup-plip ifup-TeamPort
ifdown ifdown-ppp ifup-aliases ifup-plusb ifup-tunnel
ifdown-bnep ifdown-routes ifup-bnep ifup-post ifup-wireless
[root@proxy network-scripts]# cp ifcfg-eth0{,:0}
[root@proxy network-scripts]# vim ifcfg-eth0:0
1 TYPE=Ethernet #网卡类型为:以太网卡
4 BOOTPROTO=none #none手动配置IP,或者dhcp自动配置IP
6 NAME=eth0:0 #网卡名称
7 DEVICE=eth0:0 #设备名称
8 ONBOOT=yes #开机时是否自动激活该网卡
9 IPADDR=192.168.4.15 #IP地址
10 PREFIX=24 #子网掩码
[root@proxy network-scripts]# systemctl restart network #重启
[root@proxy network-scripts]# ifconfig #此时多了一个eth0:0的网卡,其他主机也可以ping通该IP
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.5 netmask 255.255.255.0 broadcast 192.168.4.255
ether 52:54:00:2f:40:71 txqueuelen 1000 (Ethernet)
RX packets 11438 bytes 698521 (682.1 KiB)
RX errors 0 dropped 8612 overruns 0 frame 0
TX packets 1826 bytes 222235 (217.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.15 netmask 255.255.255.0 broadcast 192.168.4.255
ether 52:54:00:2f:40:71 txqueuelen 1000 (Ethernet)
.......
[root@proxy ~]# ip a s eth0 #查看ip的另一种方法
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:2f:40:71 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.5/24 brd 192.168.4.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 192.168.4.15/24 brd 192.168.4.255 scope global secondary noprefixroute eth0:0
valid_lft forever preferred_lft forever
常见问题:RHEL7和Centos7系统中有两个管理网络的服务,有可能冲突?
解决方法:关闭NetworkManager服务后重启network即可。[root@proxy network-scripts]# systemctl stop NetworkManager
2)设置Web1服务器网络参数
[root@web1 ~]# nmcli connection modify eth0 ipv4.method manual \
ipv4.addresses 192.168.4.100/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up eth0
接下来给web1配置VIP地址。
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。
[root@web1 network-scripts]# cp ifcfg-lo{,:0}
1 DEVICE=lo:0 #设备名称
2 IPADDR=192.168.4.15 #IP地址
3 NETMASK=255.255.255.255 #子网掩码
4 NETWORK=192.168.4.15 #网络地址
5 BROADCAST=192.168.4.15 #广播地址
6 ONBOOT=yes #开机时是否自动激活该网卡
7 NAME=lo:0 #网卡名称
防止地址冲突的问题:
这里因为web1也配置与调度器一样的VIP地址,默认肯定会出现地址冲突;
sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这样防止地址冲突的问题。
[root@web1 network-scripts]# vim /etc/sysctl.conf
#手动写入如下4行内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#arp_ignore 当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
#arp_announce 本机不要向外宣告自己的lo回环地址是192.168.4.15
[root@web1 network-scripts]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
重启网络服务,设置防火墙与SELinux
[root@web1 network-scripts]# systemctl restart network
[root@web1 network-scripts]# ifconfig
......
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.4.15 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
3)设置Web2服务器网络参数
[root@web2 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.200/24 connection.autoconnect yes
[root@web2 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@web2 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.200 netmask 255.255.255.0 broadcast 192.168.4.255
ether 52:54:00:3e:8d:bf txqueuelen 1000 (Ethernet)
RX packets 10245 bytes 533756 (521.2 KiB)
RX errors 0 dropped 10193 overruns 0 frame 0
TX packets 1 bytes 42 (42.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
接下来给web2配置VIP地址
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 network-scripts]# vim ifcfg-lo:0
1 DEVICE=lo:0 #设备名称
2 IPADDR=192.168.4.15 #IP地址
3 NETMASK=255.255.255.255 #子网掩码
4 NETWORK=192.168.4.15 #网络地址
5 BROADCAST=192.168.4.15 #广播地址
6 ONBOOT=yes #开机时是否自动激活该网卡
7 NAME=lo:0 #网卡名称
防止地址冲突的问题:
这里因为web1也配置与调度器一样的VIP地址,默认肯定会出现地址冲突;
sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这样防止地址冲突的问题。
[root@web2 ~]# vim /etc/sysctl.conf
[root@web2 network-scripts]# vim /etc/sysctl.conf
#手动写入如下4行内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#arp_ignore 当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
#arp_announce 本机不要向外宣告自己的lo回环地址是192.168.4.15
[root@web2 network-scripts]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
重启网络服务,设置防火墙与SELinux
[root@web2 network-scripts]# systemctl restart network
[root@web2 network-scripts]# ifconfig
....
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.4.15 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
步骤二:proxy调度器安装软件并部署LVS-DR模式调度器
1)安装软件(如果已经安装,此步骤可以忽略)
[root@proxy ~]# yum -y install ipvsadm
2)清理之前实验的规则,创建新的集群服务器规则
[root@proxy ~]# ipvsadm -C #清空所有规则
[root@proxy ~]# ipvsadm -A -t 192.168.4.15:80 -s wrr
3)添加真实服务器(-g参数设置LVS工作模式为DR模式,-w设置权重)
[root@proxy network-scripts]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100:80
[root@proxy network-scripts]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200:80
4)查看规则列表,并保存规则
[root@proxy network-scripts]# 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.4.15:80 wrr
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 1 0 0
步骤三:客户端测试
客户端使用curl命令反复连接http://192.168.4.15,查看访问的页面是否会轮询到不同的后端真实服务器。
扩展知识:默认LVS不带健康检查功能,需要自己手动编写动态检测脚本,实现该功能:(参考脚本如下,仅供参考)
[root@client ~]# curl 192.168.4.15
456456
[root@client ~]# curl 192.168.4.15
123123
[root@client ~]# curl 192.168.4.15
456456
[root@client ~]# curl 192.168.4.15
123123
[root@client ~]# curl 192.168.4.15
456456
脚本如下:
[root@proxy ~]# vim jiancha.sh
#!/bin/bash
vip=192.168.4.15:80
rip1=192.168.4.100
rip2=192.168.4.200
while :
do
for IP in $rip1 $rip2
do
curl -s http://$IP &> /dev/null
if [ $? -eq 0 ];then
ipvsadm -Ln | grep -q $IP || ipvsadm -a -t $vip -r $vip
else
ipvsadm -Ln | grep -q $IP && ipvsadm -d -t $vip -r $vip
fi
done
sleep 1
done
[root@proxy ~]# chmod +x check.sh
##usleep 沉睡(毫秒)