防伪码:没有相当程度的孤独是不可能有内心的平和。

1、概念

1.1 介绍

负载均衡技术有很多实现方案,如基于DNS域名轮流解析的方法、基于客户端调度访问的方法、基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的就是IP负载均衡技术。

LVS的IP负载均衡技术是通过ipvs内核模块来实现的,ipvs是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问集群服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是ipvs实现的重点技术,ipvs实现负载均衡机制有四种,分别是NATTUNDR以及后来经淘宝开发的FullNAT

LVS是Linux Virtual Server的简写,即Linux虚拟服务器,可以在UNIX/Linux平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士成立,是国内最早出现的自由软件项目之一。

Linux内核2.4.24版本以后IPVS已经成为Linux官方标准内核的一部分。LVS在内核中的名字是IPVS。

LVS分为两个部件:ipvs和ipvsadm

  • ipvs : 工作于内核空间,主要用于使用户定义的策略生效;

  • ipvsadm : 工作于用户空间,主要用于用户定义和管理集群服务的工具;

不能直接配置内核中的IPVS,而需要使用IPVS的管理工具ipvsadm进行管理。也可以通过keepalived软件直接管理ipvs。

ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。


1.2 结构

LVS 集群分为三层结构:

  • 负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上执行,而client端认为是返回来一个同一个IP【通常把这个IP 称为虚拟IP/VIP】

  • 服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTP,MAIL,DNS

  • 共享存储(shared stored):它为 server pool 提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务


1.3 工作模式

VS/NAT(Virtual Server via Network Address Translation):网络地址映射,通过网络地址转换,调度器LB重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文处理后,返回时必须通过调度器,经过调度器时报文的源地址被重写,再返回给客户,完成整改负载调度过程。

IP TUN(IP隧道):是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。Director和RealServer必需在物理上有一个网卡通过不间断的局域网相连。 RealServer上绑定的VIP配置在各自Non-ARP的网络设备上(如lo或tunl),Director的VIP地址对外可见,而RealServer的VIP对外是不可见的。RealServer的地址即可以是内部地址,也可以是真实地址。

VS/DR(Virtual Server Direct Routing,直接路由):通过改写请求报文的目标MAC地址,将请求发给真实服务器,而真实服务器将响应后的处理结果直接返回给客户端用户。但要求调度器LB和真实服务器RS都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。


1.4  常用的调度算法

常用算法使用说明
RRRound Robin(轮询调度),它将请求依次分配给不同的RS节点,也就是RS节点均摊请求,这种算法比较简单,但只适合RS节点性能相差不大的情况。
WRRWighted Round Robin(加权轮询调度),根据不同RS节点的权值分配任务,权值较高的RS将优先获得任务,且分配到的连接数比权值低的要多。
DHDestination Hashing(目标地址哈希调度),以目的地址为关键字查找一个静态hash表来获得需要的RS。
SHSourse Hashing(源地址哈希调度),以源地址为关键字查找一个静态hash表来获得需要的RS。
WLCWeighted Least Connection(加权最小连接数调度),假设各台RS的权值为Wi,当前的TCP连接数为Ti,选取Ti/Wi为最小的RS作为下一个分配的RS。
LCLeast Connection(最小连接数调度),将新的连接请求发送给当前TCP连接数最小的RS节点。
LBLCLocality-Based Least Connection(基于地址的最少连接数调度),根据请求的目标IP地址找出该IP地址最近使用的RealServer,若该RealServer是可用且没超载,则将请求发送给该服务器;若服务器不存在或超载,则用最少连接数的原则选出一个可用的RS,将请求发送到该RS。
LBLCRReplicated and Locality-Based Least Connction(基于地址带重复最小连接数调度),对于某个目的地址,对应有一个RS子集。若对此地址请求,则会分配子集中连接数最小的RS;若子集中所有RS都满负荷,则从集群中选择一个连接数最小的RS,将它加入到此子集中并分配连接;若一定时间内,未做任何修改,则删除子集中负载最高的RS节点。
SEDShortest Expected Delay scheduling SED(最短期望延迟),基于WLC算法,根据Ti+n/Wi最小值作为下一个分配的RS。
NQNerver Queue Scheduling(最少队列调度),如果有台RS的连接数为0,则直接分配过去,不需要进行SED运算。


2、部署测试

2.1 环境准备

主机名IPVIP系统
Director192.168.10.51192.168.10.31CentOS release 6.9 (Final)
RS-01192.168.10.52
CentOS release 6.9 (Final)
RS-02192.168.10.53
CentOS release 6.9 (Final)


2.2 RS节点准备

两台RS均部署nginx。

# 安装pcre和openssl
yum install -y pcre-devel openssl-devel

# 编译安装nginx
useradd nginx -s /sbin/nologin -M
wget http://nginx.org/download/nginx-1.12.0.tar.gz
tar zxf nginx-1.12.0.tar.gz
cd nginx-1.12.0
./configure --user=nginx --prefix=/app/nginx-1.12.0/ --with-http_stub_status_module --with-http_ssl_module --with-http_relip_module
make && make install
ln -s /app/nginx-1.12.0 /app/nginx

# 启动nginx
/app/nginx/sbin/nginx -t
/app/nginx/sbin/nginx


2.3 安装LVS

# 安装依赖包
yum install -y libnl* popt*

# 编译安装ipvsadm
cd /opt
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar zxf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make && make install

# 加载ip_vs模块
modprobe ip_vs
lsmod|grep ip_vs

# 添加VIP
ifconfig eth0:0 192.168.10.31/24 up
route add -host 192.168.10.31 dev eth0

# 配置ipvsadm
ipvsadm -C
ipvsadm --set 30 5 60
ipvsadm -A -t 192.168.10.31:80 -s rr -p 20
ipvsadm -a -t 192.168.10.31:80 -r 192.168.10.52 -g -w 1
ipvsadm -a -t 192.168.10.31:80 -r 192.168.10.53 -g -w 1
ipvsadm -L -n


2.4 配置RS

2.4.1 配置RS-01

# 添加RS-01节点测试页面
echo "RS-01-192.168.10.52" >/app/nginx/html/index.html

# 添加路由
ifconfig lo:0 192.168.10.31/32 up
route add -host 192.168.10.31 dev lo

# arp_ignore:定义对目标地址为本地IP的ARP询问的不同应答模式。
# arp_announce:对网络接口上,本地IP地址发出的ARP回应做出相应级别的限制,回应限制。
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

2.4.2 配置RS-02

echo "RS-02-192.168.10.53">>/app/nginx/html/index.html
ifconfig lo:0 192.168.10.31/32 up
route add -host 192.168.10.31 dev lo
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


3、测试

在浏览器地址栏输入http://192.168.10.31

wKiom1loItjxxkwxAABUu__zQkg206.png-wh_50


由于浏览器有缓存及LVS默认会话保持等影响,测试的时候要多次测试且间隔一定时间才能切换到另一台,尽可能换不同的客户端测试。