LVS-NAT模式

目录

  • 一、LVS集群类型中的术语
  • 二、LVS的NAT模式(什么是NAT模式)
  • 三、 ipvsadm 工具选项说明
  • 四、部署LVS-NAT需要的坏境
  • 五、部署NFS服务器(共享)
  • 六、节点服务器
  • 七、调度服务器
  • 八、测试
  • 九、LVS的负载均衡注意点

一、LVS集群类型中的术语

  • VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer(lvs服务器)
  • RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)(真实服务器)
  • CIP:Client IP(客户机IP)
  • VIP:Virtual serve IP VS外网的IP
  • DIP:Director IP VS内网的IP
  • RIP:Real server IP (真实IP)

二、LVS的NAT模式(什么是NAT模式)

lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某处的RS的RIP和

PORT实现转发

(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

(3)支持端口映射,可修改请求报文的目标PORT

(4)VS必须是Linux系统,RS可以是任意OS系统
LVS-NAT模式_第1张图片

三、 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

四、部署LVS-NAT需要的坏境

负载调度器:配置双网卡 内网:192.168.111.50(ens33)  外网卡:12.0.0.1(ens37)
二台WEB服务器集群池:192.168.111.51、192.168.111.53   
一台NFS共享服务器:192.168.111.54
客户端:

五、部署NFS服务器(共享)

NFS 是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。通过使用 NFS 

协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。对于大多数负载均衡 

群集来说,使用 NFS 协议来共享数据存储是比较常见的做法,NFS 也是 NAS 存储设备必然支 

持的一种协议。

NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制,以完成远程 

到本地的映射过程。在 CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 

共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持
#关闭防火墙及selinux
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0

安装NFS服务
[root@localhost ~]# yum install nfs-utils rpcbind -y
[root@localhost ~]# cd /opt
[root@localhost opt]# mkdir kgc benet

#新建目录,并创建站点文件
[root@localhost opt]# echo "this is kgc! " >kgc/index.html
[root@localhost opt]# echo "this is benet \!" >benet/index.html
#开启服务
[root@localhost opt]# systemctl start rpcbind
[root@localhost opt]# systemctl start nfs
[root@localhost opt]# chmod 777 kgc/ benet/
[root@localhost opt]# vim /etc/exports
#设置共享策略
/opt/kgc  192.168.111.0/24(rw,sync)
/opt/benet  192.168.111.0/24(rw,sync)


[root@localhost opt]# systemctl restart nfs
#发布服务
[root@localhost opt]# exportfs -rv
exporting 192.168.111.0/24:/opt/benet
exporting 192.168.111.0/24:/opt/kgc

六、节点服务器

第一个节点服务器

#关闭防火墙及selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#安装httpd服务
[root@localhost ~]# yum install -y httpd

#在节点服务器上查看NFS共享服务
[root@localhost ~]# showmount -e 192.168.111.54
Export list for 192.168.111.54:
/opt/benet 192.168.111.0/24
/opt/kgc   192.168.111.0/24

#将NFS服务器上的站点文件挂载到/var/www/html/
[root@localhost ~]# mount 192.168.111.54:/opt/kgc /var/www/html/

#查看是否挂载上
[root@localhost ~]# df
192.168.111.54:/opt/kgc 17811456 3826688 13984768   22% /var/www/html
#查看有没有挂载到/var/www/html/
[root@localhost ~]# ls /var/www/html/
index.html

#查看能不能看到NFS共享的文件
[root@localhost ~]# cat /var/www/html/index.html 
this is kgc! 


[root@localhost ~]# systemctl start httpd


#修改网关  作用:指定网关 使服务能回到客户端  所以网关指向调度服务器
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 

GATEWAY=192.168.111.51
#DNS1=8.8.8.8

#然后重启网卡
[root@localhost ~]# systemctl restart network












#永久挂载站点
[root@localhost ~]# vim /etc/fstab 
192.168.111.54:/opt/kgc       /var/www/html     nfs     defaults,_netdev    0 0

[root@localhost ~]# mount -a

第二个节点服务器

#关闭防火墙及selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#安装httpd服务
[root@localhost ~]# yum install -y httpd

#在节点服务器上查看NFS共享服务
[root@localhost ~]# showmount -e 192.168.111.54
Export list for 192.168.111.54:
/opt/benet 192.168.111.0/24
/opt/kgc   192.168.111.0/24

#将NFS服务器上的站点文件挂载到/var/www/html/
[root@localhost ~]# mount 192.168.111.54:/opt/benet /var/www/html/

#查看是否挂载上
[root@localhost ~]# df
192.168.111.54:/opt/benet 17811456 3826688 13984768   22% /var/www/html

#查看有没有挂载到/var/www/html/
[root@localhost ~]# ls /var/www/html/
index.html

#查看能不能看到NFS共享的文件
[root@localhost ~]# cat /var/www/html/index.html 
this is benet \!

[root@localhost ~]# systemctl start httpd

#修改网关  作用:指定网关 使服务能回到客户端  所以网关指向调度服务器
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 

GATEWAY=192.168.111.51
#DNS1=8.8.8.8

#然后重启网卡
[root@localhost ~]# systemctl restart network









#永久挂载站点
[root@localhost ~]# vim /etc/fstab 
192.168.111.54:/opt/benet       /var/www/html    nfs    defaults,_netdev    0 0

[root@localhost ~]# mount -a

七、调度服务器

#关闭防火墙及selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#添加一块网卡
#查看是否添加成功
[root@localhost ~]# ifconfig 
ens33: flags=4163  mtu 1500
        inet 192.168.111.51  netmask 255.255.255.0  broadcast 192.168.111.255
        inet6 fe80::3721:e287:acd2:cd60  prefixlen 64  scopeid 0x20
        ether 00:0c:29:c7:78:85  txqueuelen 1000  (Ethernet)
        RX packets 5844  bytes 433673 (423.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1784  bytes 157614 (153.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens37: flags=4163  mtu 1500
        inet 192.168.111.133  netmask 255.255.255.0  broadcast 192.168.111.255
        inet6 fe80::a09e:1b3f:810f:913e  prefixlen 64  scopeid 0x20
        ether 00:0c:29:c7:78:8f  txqueuelen 1000  (Ethernet)
        RX packets 21  bytes 1880 (1.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23  bytes 4207 (4.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#切换目录
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
#将原来的ens33网卡内容复制给ens37
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens37
#修改ens37网卡 作为外网地址  去掉网关
[root@localhost network-scripts]# vim ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37    这里要改
DEVICE=ens37   这里要改 
ONBOOT=yes
IPADDR=12.0.0.1    这里要改
NETMASK=255.255.255.0
#GATEWAY=192.168.111.2   这里要改
#DNS1=8.8.8.8       这里要改

[root@localhost network-scripts]# systemctl restart network
#再次查看是否修改成功
[root@localhost network-scripts]# ifconfig 

#打开路由转发功能
[root@localhost network-scripts]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1 
#刷新
[root@localhost network-scripts]# sysctl -p
net.ipv4.ip_forward = 1

#防火墙
[root@localhost network-scripts]# iptables -nL -t nat
#查看策略
[root@localhost network-scripts]# iptables -F

#添加策略
[root@localhost network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.111.0/24 -o ens37 -j SNAT --to 12.0.0.1

#查看策略
[root@localhost network-scripts]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.111.0/24     0.0.0.0/0            to:12.0.0.1

#加载内核模块
[root@localhost network-scripts]# modprobe ip_vs
[root@localhost network-scripts]# 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

#安装ipvsadm
[root@localhost network-scripts]# yum install -y ipvsadm* 

#重启服务
[root@localhost network-scripts]# systemctl start ipvsadm.service 
Job for ipvsadm.service failed because the control process exited with error code. See "systemctl status ipvsadm.service" and "journalctl -xe" for details.
报错了 
两种查看报错方法
[root@localhost network-scripts]# journalctl -xe
[root@localhost network-scripts]# vim /var/log/messages
#找到报错后
#保存配置文件
[root@localhost network-scripts]# ipvsadm-save >/etc/sysconfig/ipvsadm
#开启服务
[root@localhost network-scripts]# systemctl start ipvsadm
[root@localhost network-scripts]# systemctl status ipvsadm.service 

#清空策略
[root@localhost network-scripts]# ipvsadm -C

#指定IP地址 外网的入口  -s rr  轮询
[root@localhost network-scripts]# ipvsadm -A -t 12.0.0.1:80 -s rr

#先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式
[root@localhost network-scripts]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.111.50:80 -m
[root@localhost network-scripts]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.111.53:80 -m


#启动
[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.111.50:http          Masq    1      0          0         
  -> 192.168.111.53:http          Masq    1      0          0         


#查看是否添加成功
[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  12.0.0.1:80 rr
  -> 192.168.111.50:80            Masq    1      0          0         
  -> 192.168.111.53:80            Masq    1      0          0         






八、测试

在windows上 ping  192.168.111.51
                 192.168.111.50
                 192.168.111.53
在浏览器上输入12.0.0.1

九、LVS的负载均衡注意点

LVS的负载调度算法有四种最常用的:轮询算法(rr)、加权轮询(wrr)、最少轮询(lc)、加权最少轮询(wlc)

1)创建虚拟服务器(注意:NAT模式要两块网卡,调度器的地址是外网口地址)
群集的VIP地址为192.168.80.33,针对TCP 80端口提供负载分流服务,使用的轮询调度算法。对于负载均衡调度器来说,VIP必须是本机实际已启用的IP地址
ipvsadm -A -t 192.168.20.11:80 -s rr

//选项 "-A"表示添加虚拟服务器,"-t"用来指定VIP地址及TCP端口,"-s"用来指定负载调度算法——rr、wrr、lc、wlc

2)添加服务器节点
ipvsadm -a -t 192.168.20.11:80 -r 192.168.80.33:80 -m
ipvsadm -a -t 192.168.20.11:80 -r 192.168.80.44:80 -m

//选项 "-a"表示添加真实服务器,"-t"用来指定VIP地址及TCP端口,"-r"用来指定RIP地址及TCP端口,"-m"表示使用NAT群集模式("-g"是DR模式,"-i"是TUN模式)
{ -m参数后面还可以跟-w的参数,这里没有做的"-w"用来设置权重(权重为0时表示暂停节点)}

4)删除服务器节点
ipvsadm -d -r 192.168.90.22:80 -t 192.168.80.88:80

//需要从服务器池中删除某一个节点时,使用选项"-d"。执行删除操作必须指定目标对象,包括节点地址、虚拟IP地址。如上所示的操作将会删除LVS群集192.168.80.88中的节点192.168.90.22

若需要删除整个虚拟服务器时,使用选项-D并指定虚拟IP地址即可,无需要指定节点。例如:“ipvsadm -D -t 192.168.80.11:80",则删除此虚拟服务器。

ipvsadm -L	//查看节点状态,加个"-n"将以数字形式显示地址、端口信息
ipvsadm-save  > /etc/sysconfig/ipvsadm	//保存策略

使用导出/导入工具ipvsadm-save/ipvsadm-restore可以保存、恢复LVS策略,方法类似于iptables的规则的导出、导入

你可能感兴趣的:(nginx,linux,运维)