序言

提到LVS,就从章文嵩博士开始吧,反正也不知道如何下笔来写这一篇。章大博士,读博时候创建这个lvs软件项目,但是他提倡开源精神,在用户的建议和反馈中,这个花了他两周时间开发的开源软件不断得到改建和丰富。到1999年,该款软件已在负载均衡领域中比较出名,章文嵩仍旧坚持开源,将源代码分享给所有人。好人自有好归宿,章博士在2016年5月27日,去滴滴出任高级副总裁、负责CTO线基础平台部兼工程技术委员会主席。在来滴滴之前,章博士曾在阿里任职近七年,历任淘宝网资深技术总监、淘宝技术委员会主席、阿里副总裁、阿里开源委员会主席、阿里云CTO等。

那扯那么多LVS是个什么呢?

他是Linux Virtual Server的缩写,是一个虚拟的服务器集群系统,总之为使用集群技术来和Linux系统来实现一个高可用,高性能的服务器。如果进一步的扯淡,建议百度百科一下,里面清清楚楚,如果你看百科看不懂,那你加左上角的技术群,去跟里面的大神聊聊吧。这里我附带一个直通章博士的LVS中文站点:http://zh.linuxvirtualserver.org/

LVS 集群分为三层结构:

  • 负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上执行,而client端认为是返回来一个同一个IP【通常把这个IP 称为虚拟IP/VIP】
  • 服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTP,MAIL,DNS
  • 共享存储(shared stored):它为 server pool 提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务

LVS NAT模式简述

章文嵩博士的博文在这里,瞅瞅吧。http://www.linuxvirtualserver.org/zh/lvs3.html

接下来我们的示例,就采用如下ip配置部署。

具体数据包路由走向,参考我的文章 VMware虚拟网络连接模式详解(NAT,Bridged,Host-only) 中的nat网络连接方式。

NAT模式的几个要点

  1. dip这台服务器为分发服务器,他拥有2个ip一个客户访问的外网ip,一个ip作为vip真实服务器的网关地址,且真实服务器必须在一个网段中。
  2. 分发服务器上安装支持负载均衡各种算法的软件,来实现负载转发功能。
  3. 分发服务器还需要打开路由转发功能。
  4. 中RIP真实服务器可以使用任何的操作系统,但都需使用私有网络。
  5. NAT网络连接方式的弊端也是lvs nat模式的性能瓶颈所在,就是分发服务器转发所有的请求到真实服务器与转发请求响应数据到客户端,这样就是一个性能瓶颈。

LVS NAT模式配置操作

1、准备工作,3台服务器。一台用作Director server。2台用作real server。如上图。

