LB集群部署 - LVS
- 1 LVS介绍
- 1.1 基本概念
- 1.2 LVS主要组成部分:
- 1.3 LVS负载均衡 方式:
- 1. LVS/NAT
- 2. IP隧道(IP TUNnel)
- 3. 直接路由(Direct Routing)
- 1.4 负载均衡 调度算法:
- 1. rr-轮询算法
- 2. wrr-加权轮询算法
- 3. wlc-加权最小连接算法
- 4. hash-哈希算法
- 2. 部署LVS-NAT模式
- 2.1 环境准备
- 2.2 安装nginx
- 2.3 在LVS上开启路由转发功能
- 2.4 配置LVS NAT模式集群并安装LVS管理工具`ipvsadm`
- 2.5 添加网关
- 2.6 访问测试
1 LVS介绍
1.1 基本概念
LVS是Linux virtual server的缩写,为linux虚拟服务器,是一个虚拟的服务器集群系统。采用IP负载均衡技术和基于内容请求分发技术,调度器具有很好的吞吐量,将请求均衡的转移到不同服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能,高可用的虚拟服务器,整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务端的程序,
简单来说:用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接收到请求,返回给用户。对于用户来说,看不到Web后端具体的应用。
为此,在设计师需要考虑系统的透明性,可伸缩性,高可用性和管理性,一般来说,LVS集群采用三层 结构,体系结构如下所示:
1.2 LVS主要组成部分:
负载调度器(Load balancer /Directory).它是整个集群对外面的前端机,负责将客户请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(也就是虚拟IP地址)上的
服务器池(server pool/Realserver)是一组真正执行客户请求的服务器,执行的服务一般有WEB,MAIL,FTP和DNS等
共享存储(shared storage)它为服务器池提供了一个共享的存储区,这样很容易使得服务器池有相同的内容,提供相同的服务,
1.3 LVS负载均衡 方式:
1. LVS/NAT
一种最简单的方式,所有的RealServer只需要将自己的网关指向Directory即可,客户端可以是任意操作系统,但此方式下,一个Directory即可.客户端可以是任意的操作系统,但此方式下,Directory也可以兼为一台RealServer比较有限
在LVS/NAT的方式下,Directory也可以兼为一台RealServer.LVS/NAT的体系结构如图所示:
2. IP隧道(IP TUNnel)
简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的internet连接直接回应客户机,而不再经过负载均衡调度器,服务器节点分散在互联网中不要位置,具有独立的公网IP地址,通过专用IP隧道与负载均衡调度器相互通信.
3. 直接路由(Direct Routing)
简称DR模式,采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络,负载均衡调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道,
以上三种,NAT方式只需要一个公网IP地址,从而成为最易用的一种负载均衡模式,安全性也比较好,许多硬件负载设备就是采用这种方式,相比较而言,DR模式和TUN模式的负载能力更加强大,使用范围更广,但节点的安全性要稍差一些
1.4 负载均衡 调度算法:
1. rr-轮询算法
轮询调度算法,顾名思义,就是将请求轮训的调度到每一台服务器上,是最简单的一种调度算法。这个算法的目的就是想做到一个“绝对的公平”。
2. wrr-加权轮询算法
轮询算法把请求平均分配给后端服务器,所以每个服务器的负载都是一样的,如果后端服务器的性能不一样,就有可能出现性能比较差的服务器挂掉的情况。所以就出现了加权轮询算法,权重值其实就是服务器的处理能力,权重值越高的机器处理的请求就越多。
3. wlc-加权最小连接算法
前面的加权轮询算法是一种无状态的算法,它不会去管服务器的真实负载情况。最小连接算法会记录所有服务器的连接建立情况,调度器总是把请求调度给连接数最少的服务器上。wlc尽可能让服务器的已有连接数和权重值成比例。
4. hash-哈希算法
hash算法首先对每台服务器的ip+port进行hash,然后根据请求的一个特定元组来计算出请求的hash值,最后将这个请求发送给hash值更接近的服务器。这个特定的元组可以自己设定,可以是源地址、源端口、目的地址、目的端口、协议中的任意几项。哈希算法可以保证同一个客户端或者同一个四元组(会话)的请求永远只被同一台服务器处理,如果四元组足够散列,那请求理论上也是均分到各个服务器上的。
一致性hash算法
在实际运维过程中,服务器变更(增删服务器)的操作十分频繁,对普通的hash算法来说,每次变更服务器,调度器都会重新计算服务器的hash值,这样即使是同一个四元组(会话),在变更前后,也会调度到不通的服务器上。一致性hash就是为了在服务器变更后,也尽可能的让同一个会话调度到同一个rs上,保持连接的一致性。比较常用的一致性hash算法有hash环和maglev hash
2. 部署LVS-NAT模式
2.1 环境准备
系统:CentOS Linux release 7.9.2009 (Core)
Server:LVS-调度器:
内网IP:192.168.71.183
Web-server1
内网IP:192.168.71.253
Web-server2
内网IP:192.168.70.183
这里真实的环境中,lvs调度器应该是有两个网卡,一个与外网通信,一个与内网通信,但此处都是内网的虚拟机,所以只涉及到一个网卡
2.2 安装nginx
请参考以前文章,此处不赘述
在两台web-server配置nginx显示信息,用于区分服务器,例如:
2.3 在LVS上开启路由转发功能
[root@node1 ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
...
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward = 1 #开启自动生效
[root@node1 ~]# sysctl -p #让配置立即生效
2.4 配置LVS NAT模式集群并安装LVS管理工具ipvsadm
[root@node1 ~]# yum install -y ipvsadm
添加一个虚拟服务:VIP地址 :192.168.71.254,服务端口:80
[root@node1 ~]# ipvsadm -A -t 192.168.71.254:80 -s rr
添加一个虚拟服务
- -t:表示TCP的服务 VIP:PORT
- -s:制定调度算法 rr表示route-robin
- -a:表示添加real server
- -r:制定real server的ip地址
- -m:表示masquerade也就是NAT方式LVS
添加虚拟服务后端的real server地址:
[root@node1 ~]# ipvsadm -a -t 192.168.71.254:80 -r 192.168.71.253 -m
[root@node1 ~]# ipvsadm -a -t 192.168.71.254:80 -r 192.168.70.183 -m
查看:
[root@node1 ~]# 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.71.254:80 rr
-> 192.168.70.183:80 Masq 1 0 0
-> 192.168.71.253:80 Masq 1 0 0
2.3和2.4可以整合成为脚本,在调度器服务器执行,如
[root@VM-75-63 ~]# cat lvs_nat.sh
#!/bin/bash
#开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
#关闭icmp重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
#echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects #这里把eth1的禁掉了,因为咱只有一个网卡
#设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
#设置ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.75.63:80 -s wrr
$IPVSADM -a -t 192.168.75.63:80 -r 192.168.75.64:80 -m -w 1
$IPVSADM -a -t 192.168.75.63:80 -r 192.168.75.65:80 -m -w 1
2.5 添加网关
在两台realserver上添加默认网关,IP为调度器的内网IP。
在两台realserver上添加网关:
[root@node2 ~]# route add default gw 192.168.71.183
[root@node2 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default node1 0.0.0.0 UG 0 0 0 ens33
default gateway 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.71.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.71.183的hostname是node1
2.6 访问测试
通过浏览器访问192.168.71.183就会显示nginx主页面了
这里我们采用的是轮询方式负载均衡,但是通过测试发现,并不是二者一人一次出现,有些节点会保持比较长时间,又是看起来又比较均匀, 猜测跟nginx的缓存有关。