设为首页 收藏本站
查看: 1081|回复: 0

[经验分享] LVS基于NAT的负载均衡

[复制链接]

尚未签到

发表于 2019-1-4 11:49:06 | 显示全部楼层 |阅读模式
  LVS基于NAT的负载均衡
实验环境:VMware workstation 10
       centos 6.4
  LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。章文嵩博士目前工作于阿里集团,主要从事集群技术、操作系统、对象存储与数据库的研究
  

  LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
  

  一般来说,LVS集群采用三层结构,其主要组成部分为:
  A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
  B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
  C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
  

  虚拟服务器的几种类型:
  通过NAT虚拟服务器
  虚拟服务器的优势通过NAT是真正的服务器 可以运行任何操作系统,支持TCP / IP协议,真的吗 服务器可以使用私有网络地址,只有一个IP地址 所需的负载均衡器。
  

  缺点是通过虚拟服务器的可伸缩性 NAT是有限的。 负载平衡器可能是整体的一个瓶颈 系统服务器节点(通用PC服务器)的数量增加 大约20或更多,因为请求数据包和响应 数据包需要重写的负载均衡器。 假设的 TCP数据包的平均长度是536字节,平均延迟 重写一个包是我们约60(奔腾处理器,这可以 稍微减少了使用更高的处理器),最大的吞吐量 负载均衡器的8.93 mb / s。 假设平均 真实服务器的吞吐量是400 kb / s,负载平衡器 安排22真实的服务器。
  

  虚拟服务器通过NAT可以满足性能要求很多 服务器。 即使在负载均衡器的瓶颈 整个系统,有两种方法来解决这个问题,一个是混合动力车 方法,,另一个是 虚拟 服务器通过IP隧道 或 虚拟 服务器通过直接路由 。 在DNS混合的方式,有 很多都有自己的服务器集群的负载平衡器,和 负载平衡器由Round-Round分组在一个域名 DNS。 你可以尝试使用VS-Tunneling或VS-DRouting 可伸缩性,您也可以尝试嵌套和负载平衡器的方法, 第一个前端是VS-Tunneling或VS-DRouting负载均衡器, 第二层是许多VS-NAT负载平衡器,都有他们的 自己的集群。
  

  虚拟服务器通过IP隧道
  通过NAT在虚拟服务器,请求和响应数据包 需要通过负载均衡器,负载平衡器可能是一个新的 瓶颈当服务器节点的数量增加到20或更多, 因为网络接口的吞吐量是有限的 最终。 我们可以看到许多互联网服务(比如web 服务),请求数据包通常短,响应包 通常有大量的数据。
  

  通过IP隧道,在虚拟服务器负载平衡器而已 时间表对不同的真实服务器的请求,和真正的服务器 回复直接返回给用户。 因此,负载平衡器可以处理 大量的请求,它可能安排超过100真正的服务器,它 不会是系统的瓶颈。 :-)因此使用IP隧道 将大大增加负载的服务器节点的最大数量 均衡器。 虚拟服务器可以达到的最大吞吐量 1 gbps,即使负载均衡器只有100 mbps的全双工网络 适配器。
  

  IP隧道特性可以用来建立一个非常 高性能虚拟服务器。 这是极好的建设 虚拟代理服务器,代理服务器get请求,因为当它 可以直接访问互联网获取对象并返回它们 直接用户。
  然而,所有服务器必须有“IP隧道”(IP 启用封装)协议,我只是测试了它在Linux上的IP 隧道。 如果你让虚拟服务器服务器上运行的其他工作 操作系统与IP隧道,请告诉 我 知道,我将很高兴听到 那

  

  虚拟服务器通过直接路由
  通过隧道的方法,像在虚拟服务器LinuxDirector 过程只有客户机到服务器的一个连接的一半 虚拟服务器通过直接路由和响应数据包可以遵循 独立的网络线路的客户。 这可以大大增加 虚拟服务器的可伸缩性。
  通过IP隧道的方法相比,虚拟服务器,这一点 方法没有隧道开销(事实上,这开销 最小的在大多数情况下),但要求一个负载 平衡器的接口和真正的服务器的接口必须的 同一物理段。

  

  

  

  LVS在服务器的负载均衡的实现,比较类似于netfilter框架,它在内核中靠的是LVS代码,在用户空间有工具ipvsadm,实现类似于四层的功能控制,
  

  有以下几种大致的虚拟服务器负载均衡
  1.基于DNS的解析类负载均衡,通过内部的地址调度算法,进行均衡,但由于这种均衡不涉及到后方服务器的真实性能,所以很可能造成负载“失衡”
  

  2.前方架构dispatcher这种方案,Internet用户也不需要知道前端设备的存在
  其工作方式可以分为以下几种
  使用nat的方式 后方服务器可以是任意类型的支持tcp/ip的操作系统,但地址类型是私有的, 服务器数量较少,10到20个,网关指向前端设备
  

  3.使用ip tunneling  后方服务器必须是隧道类型连接,可以在同一局域网,也可以是分部在广域网中,可以实现异地容灾概念, 支持的服务器数量多,服务器网关指向各自的网关
  

  具体实现步骤:
  

  [root@localhost ~]# vim /etc/sysctl.conf
  


  

  分别增加两台web服务器,并把它们的地址分配为192.168.2.18和192.168.2.17 并将他们与lvs的内网网卡(本例中的192.168.2.1网卡)放置到同一区域,如vmnet2
  



  并保证他们与前段directe的通信
  



  

  [root@localhost ~]# route -n
  Kernel IP routing table
  Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
  192.168.3.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2
  192.168.2.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
  分别在两台web服务器上安装HTTP服务

  web2站点我们选择监听在它的800端口
  [root@localhost ~]# vim /etc/httpd/conf/httpd.conf

  并修改服务器的主机名称
  


  web1站点我们选择监听在它的80端口

  修改服务器的主机名称

  

  在web1上建立测试页面,加入开机启动,为保证实验的测试效果,我们将页面内容分别用server1和server2代替
  


  为保证正常访问关闭有关的selinux和防火墙设置
  


  在web2要做和web1同样的设置上,而且因为绑定了非标准端口,在开启服务是会因安全选项阻止而失败,所以我们要先关闭有关的安全选项,再开启服务
  


  

  服务器端directe配置步骤:
  关于ipvsadm的信息
  

  
  [root@localhost Packages]# rpm -qip ipvsadm-1.25-10.el6.i686.rpm
  warning: ipvsadm-1.25-10.el6.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
  Name        : ipvsadm                      Relocations: (not relocatable)
  Version     : 1.25                              Vendor: CentOS
  Release     : 10.el6                        Build Date: Fri 22 Jun 2012 12:08:15 AM PDT
  Install Date: (not installed)               Build Host: c6b8.bsys.dev.centos.org
  Group       : Applications/System           Source RPM: ipvsadm-1.25-10.el6.src.rpm
  Size        : 65763                            License: GPLv2+
  Signature   : RSA/SHA1, Sun 24 Jun 2012 03:08:27 PM PDT, Key ID 0946fca2c105b9de
  Packager    : CentOS BuildSystem
  URL         : http://www.linuxvirtualserver.org/software/ipvs.html
  Summary     : Utility to administer the Linux Virtual Server
  Description :
  ipvsadm is a utility to administer the IP Virtual Server services
  offered by the Linux kernel.
  安装ipvsadm:
  [root@localhost Packages]# rpm -ivh ipvsadm-1.25-10.el6.i686.rpm
  warning: ipvsadm-1.25-10.el6.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
  Preparing...                ########################################### [100%]
  1:ipvsadm                ########################################### [100%]
  

  

  ipvsadmn -A来增加一个服务 -E修改一个服务 -t指明协议 (第一大步)
  ipvsadm -a 指明real server -e 编辑 -g表示DR(直接路由)模型 -i表示tunneling隧道模型  -m 表示masquerading 既nat模型  默认为-g gatway模型
  

