Lvs-负载均衡配置 NAT与DR模式
Lvs-负载均衡配置 NAT模式
1.LVS负载均衡群集
群集的含义
Cluster,集群、群集
由多台主机构成,但对外只表现为一个整体
1.1 群集的三种类型
负载均衡群集、高可用群集和高性能运算群集。
1.1.1 负载均衡群集
提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能
LB的负载分配依赖于主节点的分流算法
1.1.2 高可用群集
提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果
HA的工作方式包括双工和主从两种模式
1.1.3 高性能运算群集
提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力
高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力
1.2 负载均衡群集工作模式
负载均衡群集是目前企业用得最多的群集类型
群集的负载调度技术有三种工作模式
(NAT)地址转换
(TUN)IP隧道
(DR)直接路由
1.2.1 NAT模式——地址转换
Network Address Translation,简称NAT模式;
类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口;
服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式。
1.2.2 TUN模式——IP隧道
IP Tunnel,简称TUN模式;
采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器;
服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。
1.2.3 DR模式——直接路由
Direct Routing,简称DR模式
采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络
负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道
1.3 关于LVS虚拟服务器
Linux Virtual Server 是针对 Linux 内核开发的一个负载均衡项目,由我国的章文嵩 博士在 1998 年 5 月创建,官方站点位于 http://www.linuxvirtualserver.org/。LVS 实际 上相当于基于 IP 地址的虚拟化应用,为基于 IP 地址和内容请求分发的负载均衡提出了一种 高效的解决方法。
LVS 现在已成为 Linux 内核的一部分,默认编译为 ip_vs 模块,必要时能够自动调用。 在 CentOS 7 系统中,以下操作可以手动加载 ip_vs 模块,并查看当前系统中 ip_vs 模块的 版本信息。
LVS 的负载调度算法
针对不同的网络服务和配置需要,LVS 调度器提供多种不同的负载调度算法,其中最常用的四种算法是轮询、加权轮询、最少连接和加权最少连接。
1.3.1 轮询(Round Robin):
将收到的访问请求按照顺序轮流分配给群集中的各节点,均 等地对待每台服务器,而不管服务器实际的连接数和系统负载。
1.3.2 加权轮询(Weighted Round Robin):
根据调度器设置的权重值来分发请求,权重 值高的节点优先获得任务并且分配的请求越多,这样可以保证性能高的节点承担更 多请求。
1.3.3 最少连接(Least Connections):
根据真实服务器已建立的连接数进行分配,将收 到的访问请求优先分配给连接数最少的节点。如果所有的服务器节点性能相近,采 用这种方式可以更好地均衡负载。
1.3.4 加权最少连接(Weighted Least Connections):
在服务器节点的性能差异较大的 情况下,调度器可以根据节点服务器负载自动调整权重,权重较高的节点将承担更 大比例的活动连接负载。
1.4.使用 ipvsadm 管理工具
ipvsadm 是在负载调度器上使用的 LVS 群集管理工具,通过调用 ip_vs模块来添加、删除服务器节点 ,以及查看群集的运行状态在CentOS7系统中,需 要 手动 安装 ipvsadm.x86_64 0:1.27-7.el7 软件包。
[root@localhost ~]# yum -y install ipvsadm
[root@localhost ~]# ipvsadm -v
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
LVS 群集的管理工作主要包括创建虚拟服务器、添加服务器节点、查看群集节点状态、 删除服务器节点和保存负载分配策略。
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”选项组合使用。ipvsadm -ln
2 NAT模式配置
2.1实验框架
2.2 NFS文件共享服务器配置
1.准备工作
##关闭防火墙,并设置开机不自启
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
2.建立文件共享目录,并赋予权限
[root@localhost ~]# mkdir /data
[root@localhost ~]# mkdir /data/html1
[root@localhost ~]# mkdir /data/html2
[root@localhost ~]# chmod -R 777 /data
3.配置共享文件权限
[root@localhost data]# vim /etc/exports
[root@localhost data]# cat /etc/exports
/data/html1 192.168.80.0/24(rw,sync,no_root_squash)
/data/html2 192.168.80.0/24(rw,sync,no_root_squash)
4.加入共享文档,并启动NFS与rpc服务
[root@localhost data]# echo "This is first web server" > /data/html1/index.html
[root@localhost data]# echo "This is second web server" > /data/html2/index.html
[root@localhost data]# systemctl restart rpcbind nfs-server
[root@localhost data]# systemctl enable rpcbind nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
5.查看本机共享文件。
[root@localhost data]# showmount -e
Export list for localhost.localdomain:
/data/html2 192.168.80.0/24
/data/html1 192.168.80.0/24
6.网关修改为192.168.80.25(负载均衡器的内网网卡地址)
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep GATEWAY
GATEWAY=192.168.80.25
2.3 网页服务器1配置
1.准备工作
#关闭防火墙和安装网页服务
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y
2.启动rpcbind和nfs服务
[root@localhost ~]# systemctl restart rpcbind nfs-server
[root@localhost ~]# showmount -e 192.168.80.30
Export list for 192.168.80.30:
/data/html2 192.168.80.0/24
/data/html1 192.168.80.0/24
3.挂载网页
[root@localhost html]# mount 192.168.80.30:/data/html1 /var/www/html/
4.启动网页服务,查看网页是否正常工作。
[root@localhost html]# systemctl restart httpd
5.网关修改为192.168.80.25(负载均衡器的内网网卡地址)
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost html]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep GATEWAY
GATEWAY=192.168.80.25
[root@localhost html]# systemctl restart network
2.4 网页服务器2配置
与网页服务器1配置相同,修改对应参数即可。最终效果如下:
LVS负载均衡器配置(内网关ens33:192.168.80.30,外网关 ens37:12.0.0.254)
1.准备工作
[root@localhost network-scripts]# systemctl stop firewalld.service
[root@localhost network-scripts]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost network-scripts]# setenforce 0
2.配置SNAT转发规则
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# cat /etc/sysctl.conf
…………………………
net.ipv4.ip_forward = 1
#清空原有nat表与filter表的规则,并新加规则
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens37 -j SNAT --to-source 12.0.0.254
3.加载LVS内核模块
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
#下面是加载的内核模块
ip_vs_dh
ip_vs_ftp
ip_vs
ip_vs_lblc
ip_vs_lblcr
ip_vs_lc
ip_vs_nq
ip_vs_pe_sip
ip_vs_rr
ip_vs_sed
ip_vs_sh
ip_vs_wlc
ip_vs_wrr
4.安装ipvsadm 管理工具并启动
[root@localhost ~]# yum install ipvsadm -y
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm.service
5.配置负载分配策略
[root@localhost ~]# ipvsadm -C #清除原有策略
[root@localhost ~]# ipvsadm -A -t 12.0.0.254:80 -s rr -p 10
[root@localhost ~]# ipvsadm -a -t 12.0.0.254:80 -r 192.168.80.35:80 -m
[root@localhost ~]# ipvsadm -a -t 12.0.0.254:80 -r 192.168.80.40:80 -m
[root@localhost ~]# ipvsadm #启动策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 12.0.0.254:http rr persistent 10
-> 192.168.80.35:http Masq 1 0 0
-> 192.168.80.40:http Masq 1 0 0
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm #保存策略
测试:
使用客户机,访问地址12.0.0.254
使用ipvsadm -Ln可以查看当前配置的虚拟服务和各个RS的权重
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 12.0.0.254:80 rr persistent 10
-> 192.168.80.35:80 Masq 1 1 2
-> 192.168.80.40:80 Masq 1 1 5
3 DR模式配置
3.1 实验框架图:
3.2 NFS服务器配置:
1.准备工作
关闭防火墙,并设置开机不自启
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
2.建立文件共享目录,并赋予权限
[root@localhost ~]# mkdir /data
[root@localhost ~]# mkdir /data/html1
[root@localhost ~]# mkdir /data/html2
[root@localhost ~]# chmod -R 777 /data
3.配置共享文件权限
[root@localhost data]# vim /etc/exports
[root@localhost data]# cat /etc/exports
/data/html1 192.168.80.0/24(rw,sync,no_root_squash)
/data/html2 192.168.80.0/24(rw,sync,no_root_squash)
``
4.加入共享文档,并启动NFS与rpc服务
[root@localhost data]# echo "This is first web server" > /data/html1/index.html
[root@localhost data]# echo "This is second web server" > /data/html2/index.html
[root@localhost data]# systemctl restart rpcbind nfs-server
[root@localhost data]# systemctl enable rpcbind nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
5.查看本机共享文件。
[root@localhost data]# showmount -e
Export list for localhost.localdomain:
/data/html2 192.168.80.0/24
/data/html1 192.168.80.0/24
3.3 网页服务器1配置:
1.准备工作
#关闭防火墙和安装网页服务
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y
2.启动rpcbind和nfs服务
[root@localhost ~]# systemctl restart rpcbind nfs-server
[root@localhost ~]# showmount -e 192.168.80.30
Export list for 192.168.80.30:
/data/html2 192.168.80.0/24
/data/html1 192.168.80.0/24
3.挂载网页
[root@localhost html]# mount 192.168.80.30:/data/html1 /var/www/html/
4.启动网页服务,查看网页是否正常工作。
[root@localhost html]# systemctl restart httpd
![图片.png](https://ucc.alicdn.com/pic/developer-ecology/f959dc549032487e843615df12c76a3d.png)
5.配置虚拟IP地址(VIP:192.168.80.100)
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
[root@localhost network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.80.100
NETMASK=255.255.255.255
ONBOOT=yes
启动虚拟网卡
[root@localhost network-scripts]# ifup lo:0
[root@localhost network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.80.100 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
添加路由表信息
[root@localhost network-scripts]# route add -host 192.168.80.100 dev lo:0
将该路由信息每次开机自动添加
[root@localhost network-scripts]# vim /etc/rc.local
[root@localhost network-scripts]# cat /etc/rc.local
!/bin/bash
THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
It is highly advisable to create own systemd services or udev rules
to run scripts during boot instead of using this file.
In contrast to previous versions due to parallel execution during boot
this script will NOT be run after all other services.
Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
that this script will be executed during boot.
touch /var/lock/subsys/local
/sbin/route add -host 192.168.80.100 dev lo:0
[root@localhost network-scripts]# chmod +x /etc/rc.d/rc.local
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
[root@localhost network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.80.100
NETMASK=255.255.255.255
ONBOOT=yes
启动虚拟网卡
[root@localhost network-scripts]# ifup lo:0
[root@localhost network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.80.100 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
#添加路由表信息
[root@localhost network-scripts]# route add -host 192.168.80.100 dev lo:0
#将该路由信息每次开机自动添加
[root@localhost network-scripts]# vim /etc/rc.local
[root@localhost network-scripts]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
/sbin/route add -host 192.168.80.100 dev lo:0
[root@localhost network-scripts]# chmod +x /etc/rc.d/rc.local
[root@localhost network-scripts]# vim /etc/sysctl.conf
[root@localhost network-scripts]# cat /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
……………………………………
[root@localhost network-scripts]# 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
3.4 网页服务器2配置:
与网页服务器1配置相同,修改对应IP和路径参数即可。提供的网页服务如下
![图片.png](https://ucc.alicdn.com/pic/developer-ecology/9621a4db19d44dd9b1012d8afd6e4483.png)
3.5 负载均衡器配置:
1.准备工作
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[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 ~]# yum install ipvsadm -y
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm.service
2.配置虚拟IP地址
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:0
[root@localhost network-scripts]# cat ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.80.100
NETMASK=255.255.255.255
[root@localhost network-scripts]# ifup ens33:0
[root@localhost network-scripts]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.80.100 netmask 255.255.255.255 broadcast 192.168.80.100
ether 00:0c:29:be:a5:a6 txqueuelen 1000 (Ethernet)
3.跳转proc响应参数
[root@localhost network-scripts]# vim /etc/sysctl.conf
[root@localhost network-scripts]# cat /etc/sysctl.conf
sysctl settings are defined through files in
/usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
Vendors settings live in /usr/lib/sysctl.d/.
To override a whole file, create a new file with the same in
/etc/sysctl.d/ and put new settings there. To override
only specific settings, add a file with a lexically later
name in /etc/sysctl.d/ and put new settings there.
For more information, see sysctl.conf(5) and sysctl.d(5).
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 network-scripts]# sysctl -p
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
4.配置负载均衡策略
[root@localhost network-scripts]# ipvsadm -C
[root@localhost network-scripts]# ipvsadm -A -t 192.168.80.100:80 -s rr
[root@localhost network-scripts]# ipvsadm -A -t 192.168.80.100:80 -r 192.168.80.35:80 -g
Illegal 'real-server' option with the 'add-service' command
[root@localhost network-scripts]# ipvsadm -a -t 192.168.80.100:80 -r 192.168.80.35:80 -g
[root@localhost network-scripts]# ipvsadm -a -t 192.168.80.100:80 -r 192.168.80.40:80 -g
[root@localhost network-scripts]# ipvsadm
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.80.35:http Route 1 0 0
-> 192.168.80.40:http Route 1 0 0
![图片.png](https://ucc.alicdn.com/pic/developer-ecology/aeb41f46b69b4072bf12738b2fd84bb1.png)
查看测试连接:
root@localhost network-scripts]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.80.100:80 rr
-> 192.168.80.35:80 Route 1 0 1
-> 192.168.80.40:80 Route 1 1 1
3.6 DR模式中的ARP问题
3.6.1 问题一
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址,在局域网中具有相同的IP地址。势必会造成各服务器ARP通信的紊乱
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播
解决方法:
对节点服务器进行处理,使其不响应针对VIP的ARP请求
使用虚接口lo:0承载VIP地址
设置内核参数arp_ ignore=1: 系统只响应目的IP为本地IP的ARP请求
3.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失效
解决方法: