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理论概述

  • 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地址优点缺点
NATlow 10-20负载调度器公网+私网安全性高效率低、压力大
TUNHigh 100只有路由器公网安全、速度快需要隧道技术
DRHigh 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理论概述)的主要内容,如果未能解决你的问题,请参考以下文章

LVS-DR+keepalived高可用群集

LVS-DR与 Keepalived群集

LVS-DR与Keepalived高可用群集

Web服务器群集——企业级调度器LVS(LVS-NAT,LVS-DR负载均衡集群配置)

LVS-DR+keepalived高可用群集

构建LVS-DR+keepalived 高可用群集