-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
-r --real-server server-address 真实的服务器[Real-Server:port]
-w --weight weight 真实服务器的权值
-m --masquerading 指定LVS 的工作模式为NAT 模式
-h --help 显示帮助信息
  

  

  [root@localhost ~]# ipvsadm -A -t 192.168.3.2:80 -s rr   #增加一个tcp协议的虚拟服务,虚拟地址192.168.3.2 -s指明所用算法为round-robin
  

  [root@localhost ~]# ipvsadm -a -t 192.168.3.2:80 -r 192.168.2.18:80 -m      #增加一个真实服务器对应到192.168.3.2,真实服务器地址为192.168.2.18的80端口 -m指定转换类型问NAT
  

  [root@localhost ~]# ipvsadm -a -t 192.168.3.2:80 -r 192.168.2.17:800 -m     #增加一个真实服务器对应到192.168.3.2,真实服务器地址为192.168.2.17的800端口 -m指定转换类型问NAT
  

  

  启用浏览器测试,注意测试要多刷新几次请求,使后端的directed测试结果明显
  页面效果server2

  

  负载均衡效果页面server1
  


  

  查看轮询结果
  [root@localhost ~]# ipvsadm -l -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  TCP  192.168.3.2:80 rr
  -> 192.168.2.18:80              Masq    1      0          7
  -> 192.168.2.18:800             Masq    1      0          7
  

  加权轮询调度算法
  

  

  使用加权的轮询算法(wrr)
  [root@localhost ~]# ipvsadm -E -t 192.168.2.10:80 -s wrr     //加权轮询算法
  [root@localhost ~]# ipvsadm -e -t 192.168.2.10:80 -r 192.168.4.200:800 -m -w 2  //权重设2
  [root@localhost ~]# ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  TCP  192.168.2.10:80 wrr
  -> 192.168.4.100:80             Masq    1      0          0
  -> 192.168.4.200:800            Masq    2      0          0
  

  测试结果,比例基本在1:2
  
  [root@localhost ~]# ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  TCP  192.168.2.10:80 wrr
  -> 192.168.4.100:80             Masq    1      0          7
  -> 192.168.4.200:800            Masq    2      0          14
  

  配置保存
  [root@localhost ~]# service ipvsadm save           //保存
  ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]
  [root@localhost ~]# vim /etc/sysconfig/ipvsadm     //查看
  1 -A -t 192.168.2.10:80 -s wrr
  2 -a -t 192.168.2.10:80 -r 192.168.4.100:80 -m -w 1
  3 -a -t 192.168.2.10:80 -r 192.168.4.200:800 -m -w 2
  [root@localhost ~]# ipvsadm -C                     //临时清除
  [root@localhost ~]# ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  [root@localhost ~]# service ipvsadm restart        //重新应用
  ipvsadm: Clearing the current IPVS table:                  [  OK  ]
  ipvsadm: Unloading modules:                                [  OK  ]
  ipvsadm: Clearing the current IPVS table:                  [  OK  ]
  ipvsadm: Applying IPVS configuration:                      [  OK  ]
  [root@localhost ~]# ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  TCP  192.168.2.10:80 wrr
  -> 192.168.4.100:80             Masq    1      0          0
  -> 192.168.4.200:800            Masq    2      0          0
  

  在所用的direct中有round-robin算法和基于权重的round-robin算法,最少连接数概念(动态计算)    源哈希指的是记录第一次来时访问的某个服务器,以后的同样的数据流都会定向到同一台后台real server上。目标哈希则会影响访问数据的返回路径,假如从防火墙a来,则从防火墙b返回
  

  查看内核参数中的ipvsadm信息
  [root@localhost ~]# sysctl -p
  net.ipv4.ip_forward = 1
  net.ipv4.conf.default.rp_filter = 1
  net.ipv4.conf.default.accept_source_route = 0
  kernel.sysrq = 0
  kernel.core_uses_pid = 1
  net.ipv4.tcp_syncookies = 1
  error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  kernel.msgmnb = 65536
  kernel.msgmax = 65536
  kernel.shmmax = 4294967295
  kernel.shmall = 268435456
  [root@localhost ~]# grep -i vs /boot/config-2.6.32-358.el6.i686
  # CONFIG_GENERIC_TIME_VSYSCALL is not set
  CONFIG_HIBERNATION_NVS=y
  CONFIG_IP_VS=m
  CONFIG_IP_VS_IPV6=y
  # CONFIG_IP_VS_DEBUG is not set
  CONFIG_IP_VS_TAB_BITS=12
  # IPVS transport protocol load balancing support
  CONFIG_IP_VS_PROTO_TCP=y
  CONFIG_IP_VS_PROTO_UDP=y
  CONFIG_IP_VS_PROTO_AH_ESP=y
  CONFIG_IP_VS_PROTO_ESP=y
  CONFIG_IP_VS_PROTO_AH=y
  CONFIG_IP_VS_PROTO_SCTP=y
  # IPVS scheduler
  CONFIG_IP_VS_RR=m
  CONFIG_IP_VS_WRR=m
  CONFIG_IP_VS_LC=m
  CONFIG_IP_VS_WLC=m
  CONFIG_IP_VS_LBLC=m
  CONFIG_IP_VS_LBLCR=m
  CONFIG_IP_VS_DH=m
  CONFIG_IP_VS_SH=m
  CONFIG_IP_VS_SED=m
  CONFIG_IP_VS_NQ=m
  # IPVS application helper
  CONFIG_IP_VS_FTP=m
  CONFIG_OPENVSWITCH=m
  CONFIG_MTD_BLKDEVS=m
  CONFIG_SCSI_MVSAS=m
  # CONFIG_SCSI_MVSAS_DEBUG is not set
  CONFIG_VMWARE_PVSCSI=m
  CONFIG_MOUSE_VSXXXAA=m
  CONFIG_MAX_RAW_DEVS=8192
  CONFIG_USB_SEVSEG=m
  CONFIG_USB_VST=m
  

  

  其他调度算法简介
  

  Least-Connection调度
  least-connection调度算法指导网络 连接到服务器的数量最少的 连接。 这是一个动态调度算法; 因为它需要计数为每个服务器连接生活 动态。 为虚拟服务器管理的集合 服务器性能相似,least-connection调度 好光滑分布在不同请求的负载 很多。虚拟服务器将直接请求到真正的服务器 用最少的活动连接。
  

  乍一看似乎least-connection调度也可以 表现良好,即使有各种处理的服务器 能力,因为更快的服务器将获得更多的网络 连接。 事实上,因为它不能执行很好 TCP的TIME_WAIT状态。 TCP的TIME_WAIT通常是2分钟, 在这2分钟一个繁忙的网站经常收到成千上万的 连接,例如,服务器是强大的两倍 服务器,服务器处理成千上万的请求 让他们在TCP的TIME_WAIT状态,但服务器B 爬行到成千上万的连接完成。 所以, least-connection调度无法负荷之间的平衡 服务器与不同的处理能力。
  

  加权Least-Connection调度

  加权least-connection调度的超集 least-connection调度中,您可以指定一个 性能重量每个真正的服务器。 服务器具有更高 重量值将获得更大比例的生活连接 在任何一个时间。 管理员可以分配一个虚拟服务器 重量每个真正的服务器和网络连接计划 每个服务器的当前数量的百分比 现场连接每个服务器是一个比它的重量。 的 默认的重量就是其中之一。
  

  关于他们更详细的介绍可以参阅www.linuxvirtualserver.org/VS-NAT.html

  

  

  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-659289-1-1.html 上篇帖子: 负载均衡集群LVS实战篇 下篇帖子: 群集方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表