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集群采用三层 结构,体系结构如下所示:

slb LVS slb lvs部署_IP

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的体系结构如图所示:

slb LVS slb lvs部署_linux_02

2. IP隧道(IP TUNnel)

简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的internet连接直接回应客户机,而不再经过负载均衡调度器,服务器节点分散在互联网中不要位置,具有独立的公网IP地址,通过专用IP隧道与负载均衡调度器相互通信.

slb LVS slb lvs部署_slb LVS_03

3. 直接路由(Direct Routing)

简称DR模式,采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络,负载均衡调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道,

slb LVS slb lvs部署_服务器_04


以上三种,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显示信息,用于区分服务器,例如:

slb LVS slb lvs部署_IP_05

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主页面了

slb LVS slb lvs部署_slb LVS_06

这里我们采用的是轮询方式负载均衡,但是通过测试发现,并不是二者一人一次出现,有些节点会保持比较长时间,又是看起来又比较均匀, 猜测跟nginx的缓存有关。