专栏首页山山仙人的专栏LVS负载均衡之NAT模式

LVS负载均衡之NAT模式

1、LVS的NAT模式介绍

参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html

由于IPv4中IP地址空间的日益紧张和安全方面的原因,很多网络使用保留IP地址(10.0.0.0/255.0.0.0、 172.16.0.0/255.128.0.0和192.168.0.0/255.255.0.0)[64, 65, 66]。这些地址不在Internet上使用,而是专门为内部网络预留的。当内部网络中的主机要访问Internet或被Internet访问时,就需要 采用网络地址转换(Network Address Translation, 以下简称NAT),将内部地址转化为Internets上可用的外部地址。NAT的工作原理是报文头(目标地址、源地址和端口等)被正确改写后,客户相信 它们连接一个IP地址,而不同IP地址的服务器组也认为它们是与客户直接相连的。由此,可以用NAT方法将不同IP地址的并行网络服务变成在一个IP地址 上的一个虚拟服务。 VS/NAT的体系结构如图所示。在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器 提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系 统(如NFS)共享,也可以通过一个分布式文件系统来提供。

客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash 表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务 器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。我们在连接上引入一个状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。在TCP连接中,根据标准的TCP有限状态机进行状态迁移,这里我们不一一叙述,请参见W. Richard Stevens的《TCP/IP Illustrated Volume I》;在UDP中,我们只设置一个UDP状态。不同状态的超时值是可以设置的,在缺省情况下,SYN状态的超时为1分钟,ESTABLISHED状态的超 时为15分钟,FIN状态的超时为1分钟;UDP状态的超时为5分钟。当连接终止或超时,调度器将这个连接从连接Hash表中删除。

这样,客户所看到的只是在Virtual IP Address上提供的服务,而服务器集群的结构对用户是透明的。对改写后的报文,应用增量调整Checksum的算法调整TCP Checksum的值,避免了扫描整个报文来计算Checksum的开销。 在一些网络服务中,它们将IP地址或者端口号在报文的数据中传送,若我们只对报文头的IP地址和端口号作转换,这样就会出现不一致性,服务会中断。所以,针对这些服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号。我们所知道有这个问题的网络服务有FTP、IRC、H.323、 CUSeeMe、Real Audio、Real Video、Vxtreme / Vosiac、VDOLive、VIVOActive、True Speech、RSTP、PPTP、StreamWorks、NTT AudioLink、NTT SoftwareVision、Yamaha MIDPlug、iChat Pager、Quake和Diablo。 简单来说,这种模式借助iptablesnat表来实现 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去 rs需要设定网关为分发器的内网ip 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源 缺点:扩展性有限。高负载模式下,director可能成为瓶颈 优点:支持任意操作系统,节点服务器使用私有IP地址,与负载调度器位于同一个物理网络,安全性比DR模式和TUN模式要高。

2、LVS的DR模式部署过程

环境:

lvs   eth0:10.0.0.3     gateway:10.0.0.254    eth1:192.168.1.3  
web01 eth0:192.168.1.7    gateway:192.168.1.3
web02 eth0:192.168.1.8    gateway:192.168.1.3

2.1、配置lvs服务器为路由器

web01web02只有内网卡,配置lvs为路由器使其上网

[root@lvs ~]# vim /etc/sysctl.conf 
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

2.2、web服务器准备

在web服务器上安装httpd服务来进行模拟,每台服务器的web首页不同,在负载均衡测试的时候以便区分 web01

[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service 
[root@web01 ~]# systemctl enable httpd.service 
[root@web01 ~]# echo 'web01'> /var/www/html/index.html
[root@web01 ~]# curl 127.0.0.1
web01

web02

[root@web02 ~]# yum install -y httpd
[root@web02 ~]# systemctl start httpd.service 
[root@web02 ~]# systemctl enable httpd.service 
[root@web02 ~]# echo 'web02'> /var/www/html/index.html
[root@web02 ~]# curl 127.0.0.1
web02

2.3、lvs服务器配置

[root@lvs ~]# yum install -y ipvsadm    #安装lvs核心管理软件包
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 10.0.0.3:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.0.0.3:80 -r 192.168.1.7 -m
[root@lvs ~]# ipvsadm -a -t 10.0.0.3:80 -r 192.168.1.8 -m

参数说明: -C --clear清除内核虚拟服务器表中的所有记录 -A --add-service在内核的虚拟服务器表中添加一条新的虚拟服务器记录 -t --tcp-service service-address说明虚拟服务器提供的是tcp 的服务 -s --scheduler scheduler使用的调度算法,调度算法可以指定以下8种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队) -a --add-server在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 -r --real-server server-address指定真实的服务器[Real-Server:port] -m --masquerading指定LVS的工作模式为NAT 模式

