LVS+Keeplive
一、LVS理论概述
- LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
- 群集的含义
- Cluster,集群、群集
- 由多台主机构成,但对外只表现为一个整体
- 在互联网的应用中,随着站点对硬件性能、相应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器会显得力不从心。所以这个时候可以使用普通服务器来构建服务群集
1.1 群集分类
- 根据群集所针对的目标差异,可分为三种类型
- 负载均衡群集
- 高可用群居
- 高性能运算群集
1.1.1 负载均衡群集(Load Balance Cluster)
- 以提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,从而获得高并发、高负载(LB)的整体性能
- LB的负载分配依赖于主节点的分流算法
1.1.2 高可用群集(High Availability Cluster)
- 以提高应用系统的可靠性、尽可能地减少终端时间为目标,确保服务的连续性,达到高可用(HA)的容错效果
- HA的工作方式包括双工和主从两种模式
1.1.3 高性能运算群集(High Performance Computer Cluster)
- 以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力
- 高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,从而实现只有大型、超级计算机才具备的计算能力
1.2 负载均衡群集架构
- 第一层,负载调度器(Load Balancer或Director)
- 接收客户请求,并将请求发给资源池
- 第二层,服务器池(Server Pool)
- 等待调度器分配任务
- 第三层,共享存储(Share Storage)
- 给予前段负载调度和服务器池提供存储空间
- 阿里使用的负载调度器则为SLB
- SLB包含了LVS和Tengine(基于Nginx功能开发)
- LVS控制的是四层(传输层)即可控制IP也可控制端口
- Tengine控制的是七层(应用层,例如:HTTP、HTTPS)
- 所有SLB集合同时控制了四层和七层,安全性很高
1.3 负载均衡群集工作模式
- 群集的负载调度技术有三种工作模式
- 地址转换(NAT模式)
- IP隧道(TUN模式)
- 直接路由(DR模式)
1.3.1 地址转换(NAT模式)
- Network Address Translation,简称NAT模式
- 类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口
- 服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种模式
1.3.2 IP隧道(TUN模式)
- IP Tunner,简称TUN模式
- 采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器
- 服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器互相通信
- VPN实现了隧道和数据的两重加密
- VPN在私网和公网都会应用
- IP隧道的所有服务器都在公网模式下
1.3.3 直接路由(DR模式)
- Direct Routing,简称DR模式
- 采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络
- 负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道
1.3.4 三种工作模式的区别
工作模 | server number 节点数量 | 真实网关 | IP地址 | 优点 | 缺点 |
---|---|---|---|---|---|
NAT | low 10-20 | 负载调度器 | 公网+私网 | 安全性高 | 效率低、压力大 |
TUN | High 100 | 只有路由器 | 公网 | 安全、速度快 | 需要隧道技术 |
DR | High 100 | 自由路由器 | 私网 | 性能最好 | 不能跨越LAN(局域网) |
1.4 LVS-DR数据包流向分析
- Client向目标VIP发出请求,Director(负载均衡器)接收
- Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送
- RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文。随后重新封装报文,发送到局域网
- Client将收到回复报文。Client认为得到正常的服务,而不会知道是哪一台服务器处理的
- 但是如果跨网段的话,则报文通过路由器经由Internet返回给用户
1.5 LVS-DR特性
Director Server 和 Real Server 必须在同一个物理网络中
Real Server 可以使用私有地址,也可以使用公网地址;如果使用公网地址,可以通过互联网对 RIP 进行直接访问
Director Server 作为群集的访问入口,但不作为网关使用
所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server
Real Server 的网关不允许指向 Director Server IP,即 Real
Server 发送的数据包不允许经过 Director Server
Real Server 上的 lo 接口配置 VIP 的 IP 地址
1.6 LVS-DR中的ARP问题
1.6.1 问题一
- 在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址,但在局域网中具有相同的 IP 地址,势必会造成各服务器 ARP 通信的紊乱
- 当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
- 只有前段的负载均衡器进行相应,其他节点服务器不应该相应ARP广播
解决方案:
- 对节点服务器进行处理,使其不相应针对VIP的ARP请求
- 使用虚拟接口lo:0承载VIP地址
- 设置内核参数arp_ignore=1(系统只相应目的IP为本地IP的ARP请求)
1.6.2 问题二
- RealServer返回报文(源IP时VIP)经由路由器转发,重新封装报文时,需要先获取路由器的MAC地址,而且发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址
- 路由器接收到ARP请求后,将更新ARP表项
- 原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC
- 路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
解决方案
- 对节点服务器进行处理,设置内核参数 arp_announce=2(系统不使用 IP 包的源地址来设置 ARP 请求的源地址,而选择发送接口的 IP 地址)
- 修改 /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
1.7 LVS负载的调度算法
1.7.1 轮询(Round Robin)
- 将收到的访问请求按照顺序轮流分配给群集中的各节点(真实服务器),从而均等的对待每一台服务器,不去管服务器实际的连接数和系统负载
1.7.2 加权轮询(Weighted Round Robin)
- 根据调度器设置的权重值来分发请求,权重值高的节点优先获得任务,分配的请求越多
- 保证性能强的服务器承担更多的访问流量
1.7.3 最少连接(Least Connections)
- 根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点
1.7.4 加权最少连接(Weighted Least Connections)
- 在服务器节点的性能差异较大时,可以为真实服务器自动调整权重
- 性能较高的节点将承担更大比例的活动连接负载
二、ipvsadm工具(LVS主要使用的工具)
2.1 LVS群集创建与管理示意图
2.2 ipvsadm概述
- 从2.4版本开始,linux内核默认支持LVS
- 要使用LVS的能力,只需要安装一个LVS的管理工具(ipvsadm)即可
- ipvsadm作用:向用户提供一个命令接口,用于将配置的虚拟服务、真实服务等传给IPVS模块
- lvs的结构主要分为两部分
- ①工作在内核空间的IPVS模块(LVS的能力实际上都是由IVPS模块实现)
- ②工作在用户空间的ipvsadm管理工具
2.3 ipvsadm工具常用选项
选项 | 说明 |
---|---|
-A | 添加虚拟服务器 |
-D | 删除整个虚拟服务器 |
-s | 指定负载调度算法 轮询::rr、加权轮询:wrr、最少连接:lc、加权最少连接:wlc |
-a | 表示添加真实服务器(节点服务器) |
-d | 删除某一个节点 |
-t | 指定VIP地址及TCP端口 |
-r | 指定RIP地址及TCP端口 |
-m | 表示使用NAT群集模式 |
-g | 表示使用DR模式 |
-i | 表示使用TUN模式 |
-w | 设置权重 权重为0时表示暂停节点 |
-p 60 | 表示保持长连接60秒 |
-l | 列表查看LVS虚拟服务器(默认查看所有) |
-n | 以数字形式显示地址、端口等信息 常与"-l"选项组合使用 |
三、Keepalive理论概述
- Keepalived可实现多机热备,每个热备组可有多台服务器
- 双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
3.1 什么是Keepalive
- Keepalive工具是专门为LVS和HA设计的一款健康检查工具
- 支持故障自动切换(Failover)
- 支持节点健康状态检查(Health Checking)
- 官方网站
3.2 Keepalived实现原理
- Keepalived采用的是VRRP热备份协议来实现Linux服务器的多机热备份功能
- VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案
- 由多台路由器组成一个热备组,通过共同的虚拟IP地址对外提供服务
- 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
- 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
四、LVS-NAT部署
4.1 集群规划
- LVS负载调度器:ens33:192.168.200.1;ens37:12.0.0.1
- Web节点服务器1:192.168.200.60
- Web节点服务器2:192.168.200.70
- NFS服务器:192.168.200.80
- 客户端(Window10):12.0.0.12
4.2 部署共享存储
- 添加两块磁盘并将其格式化与永久挂载
fdisk /dev/sdc
n
↓
p
回车
↓
回车
↓
w
[root@localhost ~]# mkfs.xfs /dev/sdc1
[root@localhost ~]# mkdir /opt/qz1
[root@localhost ~]# mkdir /opt/qz2
[root@localhost ~]# vim /etc/fstab
/dev/sdb1 /opt/qz1 xfs defaults 0 0
/dev/sdc1 /opt/qz2 xfs defaults 0 0
[root@localhost ~]# mount -a
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 xfs 20G 33M 20G 1% /opt/qz1
/dev/sdc1 xfs 20G 33M 20G 1% /opt/qz2
- 修改配置文件(给予可读写、不对访问的root做降级处理)
[root@localhost ~]# yum install -y nfs-utils.x86_64 rpcbind.x86_64
[root@localhost ~]# vim /etc/exports
/opt/qz1 192.168.200.0/24(rw,sync,no_root_squash)
/opt/qz2 192.168.200.0/24(rw,sync,no_root_squash)
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# setenforce 0
- 开启nfs及rpcbind(远程调用)服务
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# showmount -e 【查询是否可以提供存储路径】
Export list for localhost.localdomain:
/opt/qz2 192.168.200.0/24
/opt/qz1 192.168.200.0/24
- 将nfs虚拟机网卡改为仅主机并修改网卡ip
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.200.80
GATEWAY=192.168.200.1
【重启网卡并查看】
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.80 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::d84e:b504:3cd7:b61c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e1:9c:bc txqueuelen 1000 (Ethernet)
RX packets 7098 bytes 8177133 (7.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3526 bytes 292107 (285.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.3 配置两台Web服务器
- 安装apache并修改网卡(为仅主机模式并配置nat)
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum -y install httpd
- Web节点服务器1
[root@localhost /]# systemctl restart network
[root@localhost /]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.60 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::f8fc:7087:375:efee prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:14:03:40 txqueuelen 1000 (Ethernet)
RX packets 1273 bytes 98170 (95.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 603 bytes 67166 (65.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost /]# showmount -e 192.168.200.80 【查询共享的站点】
Export list for 192.168.200.80:
/opt/qz2 192.168.200.0/24
/opt/qz1 192.168.200.0/24
[root@localhost /]# vim /etc/fstab 【执行挂载(netdev 网络 设备)】
192.168.200.80:/opt/qz1 /var/www/html nfs defaults,_netdev 0 0
[root@localhost /]# mount -a
[root@localhost /]# df -hT 【查询发现挂载成功】
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda3 xfs 36G 3.2G 33G 9% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 9.0M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 151M 346M 31% /boot
tmpfs tmpfs 394M 24K 394M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt
192.168.200.80:/opt/qz1 nfs4 20G 32M 20G 1% /var/www/html
[root@localhost /]# vim /var/www/html/index.html 【编辑首页文件】
this is qz1
[root@localhost /]# systemctl start httpd.service
[root@localhost /]# netstat -natp | grep 80
tcp 0 0 192.168.200.60:750 192.168.200.80:2049 ESTABLISHED -
tcp6 0 0 :::80 :::* LISTEN 38698/httpd
- Web节点服务器2
[root@localhost /]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.200.70
GATEWAY=192.168.200.1
[root@localhost /]# systemctl restart network
[root@localhost /]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.70 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::d973:c31f:de9:7a26 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e9:a9:02 txqueuelen 1000 (Ethernet)
RX packets 86027 bytes 124109476 (118.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13067 bytes 824666 (805.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost /]# showmount -e 192.168.200.80 【查询共享的站点】
Export list for 192.168.200.80:
/opt/qz2 192.168.200.0/24
/opt/qz1 192.168.200.0/24
[root@localhost /]# vim /etc/fstab 【执行挂载(netdev 网络 设备)】
192.168.200.80:/opt/qz1 /var/www/html nfs defaults,_netdev 0 0
[root@localhost /]# mount -a
[root@localhost /]# df -hT 【查询发现挂载成功】
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda3 xfs 36G 4.2G 32G 12% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 9.0M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 151M 346M 31% /boot
tmpfs tmpfs 394M 24K 394M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
192.168.200.80:/opt/qz2 nfs4 20G 32M 20G 1% /var/www/html
[root@localhost /]# vim /var/www/html/index.html 【编辑首页文件】
this is qz2
[root@localhost /]# systemctl start httpd.service
[root@localhost /]# netstat -natp | grep 80
tcp 0 0 192.168.200.60:750 192.168.200.80:2049 ESTABLISHED -
tcp6 0 0 :::80 :::* LISTEN 38698/httpd
4.4 配置LVS服务器
- 安装NFS服务并添加一张网卡后对两张网卡进行修改(将两张网卡均设为仅主机模式)
[root@localhost /]# yum -y install ipvsadm.x86_64
【将原有的ens33复制一份并命名ens36】
[root@localhost /]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
[root@localhost /]# ls /etc/sysconfig/network-scripts/
ifcfg-ens33 ifdown-eth ifdown-post ifdown-TeamPort ifup-eth ifup-plip ifup-sit init.ipv6-global
ifcfg-ens36 ifdown-ib ifdown-ppp ifdown-tunnel ifup-ib ifup-plusb ifup-Team network-functions
ifcfg-lo ifdown-ippp ifdown-routes ifup ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6
ifdown ifdown-ipv6 ifdown-sit ifup-aliases ifup-ipv6 ifup-ppp ifup-tunnel
ifdown-bnep ifdown-isdn ifdown-Team ifup-bnep ifup-isdn ifup-routes ifup-wireless
【将GATEWAY删除,并需注意UUID(因为刚才cp所以2个网卡UUID一样,这里需要注释或者直接删除一个UUID)】
[root@localhost /]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.200.1
[root@localhost /]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
NAME="ens36"
#UUID="021107b9-a0f6-408f-a69a-173ddd0e56e7"
DEVICE="ens36"
IPADDR=12.0.0.1
[root@localhost /]# systemctl restart network
[root@localhost /]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.1 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::ab89:d3a4:973b:7351 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e3:f1:cd txqueuelen 1000 (Ethernet)
RX packets 11456 bytes 14361155 (13.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3355 bytes 230228 (224.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 12.0.0.1 netmask 255.255.255.0 broadcast 12.0.0.255
inet6 fe80::d352:1443:c684:2884 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e3:f1:d7 txqueuelen 1000 (Ethernet)
RX packets 1156 bytes 71562 (69.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 237 bytes 40924 (39.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 测试连通性
【分别在Web1、Web2、NFS主机上进行ping测试】
[root@localhost ~]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
64 bytes from 192.168.200.1: icmp_seq=1 ttl=64 time=0.305 ms
- 永久开启路由转发功能
[root@localhost /]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 【在配置文件的最下面一行进行添加】
[root@localhost /]# sysctl -p 【开启地址转发】
net.ipv4.ip_forward = 1
- iptables相关配置
[root@localhost /]# iptables -F 【清除防火墙转发表】
[root@localhost /]# iptables -t nat -F 【清除nat地址转换表】
[root@localhost /]# iptables -t nat -A POSTROUTING -o ens36 -s 192.168.200.0/24 -j SNAT --to-source 12.0.0.1
【-t:指定nat地址转换表】
【-A:在链末尾插入(POSTROUTING 链)出口为ens36】
【-s:转换的源地址】
【-j:参数,操作】
【SNAT:基于源地址转化】
【--to-source 12.0.0.1:转换为12.0.0.1】
[root@localhost /]# iptables -t nat -L
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.200.0/24 anywhere to:12.0.0.1
- Window10客户端(12.0.0.12)进行ping测试
4.5 加载LVS调度模块(集成在内核中)
[root@localhost /]# modprobe ip_vs 【加载模块】
[root@localhost /]# cat /proc/net/ip_vs 【查看模块】
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@localhost /]# ipvsadm --save > /etc/sysconfig/ipvsadm 【先保存命令】
[root@localhost /]# systemctl start ipvsadm.service 【在开启服务】
- 定义脚本
[root@localhost /]# cd /opt/
[root@localhost opt]# vim nat1.sh
#!/bin/bash
ipvsadm -C 【清空ipvs缓存(相当于初始化)】
ipvsadm -A -t 12.0.0.1:80 -s rr 【指定一个访问入口ip(端口为80)和调度算法rr(轮询)】
ipvsadm -a -t 12.0.0.1:80 -r 192.168.200.60:80 -m 【-a:添加真实服务器,建立ip地址映射关系,映射地址为12.0.0.1】
ipvsadm -a -t 12.0.0.1:80 -r 192.168.200.70:80 -m 【-r:添加真实IP地址为192.168.200.60和192.168.200.70】
【-m:指定使用的轮询机制是NAT的LVS模式】
ipvsadm
[root@localhost opt]# chmod +x nat1.sh
[root@localhost opt]# ./nat1.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.200.60:http Masq 1 0 0
-> 192.168.200.70:http Masq 1 0 0
4.6 Window10客户端访问测试
五、LVS-DR群集+keepalive部署
5.1 集群规划
- LVS-DR负载调度器(主):192.168.131.9
- LVS-DR负载调度器(备):192.168.131.10
- Web 节点服务器1:192.168.131.11
- Web 节点服务器2:192.168.131.12
- 客户端(Windows):192.168.131.13
- vip:192.168.131.100
5.2 部署Web节点服务器
- 将两个节点服务器的网关和DNS注释后重启网卡(如果有网关服务器则指向网关服务器)
- 配置虚拟IP地址(VIP:192.168.131.100)
- 此地址仅用做发送Web响应数据包的源地址,并不需要监听客户机的访问请求(由调调度器监听并分发),因此使用虚接口lo:0来承载VIP地址,并未本机添加一条路由记录,将访问VIP的数据限制在本地,以避免通信紊乱
【Web2与此相同】
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
#GATEWAY=192.168.131.2
#DNS1=192.168.131.2
[root@localhost ~]# systemctl restart network
[root@localhost ~]# cp -p /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.131.100
NETMASK=255.255.255.255
[root@localhost ~]# ifup lo:0 【如果启动ifup lo:0报错的话,直接重启网卡即可】
[root@localhost ~]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.131.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
[root@localhost ~]# route add -host 192.168.131.100 dev lo:0 【禁锢路由】
[root@localhost ~]# route -n 【查看路由】
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.131.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.131.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
【配置启动管理执行路由禁锢】
[root@localhost ~]# vim /etc/rc.local
【直接在配置文件最下面一行添加】
/sbin/route add -host 192.168.131.100 dev lo:0
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
- 调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免发生冲突
【直接在配置文件最下面行添加】
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1 【系统只相应目的IP为本地IP的ARP请求】
net.ipv4.conf.lo.arp_announce = 2 【系统不使用IP包的源地址来设置ARP请求的源地址,而是选择发送接口的IP地址】
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@localhost ~]# 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
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# echo "this is web1" > /var/www/html/index.html 【Web1】
[root@localhost ~]# echo "this is web2" > /var/www/html/index.html 【Web2】
5.3 LVS调度服务器配置(主和备)
- 关防火墙以及安装ipvsadm并加载模块
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install ipvsadm.x86_64
[root@localhost ~]# modprobe ip_vs 【加载ip_vs模块】
[root@localhost ~]# cat /proc/net/ip_vs 【查看ip_vs版本信息】
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
- 配置虚拟IP地址(VIP:192.168.131.100)
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# ls
ifcfg-ens33 ifdown-post ifup-eth ifup-sit
ifcfg-ens33:0 ifdown-ppp ifup-ib ifup-Team
ifcfg-lo ifdown-routes ifup-ippp ifup-TeamPort
ifdown ifdown-sit ifup-ipv6 ifup-tunnel
ifdown-bnep ifdown-Team ifup-isdn ifup-wireless
ifdown-eth ifdown-TeamPort ifup-plip init.ipv6-global
ifdown-ib ifdown-tunnel ifup-plusb network-functions
ifdown-ippp ifup ifup-post network-functions-ipv6
ifdown-ipv6 ifup-aliases ifup-ppp
ifdown-isdn ifup-bnep ifup-routes
【直接将配置文件里内容全删除后进行重新添加】
[root@localhost network-scripts]# vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.131.100
NETMASK=255.255.255.255
【报错直接重启网卡即可】
[root@localhost network-scripts]# ifup ens33:0
ERROR : [/etc/sysconfig/network-scripts/ifup-eth] Error, some other host (00:0C:29:14:03:40) already uses address 192.168.131.100.
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.131.100 netmask 255.255.255.255 broadcast 192.168.131.100
ether 00:0c:29:e3:f1:cd txqueuelen 1000 (Ethernet)
- 调整proc相应参数
- 由于LVS负载调度器和各节点需要公用VIP地址,所以应关闭Linux内核的重定向参数响应,不充当路由器(转发、重定向)
[root@localhost network-scripts]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost /]# sysctl -p 【 -p:从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载】
- 配置负载分配策略
[root@localhost /]# ipvsadm-save > /etc/sysconfig/ipvsadm
或者
[root@localhost /]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@localhost /]# systemctl start ipvsadm.service
[root@localhost /]# vim /opt/dr1.sh
#/bin/bash
ipvsadm -C 【清除所有策略】
ipvsadm -A -t 192.168.131.100:80 -s rr
ipvsadm -a -t 192.168.131.100:80 -r 192.168.131.11:80 -g 【若为隧道模式则把-g替换成-i】
ipvsadm -a -t 192.168.131.100:80 -r 192.168.131.12:80 -g
ipvsadm 【查看节点状态 (Route代表DR模式)】
[root@localhost /]# chmod +x /opt/dr1.sh
[root@localhost /]# ./opt/dr1.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.131.11:http Route 1 0 0
-> 192.168.131.12:http Route 1 0 0
5.4 配置keeplived(主、备LVS-DR服务器上都要设置)
[root@localhost /]# yum -y install keepalived.x86_64
[root@localhost /]# modprobe ip_vs
[root@localhost /]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP C0A88364:0050 rr
-> C0A8830C:0050 Route 1 0 0
-> C0A8830B:0050 Route 1 0 0
【直接将配置文件里删除进行重新添加】
[root@localhost /]# vim /etc/keepalived/keepalived.conf
global_defs { 【定义全局参数】
router_id lvs_10 【指定服务器(路由器)的名称,主备服务器名称须不同,这里主为LVS_10,备为LVS_20】
}
vrrp_instance vi_1 { 【定义VRRP热备实例参数】
state MASTER 【指定热备状态,主为MASTER,备为BACKUP】
interface ens33 【指定承载vip地址的物理接口】
virtual_router_id 51 【指定虚拟路由器的ID号,每个热备组保持一致】
priority 110 【指定优先级,数值越大优先级越高,这里设置主为110,备为100】
advert_int 1 【通告间隔秒数(心跳频率)】
authentication { 【定义认证信息,每个热备组保持一致】
auth_type PASS 【认证类型】
auth_pass 5514 【指定验证密码,主备服务器保持一致】
}
virtual_ipaddress { 【指定群集vip地址】
192.168.131.100
}
}
virtual_server 192.168.131.100 80 { 【指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数】
lb_algo rr 【指定调度算法,轮询(rr)】
lb_kind DR 【指定群集工作模式,直接路由(DR)】
persistence_timeout 6 【连接保持时间(秒)】
protocol TCP 【应用服务采用的是 TCP协议】
real_server 192.168.226.130 80 { 【指定第一个(Web1)节点的地址、端口,备LVS则指定Web2的地址与端口】
weight 1 【节点的权重】
TCP_CHECK { 【健康检查方式】
connect_port 80 【添加检查的目标端口】
connect_timeout 3 【添加连接超时(秒)】
nb_get_retry 3 【添加重试次数】
delay_before_retry 3 【添加重试间隔】
}
}
real_server 192.168.131.11 80 { 【添加第二个 Web节点的地址、端口】
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@localhost /]# systemctl start keepalived.service
5.5 在客户端进行访问测试并查看LVS连接与调度情况
- 查看连接与调度情况