Linux系统(四)负载均衡LVS集群之NAT模式

序言

提到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

Linux系统(四)负载均衡LVS集群之NAT模式

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

Linux系统(四)负载均衡LVS集群之NAT模式

具体数据包路由走向,参考我的文章 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

Linux系统(四)负载均衡LVS集群之NAT模式

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

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

[root@localhost ~]# curl 192.168.222.131
192.168.222.130:A
[root@localhost ~]# curl 192.168.222.131
192.168.2.129 c
[root@localhost ~]# curl 192.168.222.131
192.168.222.130:A
[root@localhost ~]# curl 192.168.222.131
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、查看记录和规则

[root@localhost network-scripts]# 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.222.131:80 rr
-> 192.168.2.129:80 Masq 1 1 0
-> 192.168.2.130:80 Masq 1 0 0

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

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

Weight:轮询权重

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

[root@localhost network-scripts]# ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.222.131:http 50 263 134 46273 20519
-> 192.168.2.129:http 32 178 83 31215 13069
-> 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、显示速率信息

[root@localhost network-scripts]# ipvsadm -L --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.222.131:http 0 1 0 216 87
-> 192.168.2.129:http 0 1 0 212 85
-> 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、你可以忘记点赞加关注,但千万不要忘记扫码打赏哦。

上一篇:Node.js 从零开发 web server博客项目[安全]


下一篇:廖雪峰js教程笔记10 浏览器对象