提到 LVS,就从章文嵩博士开始吧,反正也不知道如何下笔来写这一篇。章大博士,读博时候创建这个 lvs 软件项目,但是他提倡开源精神,在用户的建议和反馈中,这个花了他两周时间开发的开源软件不断得到改建和丰富。到 1999 年,该款软件已在负载均衡领域中比较出名,章文嵩仍旧坚持开源,将源代码分享给所有人。好人自有好归宿,章博士在 2016 年 5 月 27 日,去滴滴出任高级副总裁、负责 CTO 线基础平台部兼工程技术委员会主席。在来滴滴之前,章博士曾在阿里任职近七年,历任淘宝网资深技术总监、淘宝技术委员会主席、阿里副总裁、阿里开源委员会主席、阿里云 CTO 等。
那扯那么多 LVS 是个什么呢?
他是 Linux Virtual Server 的缩写,是一个虚拟的服务器集群系统,总之为使用集群技术来和 Linux 系统来实现一个高可用,高性能的服务器。如果进一步的扯淡,建议百度百科一下,里面清清楚楚,如果你看百科看不懂,那你加左上角的技术群,去跟里面的大神聊聊吧。这里我附带一个直通章博士的 LVS 中文站点:。
LVS 集群分为三层结构:
章文嵩博士的博文在这里,瞅瞅吧。
接下来我们的示例,就采用如下 ip 配置部署。
具体数据包路由走向,参考我的文章 中的 nat 网络连接方式。
NAT 模式的几个要点
1、准备工作,3 台服务器。一台用作 Director server。2 台用作 real server。如上图。
2、配置 Director server 为双 ip
- [root@localhost ~]# ifconfig
- eth0: flags=4163 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
- 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 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
- 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
- [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"
- [root@localhost network-scripts]# echo "1">"/proc/sys/net/ipv4/ip_forward"
- [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
3、配置 Real server。real server 为 host-only 模式,这里要做的就很简单啦。
- [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"
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 模式的配置实现也已完成,这个配置其实很简单的,对吧。哈哈。
ipvsadm 参数详解
保存添加的虚拟 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) 每秒入流量(字节)
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、你可以忘记点赞加关注,但千万不要忘记扫码打赏哦。
来源: http://www.cnblogs.com/knowledgesea/p/6406994.html