LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)
Posted TaKe___Easy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)相关的知识,希望对你有一定的参考价值。
LVS+Keeplive
- 一、LVS理论概述
- 二、ipvsadm工具(LVS主要使用的工具)
- 三、Keepalive理论概述
- 四、LVS-NAT部署
- 五、LVS-DR群集+keepalive部署
一、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以上是关于LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)的主要内容,如果未能解决你的问题,请参考以下文章