由于实验室拟态存储的项目需要通过 NAT 模式来映射 NFS 服务器已实现负载均衡的目的, 通过调研了多种负载均衡机制, 笔者最终选择了 LVS 的 NAT 模式来实现需求, 接下来通过博客来记录一下 LVS-NAT 模式的配置流程
1.LVS 服务的简介:
LVS 是 Linux Virtual Server 的简写, 意即 Linux 虚拟服务器, 是一个虚拟的服务器集群系统, 在 1998 年 5 月由章文嵩先生主导开发 LVS 集群实现了 IP 负载均衡技术和基于内容请求分发技术调度器通过将请求均衡地转移到不同的服务器上执行, 且可以屏蔽掉后台故障的服务器, 从而将一组服务器构成一个高性能的高可用的服务器集群, 而这样的结构对客户端来说是完全透明的, 所以无需修改客户端和服务器端的程序
LVS 服务器可以让客户端将 LVS 服务器作为一个连接的单点, 仅仅通过连接 LVS 服务器便可以得到后端一整个服务器集群的处理与存储能力, 这样能够大大提高系统的扩展性与可用性, 同时也能够提供服务的安全性, 单一入侵一台服务器并不会破坏其他与该服务器隔离的服务
LVS 可以支持如下三种模式:
Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换, 调度器重写请求报文的目标地址, 根据预设的调度算法, 将请求分派给后端的真实服务器; 真实服务器的响应报文通过调度器时, 报文的源地址被重写, 再返回给客户, 完成整个负载调度过程
Virtual Server via IP Tunneling(VS/TUN)
采用 NAT 技术时, 由于请求和响应报文都必须经过调度器地址重写, 当客户请求越来越多时, 调度器的处理能力将成为瓶颈为了解决这个问题, 调度器把请求报 文通过 IP 隧道转发至真实服务器, 而真实服务器将响应直接返回给客户, 所以调度器只处理请求报文由于一般网络服务应答比请求报文大许多, 采用 VS/TUN 技术后, 集群系统的最大吞吐量可以提高 10 倍
Virtual Server via Direct Routing(VS/DR)
VS/DR 通过改写请求报文的 MAC 地址, 将请求发送到真实服务器, 而真实服务器将响应直接返回给客户同 VS/TUN 技术一样, VS/DR 技术可极大地 提高集群系统的伸缩性这种方法没有 IP 隧道的开销, 对集群中的真实服务器也没有必须支持 IP 隧道协议的要求, 但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上
鉴于 ip 安全的需求, 这里我们需要分割 LVS 服务器与后端负载集群的 ip 地址, 并且对于负载均衡集群的数目没有太大的需求, 所以笔者选用了 Virtual Server via Network Address Translation(VS/NAT) 模式
2. 系统环境:
如下图所示, 这是 LVS-NAT 模式下的系统结构图:
系统平台: Ubuntu 16.04 LTS
Load Balancer: 双网卡
外网地址: 219.223.199.164
内网地址: 192.168.1.30
Real Server:
一共有五台机器, ip 地址分别为 192.168.1.21~25 这里笔者由于需要挂载 NFS 服务器并且串联 CephFS 集群, 所以本身 Real Server 上已经运行着 NFS 的服务端, 关于 NFS 服务器的搭建可以参考我之前的博文
3.Load Balancer 服务器的配置:
Load Balancer 服务器的配置相对来说较为复杂, 我们按部就班的走下这个流程:
ipvsadm
LVS 依赖于 ipvsadm 来进行配置, 所以我们首先先安装 ipvsadm:
sudo apt-get install ipvsadm
NAT 模式下的 ip 转发
之后我们需要配置 NAT 模式下的 ip 转发, 让通过 Load Balancer 的 ip 包能够转发到真正提供服务的 Real Server 之上进行处理:
- echo 1>> /proc/sys/net/ipv4/ip_forward // 在 ipv4 环境下可以进行 ip 转发
- sudo iptables -t nat -F // 清除之前的 iptable 的规则
- sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens160 -j MASQUERADE
- // 这里的网卡需要选择外网 ip, 也就是 219.223.199.164 对应的 ip 地址
LVS-NAT 模式的配置
这里我们采取全盘转发的机制, 也就是不指定端口的方式, 这种用法可能相对比较少见, 但由于 NFS 服务依赖与 rpcbind 选择端口, 所以提供的端口是随机的, 为了简单起见, 我们采取全盘转发的模式
- sudo ipvsadm -A -t 219.223.199.164 -s wrr -p 30 // 转发对应的 ip, 并且采取权重轮询的策略
- sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.21 -m -w 1
- sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.22 -m -w 1
- sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.23 -m -w 1
- sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.24 -m -w 1
- sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.25 -m -w 1// 依次添加对应的 Real Server 服务器
下图是通过 ipvsadm 配置好的转发机制:
4.Real Server 服务器的配置:
Real Server 这里需要配置路由, 将默认的网关改为 Load Balancer 服务器的内网 ip 地址, 来实现路由转发的效果 (笔者这里多提一句: 这里如果采用双网卡机制很容易出现, TCP 连接问题, 也就是 syn 消息收不到 ack 响应, 所以尽量将无关的网卡警用, 以免路由配置的复杂)
route 命令的配置:
sudo route add -net 0.0.0.0 gw 192.168.1.30
这个命令需要在每台 Real Server 之上执行, 否则其他 Real Server 没有办法接受到转发的 ip 数据包, 会被 Load Balance 屏蔽, 从而没有办法实现我们期待的负载均衡的结果下图所示的是 Real Server 服务器路由转发配置的结果:
5.LVS-NAT 模式的测试:
由于实现了 LVS 全盘的 ip 地址转发, 所以任何基于 TCP 的网络服务都可以通过 Load Balancer 转发给后端的 Real Server 来提供对外的服务, 由于笔者主要是测试 NFS 服务的, 所以我们先在 Real Server 之上启动对应的 NFS 服务:
为了使 NFS 服务器能正常工作, 需要启动 rpcbind 和 nfs-kernel-server 两个服务, 并且 rpcbind 一定要先于 nfs-kernel-server 启动
- sudo service rpcbind start
- sudo service nfs-kernel-server start
之后我们便可以执行 NFS 客户端的挂载工作了, 过载工作很简单, 先建立一个挂载目录, 然后通过 mount 命令挂载 Load Balancer 的外网 ip:
- sudo mkdir /mnt/ceph
- sudo mount -t nfs 219.223.199.164:/mnt/cephfs /mnt/ceph
之后客户端对应的文件目录便挂载上对应 Real Server 上的文件系统了 (这里的 NFS 服务是笔者预先搭建好的, 读者可以自行搭建自己所需的网络服务)
如下图所示, 我们挂载了远端 219.223.199.164 的 NFS 服务器, 而实际的服务是由后端的 Real Server 来提供的:
小结: 梳理了一下在 LVS-NAT 模式之下的安装与配置 RedHat 系列的发行版也是大同小异这里调试一定需要有足够的耐心和毅力, 需要去细致的排查, 否则很容易出现问题若有疏漏, 望各位指点斧正
来源: https://www.cnblogs.com/happenlee/p/8570197.html