目录
[1)NAT 地址转换](#1)NAT 地址转换)
[2)TUN IP隧道 IP Tunnel](#2)TUN IP隧道 IP Tunnel)
[3)DR 直接路由 Direct Rounting](#3)DR 直接路由 Direct Rounting)
[四、DR模式 LVS负载均衡群集](#四、DR模式 LVS负载均衡群集)
[(2)DR 模式的特点:](#(2)DR 模式的特点:)
[五、 实验](#五、 实验)
一、LVS负载均衡的三种工作模式
1)NAT 地址转换
调度器会作为所有节点服务器的默认网关,也是客户端的访问入口和节点服务器返回响应消息的出口,所以调度器会承载双向流量的负载压力,可能会成为整个群集的性能瓶颈。
由于节点服务器都会处于内网环境并使用私网IP,所以NAT模式具有一定的安全性。
2)TUN IP隧道 IP Tunnel
调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。
由于节点服务器需要部署在互联网环境中,所以需要有独立的公网IP。
调度器与节点服务器是通过专用的IP隧道相互通信。
因此IP隧道模式的成本较高、网络安全性较低密,且数据在IP隧道传输的过程中需要额外的封装和解封装过程,性能也会受到一定的影响。
3)DR 直接路由 Direct Rounting
调度器也是仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。(与NAT模式的区别)
节点服务器与调度器是部署在同一个物理网络中,因此不需要专用的IP隧道。(与IP隧道模式的区别)
DR模式是企业首选的LVS模式。
二、LVS调度算法
rr(轮询) wrr(加权轮询) lc(最小连接) sh(源地址哈希) dh(目的地址哈希)
wlc(加权最小连接) :优先分配请求给 <连接数>/<权重> 的值最小的节点服务器
lblc(基于地址的最小连接) :如果服务器末超载且可用,则针对相同的目的地址的流量被发送到同一后端服务器;否则,流量被发送到连接数较少的服务器
sed(最短预期延迟)
nq(永不排队)
三、LVS-DR模式部署:
- 部署NFS共享存储
- 部署Web服务器,注意:配置lo:0虚接口承载VIP;修改内核参数 arp_ignore=1、arp_announce=2防止网关ARP紊乱问题;添加路由 route add -host <VIP> dev lo:0
- 部署调度器,注意:配置ensXX:0虚接口承载VIP;修改内核参数ip_forward=0、send_redirects=0关闭IP转发和重定向功能;安装ipvsadm工具,添加虚拟服务器和真实服务器的配置,使用-g选项选择LVS-DR模式
- 客户端访问VIP进行测试,注意:如何客户端跨网段,则调度器和节点服务器的默认网关要指向网关路由器的地址
四、DR模式 LVS负载均衡群集
(1)数据包流向分析:
- 客户端发送请求到 Director Server(负载均衡器 ,又称调度器),请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP)到达内核空间。
- Director Server(调度器) 和 Real Server(节点服务器) 在同一个网络中,数据通过二层数据链路层来传输。
- 内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server (调度器)的 MAC地址,修改目标 MAC 地址为 Real Server(节点服务器) 的 MAC 地址,源 IP 地址与目标 IP 地址没有改变,然后将数据包发送给 Real Server。
- 到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文(源 IP 地址为 VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出。
- Real Server 直接将响应报文传送到客户端。
(2)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号机 作为 LVS调度器 192.168.18.10
2号机 3号机 作为 节点服务器 192.168.18.20 192.168.18.30
4号机 作为 NFS共享存储 192.168.18.40
(1)初始化
挂载mnt
[root@l1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 1913544 0 1913544 0% /dev
tmpfs 1930624 0 1930624 0% /dev/shm
tmpfs 1930624 12560 1918064 1% /run
tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
/dev/mapper/centos-root 38770180 5434724 33335456 15% /
/dev/sda1 1038336 191104 847232 19% /boot
tmpfs 386128 12 386116 1% /run/user/42
tmpfs 386128 0 386128 0% /run/user/0
[root@l1 ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@l1 ~]#
关闭防火墙
[root@l1 ~]# systemctl disable --now firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@l1 ~]# setenforce 0
[root@l1 ~]# vim /etc/selinux/config
[root@l1 ~]#
关闭同步
(2)配置NFS共享存储(4号机)
[root@localhost ~]# yum install -y nfs-utils rpcbind
[root@localhost ~]# mkdir /share/{xy101,xy102} -p
//创建共享目录 添加节点,分别是xy101和xy102两个目录
[root@localhost ~]# ls /share/
xy101 xy102
[root@localhost ~]# echo '<h1>this is xy101 test web page!</h1>' > /share/xy101/test.html
[root@localhost ~]# echo '<h1>this is xy102 test web page!</h1>' > /share/xy102/test.html
[root@localhost ~]# vim /etc/exports
/share/xy101 192.168.18.0/24(ro)
/share/xy102 192.168.18.0/24(ro)
[root@localhost ~]# systemctl enable --now rpcbind nfs //启动rpcbind 和 nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@localhost ~]# showmount -e //检查一下有没有问题
Export list for localhost.localdomain:
/share/xy102 192.168.18.0/24
/share/xy101 192.168.18.0/24
[root@localhost ~]#
(3)配置节点服务器(2.3号机)
[root@l2 ~]# systemctl start rpcbind //两台机都得启动远程调用
[root@l2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@l2 ~]#
[root@l2 ~]# showmount -e 192.168.18.40
Export list for 192.168.18.40:
/share/xy102 192.168.18.0/24
/share/xy101 192.168.18.0/24
[root@l2 ~]#
[root@l2 ~]# cd /etc/yum.repos.d/
[root@l2 yum.repos.d]# ls
local.repo repo.bak
[root@l2 yum.repos.d]#
[root@l2 yum.repos.d]# yum install -y nginx (两台机都)
如果下载不了,传输进去 (两台机都)
[root@l2 yum.repos.d]# yum install -y nginx
也可以直接尝试下载安装包,我这里就不使用了
安装好了后 (二号机)
[root@l2 yum.repos.d]# systemctl start nginx //启动nginx
[root@l2 yum.repos.d]# mount 192.168.18.40:/share/xy101 /usr/share/nginx/html //挂载
[root@l2 yum.repos.d]# ls !$
ls /usr/share/nginx/html
test.html
[root@l2 yum.repos.d]# cd /etc/sysconfig/network-scripts/
[root@l2 network-scripts]# ls
ifcfg-ens33 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
ifdown-post ifup-eth ifup-sit
[root@l2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@l2 network-scripts]# vim ifcfg-lo:0
[root@l2 network-scripts]#
DEVICE=lo:0
IPADDR=192.168.18.100
NETMASK=255.255.255.255
ONBOOT=yes
[root@l2 network-scripts]# systemctl restart network //重启网卡
[root@l2 network-scripts]# systemctl restart nginx //重启nginx
[root@l2 network-scripts]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@l2 network-scripts]#
[root@l2 network-scripts]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore =1
net.ipv4.conf.all.arp_ignore =1
net.ipv4.conf.lo.arp_announce =2
net.ipv4.conf.all.arp_announce =2
[root@l2 network-scripts]# sysctl -p //加载一下
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@l2 network-scripts]#
[root@l2 network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.18.2 0.0.0.0 UG 100 0 0 ens33
192.168.18.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
[root@l2 network-scripts]#
[root@l2 network-scripts]# route add -host 192.168.18.100 lo:0 //添加路由
三号机
[root@l3 yum.repos.d]# cd /etc/sysconfig/network-scripts/
[root@l3 network-scripts]# ls
ifcfg-ens33 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
ifdown-post ifup-eth ifup-sit
[root@l3 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@l3 network-scripts]# vim !$
DEVICE=lo:0
IPADDR=192.168.18.100
NETMASK=255.255.255.255
ONBOOT=yes
[root@l3 network-scripts]# systemctl restart network nginx
[root@l3 network-scripts]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@l3 network-scripts]#
[root@l3 network-scripts]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@l3 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@l3 network-scripts]# route add -host 192.168.18.100 dev lo:0
[root@l3 network-scripts]#
[root@l3 network-scripts]# mount 192.168.18.40:/share/xy102 /usr/share/nginx/html
[root@l3 network-scripts]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 1913544 0 1913544 0% /dev
tmpfs 1930624 0 1930624 0% /dev/shm
tmpfs 1930624 12568 1918056 1% /run
tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
/dev/mapper/centos-root 38770180 5441936 33328244 15% /
/dev/sda1 1038336 191104 847232 19% /boot
tmpfs 386128 12 386116 1% /run/user/42
tmpfs 386128 0 386128 0% /run/user/0
/dev/sr0 4635056 4635056 0 100% /mnt
192.168.18.40:/share/xy102 38770688 4584960 34185728 12% /usr/share/nginx/html
[root@l3 network-scripts]#
[root@l3 network-scripts]# ls /usr/share/nginx/html
test.html
[root@l3 network-scripts]#
(4)调度器配置(一号机)
[root@l1 ~]# yum install -y ipvsadm
[root@l1 ~]# touch /etc/sysconfig/ipvsadm
[root@l1 ~]# systemctl start ipvsadm
[root@l1 ~]# systemctl status ipvsadm
[root@l1 ~]# systemctl enable ipvsadm
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
[root@l1 ~]#
[root@l1 ~]# modprobe ip_vs //添加ip_vs模块
[root@l1 ~]# lsmod //检查
[root@l1 ~]# 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@l1 ~]#
[root@l1 ~]# ls
anaconda-ks.cfg 公共 视频 文档 音乐
initial-setup-ks.cfg 模板 图片 下载 桌面
[root@l1 ~]# ifconfig
[root@l1 ~]# cd /etc/sysconfig/network-scripts/
[root@l1 network-scripts]# ls
ifcfg-ens33 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
ifdown-post ifup-eth ifup-sit
[root@l1 network-scripts]# cp ifcfg-lo ifcfg-ens33:0
[root@l1 network-scripts]# vim !$
vim ifcfg-ens33:0
DEVICE=ens33:0
IPADDR=192.168.18.100
NETMASK=255.255.255.255
ONBOOT=yes
[root@l1 network-scripts]# systemctl restart network
[root@l1 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@l1 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
[root@l1 network-scripts]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@l1 network-scripts]#
[root@l1 network-scripts]# ipvsadm -C //清空规则
[root@l1 network-scripts]# ipvsadm -A -t 192.168.18.100:80 -s rr //添加规则指定调度算法
[root@l1 network-scripts]# ipvsadm -a -t 192.168.18.100:80 -r 192.168.18.20:80 -g //-r 指定真实服务器
[root@l1 network-scripts]# ipvsadm -a -t 192.168.18.100:80 -r 192.168.18.30:80 -g
[root@l1 network-scripts]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP l1:http rr
-> 192.168.18.20:http Route 1 0 0
-> 192.168.18.30:http Route 1 0 0
[root@l1 network-scripts]#
[root@l1 network-scripts]# ipvsadm-save -n > /opt/ipvsadm.bak //保存规则
[root@l1 network-scripts]#
[root@l1 network-scripts]# cat !$
cat /opt/ipvsadm.bak
-A -t 192.168.18.100:80 -s rr
-a -t 192.168.18.100:80 -r 192.168.18.20:80 -g -w 1
-a -t 192.168.18.100:80 -r 192.168.18.30:80 -g -w 1
[root@l1 network-scripts]#
六、试验
为了防止试验结果有误,关闭nginx里面的长连接给关闭 (节点服务器 2.3号机)
[root@l2 network-scripts]# vim /etc/nginx/nginx.conf
[root@l2 network-scripts]# systemctl restart nginx
[root@l2 network-scripts]#
3号机如上
一号机
[root@l1 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.18.100:80 rr
-> 192.168.18.20:80 Route 1 0 0
-> 192.168.18.30:80 Route 1 0 0
[root@l1 network-scripts]#