2、配置Director server为双ip

  1. [root@localhost ~]# ifconfig
  2. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  3. inet 192.168.222.131 netmask 255.255.255.0 broadcast 192.168.222.255
  4. inet6 fe80::20c:29ff:feaf:ff3a prefixlen 64 scopeid 0x20<link>
  5. ether 00:0c:29:af:ff:3a txqueuelen 1000 (Ethernet)
  6. RX packets 53298 bytes 4735958 (4.5 MiB)
  7. RX errors 0 dropped 0 overruns 0 frame 0
  8. TX packets 2690 bytes 453988 (443.3 KiB)
  9. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  10.  
  11. eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  12. inet 192.168.2.136 netmask 255.255.255.0 broadcast 192.168.2.255
  13. inet6 fe80::20c:29ff:feaf:ff44 prefixlen 64 scopeid 0x20<link>
  14. ether 00:0c:29:af:ff:44 txqueuelen 1000 (Ethernet)
  15. RX packets 11269 bytes 882315 (861.6 KiB)
  16. RX errors 0 dropped 0 overruns 0 frame 0
  17. TX packets 1502 bytes 294418 (287.5 KiB)
  18. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  • 查看eth1具体配置,eth0为nat连网方式,不需要修改,eth1为host-only模式,需要修改为静态ip,且配置ip地址。
  1. [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
  2. TYPE="Ethernet"
  3. BOOTPROTO="static"
  4. DEFROUTE="yes"
  5. PEERDNS="yes"
  6. PEERROUTES="yes"
  7. IPV4_FAILURE_FATAL="no"
  8. IPV6INIT="yes"
  9. IPV6_AUTOCONF="yes"
  10. IPV6_DEFROUTE="yes"
  11. IPV6_PEERDNS="yes"
  12. IPV6_PEERROUTES="yes"
  13. IPV6_FAILURE_FATAL="no"
  14. NAME="eth1"
  15. DEVICE="eth1"
  16. ONBOOT="yes"
  17. IPADDR="192.168.2.136"
  18. NETMASK="255.255.255.0"
  • 设置Director server,开启路由转发功能
  1. [root@localhost network-scripts]# echo "1">"/proc/sys/net/ipv4/ip_forward"
  • 在Director server上安装lvs管理工具:ipvsadmin,ipvsadmin这个工具稍后会深入一下。
  1. [root@localhost ~]# yum install ipva
  • 配置负载均衡规则为轮询
  1. [root@localhost ~]# ipvsadm -C --清空转发规则
  2. [root@localhost ~]# ipvsadm -A -t 192.168.222.131:80 -s rr --131上一单有80端口的tcp请求,即使用rr表示转发策略为轮询的方式转发给一下的真实服务器,这里有好多负载均衡转发算法,在下面会介绍下。
  3. [root@localhost ~]# ipvsadm -a -t 192.168.222.131:80 -r 192.168.2.130 -m
  4. [root@localhost ~]# ipvsadm -a -t 192.168.222.131:80 -r 192.168.2.129 -m
  • 到此Director server已经全部配置完毕。

3、配置Real server。real server为host-only模式,这里要做的就很简单啦。

  • 配置ip为静态ip,且网关为Director server的内网ip
  1. [root@localhost network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
  2. TYPE="Ethernet"
  3. BOOTPROTO="static"
  4. DEFROUTE="yes"
  5. PEERDNS="yes"
  6. PEERROUTES="yes"
  7. IPV4_FAILURE_FATAL="no"
  8. IPV6INIT="yes"
  9. IPV6_AUTOCONF="yes"
  10. IPV6_DEFROUTE="yes"
  11. IPV6_PEERDNS="yes"
  12. IPV6_PEERROUTES="yes"
  13. IPV6_FAILURE_FATAL="no"
  14. NAME="eth0"
  15. DEVICE="eth0"
  16. ONBOOT="yes"
  17. IPADDR="192.168.2.130"
  18. NETMASK="255.255.255.0"
  19. GATEWAY="192.168.2.136"
  • 2台real server的网络设置一样,只是ip不一样而已。这里不一一列出,如上配置即可。
  • 安装nginx ,安装之后修改页面,打开80端口即可。

4、看下结果,在主机上用浏览器打开。http://192.168.222.131/  ,不断刷新页面即可看到来到2个real server的不同web站点的网页。

  1. [root@localhost ~]# curl 192.168.222.131
  2. 192.168.222.130:A
  3. [root@localhost ~]# curl 192.168.222.131
  4. 192.168.2.129 c
  5. [root@localhost ~]# curl 192.168.222.131
  6. 192.168.222.130:A
  7. [root@localhost ~]# curl 192.168.222.131
  8. 192.168.2.129 c

5、到此,lvs的nat模式的配置实现也已完成,这个配置其实很简单的,对吧。哈哈。

ipvsadmin工具命令讲解

ipvsadm 参数详解

  • -A (--add-service) 在内核的虚拟服务器列表中添加一条新的虚拟IP记录。也就是增加一台新的虚拟服务器。虚拟IP也就是虚拟服务器的IP地址。
  • -E (--edit-service) 编辑内核虚拟服务器列表中的一条虚拟服务器记录
  • -D (--delete-service) 删除内核虚拟服务器列表中的一条虚拟服务器记录
  • -C (--clear) 清除内核虚拟服务器列表中的所有规则
  • -R (--restore) 恢复虚拟服务器规则
  • -S (--save) 保存虚拟服务器规则,输出为-R 选项可读的格式
  • -a (--add-server) 在内核虚拟服务器列表的一条记录里添加一条新的Real Server记录。也就是在一个虚拟服务器中增加一台新的Real Server
  • -e (--edit-server) 编辑一条虚拟服务器记录中的某条Real Server记录
  • -d (--delete-server) 删除一条虚拟服务器记录中的某条Real Server记录
  • -L|-l –list 显示内核中虚拟服务器列表
  • -Z (--zero) 虚拟服务器列表计数器清零(清空当前的连接数量等)
  • --set tcp tcpfin udp 设置连接超时值
  • -t 说明虚拟服务器提供的是tcp服务,此选项后面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
  • -u 说明虚拟服务器提供的是udp服务,此选项后面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
  • -f  fwmark 说明是经过iptables标记过的服务类型
  • -s  此选项后面跟LVS使用的调度算法,有这样几个选项: rr|wrr|lc|wlc|lblc|lblcr|dh|sh,默认的调度算法是: wlc
  • -p  [timeout] 在某个Real Server上持续的服务时间。也就是说来自同一个用户的多次请求,将被同一个Real Server处理。此参数一般用于有动态请求的操作中,timeout 的默认值为360 分钟。例如:-p 600,表示持续服务时间为600分钟。
  • -r 指定Real Server的IP地址,此选项后面跟格式: [real-server-ip:port]
  • -g (--gatewaying) 指定LVS 的工作模式为直接路由模式(此模式是LVS 默认工作模式)
  • -i (-ipip) 指定LVS 的工作模式为隧道模式
  • -m (--masquerading) 指定LVS 的工作模式为NAT模式
  • -w (--weight) weight 指定Real Server的权值
  • -c (--connection) 显示LVS目前的连接信息 如:ipvsadm -L -c
  • -L --timeout 显示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout
  • -L --daemon 显示同步守护进程状态,例如:ipvsadm -L –daemon
  • -L  --stats 显示统计信息,例如:ipvsadm -L –stats
  • -L  --rate 显示速率信息,例如:ipvsadm -L  --rate
  • -L  --sort 对虚拟服务器和真实服务器排序输出,例如:ipvsadm -L --sort

保存添加的虚拟ip记录和ipvsadm的规则可以使用service ipvsadm save,还可以用-S或--save。清除所有记录和规则除了使用-C,还以使用--clear。

下面列出几个常用的查询。

1、查看记录和规则

  1. [root@localhost network-scripts]# ipvsadm -L -n
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 192.168.222.131:80 rr
  6. -> 192.168.2.129:80 Masq 1 1 0
  7. -> 192.168.2.130:80 Masq 1 0 0

InActConn: 指非活跃连接数,我们将处于 TCP ESTABLISH 状态以外的连接都称为不活跃连接。例如处于 SYN_RECV 状态的连接,处于 TIME_WAIT 状态的连接等。

ActiveConn:是活动连接数,也就是tcp连接状态的ESTABLISHED;

Weight:轮询权重

2、选项是统计自该条转发规则生效以来的包

  1. [root@localhost network-scripts]# ipvsadm -L --stats
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
  4. -> RemoteAddress:Port
  5. TCP 192.168.222.131:http 50 263 134 46273 20519
  6. -> 192.168.2.129:http 32 178 83 31215 13069
  7. -> 192.168.2.130:http 18 85 51 15058 7450

Conns    (connections scheduled) : 已经转发过的连接数

InPkts   (incoming packets) :入包个数

OutPkts  (outgoing packets) : 出包个数

InBytes  (incoming bytes) :入流量(字节)

OutBytes (outgoing bytes)  : 出流量(字节)

3、显示速率信息

  1. [root@localhost network-scripts]# ipvsadm -L --rate
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
  4. -> RemoteAddress:Port
  5. TCP 192.168.222.131:http 0 1 0 216 87
  6. -> 192.168.2.129:http 0 1 0 212 85
  7. -> 192.168.2.130:http 0 0 0 4 2

CPS (current connection rate) :每秒连接数

InPPS (current in packet rate) : 每秒的入包个数

OutPPS (current out packet rate): 每秒的出包个数

InBPS (current in byte rate) : 每秒入流量(字节)

OutBPS   (current out byte rate)      每秒入流量(字节)

lvs中的集中调度模式

1、rr(round robin:轮询。  --在服务器池中无穷的循环遍历。

2、wrr(weighted round robin):权重轮询法。  --根据权重值,来分配请求连接,处理的请求连接数与权重值的比率一致。

3、lc(least-connection):最少连接法。  --当请求到达director时,director查看活动和非活动的连接数量,以确定把请求分发给哪个服务器,director将集群节点目前的活动连接数量x256再加上不活动的连接数量,得到借点的开销值。最低开销值的节点胜出,被分发给新的入站请求。(如果开销一样,则第一个节点被选中)。

4、wlc(weighted least-connection):带权重的最少连接法。  --先如lc算出集群节点的开销值,然后除以分配给其的权重值,最小值节点胜出,将入站请求分发给它。

5、lblc(locality-based least-connection):基于本地的最少连接法。  --基于局部的最小连接,当realserver是缓存服务器的时候用的比较多。

6、lblcr(locality-based least-connection with replication):带复制的基于局部的最小连接。  --当realserver是缓存服务器的时候用的比较多。

7、dh(destination hashing):目标散列法

8、sh(source hashing):源散列法。  --同一个ip的客户端总是分发给同一个realserver。相当于有客户粘性,与nginx中的iphash一致。

9、sed(shortest expected delay):最短预期延迟法。  --最短延时预测(ci+1)/ui,ci是连接数,ui是权重值。在wlc方法上做啦轻微改进,这些服务使用tcp,而且当群节点在处理每个请求时保持在活动状态。计算方法:每个集群节点的的开销值是通过将活动的连接数+1计算的。然后开销值除以分配权重值,得到的就是sed值,值少的集群节点胜出。

10、nq(never queue):永不排队法。  --没有队列,分配请求给空闲的服务器,没有空闲的服务器就找响应最快的。

总结

接下来是大家最喜欢的总结内容啦,内容有三,如下:

1、希望能关注我其他的文章。

2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。

3、你可以忘记点赞加关注,但千万不要忘记扫码打赏哦。

Linux系统(四)负载均衡LVS集群之NAT模式的更多相关文章

  1. Linux系统(五)负载均衡LVS集群之DR模式

    序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图.LVS/NAT模式如下图: LVS/I ...

  2. LVS集群之NAT模式实现

    LVS集群之NAT模式实现 一.集群的种类 集群系统主要分为 1.HA:高可用集群,又叫双机热备.   (a)原理      2台机器A,B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至 ...

  3. LVS集群之NAT模式实例(3)

    LVS集群NAT模式实例 1. 实验拓扑图 DS 必须有两块网卡,需要在上面做NAT. 2. 实验环境 3台CentOS6.4 64bit的服务器. 类型 IP DR eth0:10.20.73.20 ...

  4. 负载均衡LVS集群详解

     一.LB--负载均衡 在负载均衡集群中需要一个分发器,我们将其称之为Director,它位于多台服务器的上面的中间层,根据内部锁定义的规则或调度方式从下面的服务器群中选择一个以此来进行响应请求,而其 ...

  5. LVS集群之NAT模式

    集群的分类: (1)HA:高可用集群,有叫双机热备 原理:两台机器A.B,正常是A提供服务,当A机宕机或者服务有问题时,会切换到B机继续提供服务常用的高了永软件:heartbeat和keepalive ...

  6. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

    1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...

  7. Apache配置反向代理、负载均衡和集群(mod_proxy方式)

    Apache配置负载均衡和集群使用mod_jk的方式比较多,但是mod_jk已经停止更新,并且配置相对复杂.Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多. 1 ...

  8. Dubbo负载均衡与集群容错机制

    1  Dubbo简介 Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 作为一个轻量级RPC框架,D ...

  9. 基于Apache的Tomcat负载均衡和集群(2)

    反向代理负载均衡 (Apache+JK+Tomcat) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方式 ...

随机推荐

  1. C语言-if语句

    1.一般形式 if(表达式)表达式1 else 表达式2   :表达式成立(为真)则执行表达式1,否则执行表达式2. 适用范围:真假,对错,开关,对立面的条件 注意:如果if语句中只包括一条语句,可以 ...

  2. ios framework 开发

    ios framework 开发 之 参考 ios framework 开发 之 实战 iOS workspace 依次编译多个工程

  3. java中集合框架

    java平台提供了一个全新的集合框架."集合框架"主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型. 在很大程度上,一旦您理解了接口,您就理解了框架.虽然您总要创建接 ...

  4. [项目回顾]基于Redis的在线用户列表解决方案

    迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...

  5. php在客户端禁用cookie时让session不失效的解决方法

    cookie固然好,不过有些客户端浏览器会禁用cookie,这就会导致你所依赖cookies的程序会失效或出错,那么若真出现用户关闭cookies的情况,PHP应该如何再次使用session?方法还是 ...

  6. 译者序(Core Data 应用开发实践指南)

    Core Data 是数据管理框架. 该书用Grocery Dude 购物管理程序来贯穿整个学习过程. 本书共分三个部分: 前7章为基础篇.从基础知识.迁移方式及扩展方式来讲解托管对象模型.怎么用图形 ...

  7. 使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。

    使用 StateServer 保存 Session 正常操作情况下Session会无故丢失.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这 ...

  8. 解析STL中典型的内存分配

    1 vector 在C++中使用vector应该是非常频繁的,但是你是否知道vector在计算内存分配是如何么? 在c++中vector是非常类似数组,但是他比数组更加灵活,这就表现在他的大小是可以自 ...

  9. Flex中操作XML的E4X方法

    用于处理 XML 的 E4X 方法 Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本   ECMAScript for XML 规范定义了一组用于使用 XML 数据的类 ...

  10. pureMVC介绍及学习

    1   简介 Pure MVC是在基于模型.视图和控制器MVC模式建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex.Flash ...