调度测试

[root@lvs ~]# curl 10.0.0.3
web01
[root@lvs ~]# curl 10.0.0.3
web02
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 rr
  -> 192.168.1.7:80               Masq    1      0          0         
  -> 192.168.1.8:80               Masq    1      0          1

-L --list显示内核虚拟服务器表 -n 不解析端口使用的协议

2.4、keepalived结合lvs_NAT模式

配置keepalived增加虚拟ip,从而管理到lvs,可以进一步配置为lvs服务器的高可用

[root@lvs ~]# yum install keepalived -y
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL    #表示keepalived服务器的一个标识
}

vrrp_instance VI_1 {      #定义一个vrrp组,组名唯一
    state MASTER        #定义改主机为keepalived的master主机
    interface eth0      #监控eth0号端口
    virtual_router_id 51    #虚拟路由id号为51,id号唯一,这个id决定了多播的MAC地址
    priority 100        #节点优先级
    advert_int 1        #检查间隔,默认为1秒
    authentication {
        auth_type PASS    #认证方式,密码认证
        auth_pass 1111    #认证密码
    }
    virtual_ipaddress {
        10.0.0.4        #虚拟ip地址
    }
}

virtual_server 10.0.0.4 80 {  #虚拟主机设置
    delay_loop 6        #每隔6秒查询realserver状态
    lb_algo rr        #lvs的调度算法
    lb_kind NAT       #lvs的集群模式
    persistence_timeout 50  #同一IP的连接50秒内被分配到同一台realserver
    protocol TCP        #用TCP协议检查realserver状态

    real_server 192.168.1.7 80 {  #后端真实主机ip
        weight 1          #每台机器的权重,0表示不给该机器转发请求,直到它恢复正常
        TCP_CHECK {       #以下为健康检查项目
            connect_timeout 3   #连接超时时间,单位为秒
            nb_get_retry 3      #检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除
            delay_before_retry 3  #失败重试的间隔时间,单位为秒
            connect_port 80   #检查的连接端口
        }
    }
    real_server 192.168.1.8 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
[root@lvs ~]# systemctl start keepalived.service
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 rr
  -> 192.168.1.7:80               Masq    1      0          0         
  -> 192.168.1.8:80               Masq    1      0          0         
TCP  10.0.0.4:80 rr
  -> 192.168.1.7:80               Masq    1      0          0         
  -> 192.168.1.8:80               Masq    1      0          0

这里keepalived服务启动后,配置的vip也成功实现了lvs负载均衡,还需要做的就是在web服务器上增加辅助ip10.0.0.33即可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LVS负载均衡之DR模式

    参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html

    山山仙人
  • 二进制搭建Kubernetes集群(最新v1.16.0版本)

    下载地址:https://github.com/coreos/etcd/releases

    山山仙人
  • 私有镜像仓库Harbor

    Docker守护进程将.crt文件解释为CA证书,将.cert文件解释为客户端证书。 所以需要将服务器转换yourdomain.com.crt为yourdom...

    山山仙人
  • “兼职”运维的常用命令

    自从产品转到了 dotNET Core 之后,更深入的接触 Linux和 Docker ,而我每天的工作中,有一部分时间相当于在“兼职”做一些运维的事情。下面是...

    oec2003
  • 2.7 cd命令

    cd 等于change directory cd命令 - 参数,"cd -"进入上一次所在目录 只输入"cd",进入用户当前home目录下,也就...

    运维小白
  • linux每日命令(32):gzip命令

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩...

    用户1214487
  • CVPR 2018|Best paper: Taskonomy 学习笔记

    Taskonomy通过量化不同视觉任务之间的关联、并利用这些关联最优化学习策略。(如果两视觉任务A,B之间具有关联性,那么我们在A中学习到的表达理应可以为解决任...

    用户3636924
  • nginx python Django 集成总结之-nginx配置

    onety码生
  • 计算机视觉 OpenCV Android | 图像操作之 自定义滤波、形态学操作(更新ing)

    其中,左侧是Robert算子的X方向梯度、右侧是Y方向梯度。 自定义Robert算子实现如下:

    凌川江雪
  • Python建立SSH连接的方法

          我需要实现一个Windows下远程连接到SSH服务器执行命令的功能,所以就在网上找资料。我的环境是:Windows7 64位,Python 2.7 ...

    py3study

扫码关注云+社区

领取腾讯云代金券