LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)

LVS+Keeplive

  • 一、LVS理论概述
    • 1.1 群集分类
      • 1.1.1 负载均衡群集(Load Balance Cluster)
      • 1.1.2 高可用群集(High Availability Cluster)
      • 1.1.3 高性能运算群集(High Performance Computer Cluster)
    • 1.2 负载均衡群集架构
    • 1.3 负载均衡群集工作模式
      • 1.3.1 地址转换(NAT模式)
      • 1.3.2 IP隧道(TUN模式)
      • 1.3.3 直接路由(DR模式)
      • 1.3.4 三种工作模式的区别
    • 1.4 LVS-DR数据包流向分析
    • 1.5 LVS-DR特性
    • 1.6 LVS-DR中的ARP问题
      • 1.6.1 问题一
      • 1.6.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.3 ipvsadm工具常用选项
  • 三、Keepalive理论概述
    • 3.1 什么是Keepalive
    • 3.2 Keepalived实现原理
  • 四、LVS-NAT部署
    • 4.1 集群规划
    • 4.2 部署共享存储
    • 4.3 配置两台Web服务器
    • 4.4 配置LVS服务器
    • 4.5 加载LVS调度模块(集成在内核中)
    • 4.6 Window10客户端访问测试
  • 五、LVS-DR群集+keepalive部署
    • 5.1 集群规划
    • 5.2 部署Web节点服务器
    • 5.3 LVS调度服务器配置(主和备)
    • 5.4 配置keeplived(主、备LVS-DR服务器上都要设置)
    • 5.5 在客户端进行访问测试并查看LVS连接与调度情况

一、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群集创建与管理示意图

LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)_第1张图片

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 

LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)_第2张图片

【将原有的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测试
    LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)_第3张图片

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.60192.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-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)_第4张图片

五、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连接与调度情况

LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)_第5张图片

  • 查看连接与调度情况
    LVS-NAT与LVS-DR群集+keepalive部署(含LVS+Keepalived+ipvsadm理论概述)_第6张图片

你可能感兴趣的:(lvs,经验分享,运维)