防伪码:没有相当程度的孤独是不可能有内心的平和。
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实现负载均衡机制有四种,分别是NAT、TUN和DR以及后来经淘宝开发的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 常用的调度算法
常用算法 | 使用说明 |
RR | Round Robin(轮询调度),它将请求依次分配给不同的RS节点,也就是RS节点均摊请求,这种算法比较简单,但只适合RS节点性能相差不大的情况。 |
WRR | Wighted Round Robin(加权轮询调度),根据不同RS节点的权值分配任务,权值较高的RS将优先获得任务,且分配到的连接数比权值低的要多。 |
DH | Destination Hashing(目标地址哈希调度),以目的地址为关键字查找一个静态hash表来获得需要的RS。 |
SH | Sourse Hashing(源地址哈希调度),以源地址为关键字查找一个静态hash表来获得需要的RS。 |
WLC | Weighted Least Connection(加权最小连接数调度),假设各台RS的权值为Wi,当前的TCP连接数为Ti,选取Ti/Wi为最小的RS作为下一个分配的RS。 |
LC | Least Connection(最小连接数调度),将新的连接请求发送给当前TCP连接数最小的RS节点。 |
LBLC | Locality-Based Least Connection(基于地址的最少连接数调度),根据请求的目标IP地址找出该IP地址最近使用的RealServer,若该RealServer是可用且没超载,则将请求发送给该服务器;若服务器不存在或超载,则用最少连接数的原则选出一个可用的RS,将请求发送到该RS。 |
LBLCR | Replicated and Locality-Based Least Connction(基于地址带重复最小连接数调度),对于某个目的地址,对应有一个RS子集。若对此地址请求,则会分配子集中连接数最小的RS;若子集中所有RS都满负荷,则从集群中选择一个连接数最小的RS,将它加入到此子集中并分配连接;若一定时间内,未做任何修改,则删除子集中负载最高的RS节点。 |
SED | Shortest Expected Delay scheduling SED(最短期望延迟),基于WLC算法,根据Ti+n/Wi最小值作为下一个分配的RS。 |
NQ | Nerver Queue Scheduling(最少队列调度),如果有台RS的连接数为0,则直接分配过去,不需要进行SED运算。 |
2、部署测试
2.1 环境准备
主机名 | IP | VIP | 系统 |
Director | 192.168.10.51 | 192.168.10.31 | CentOS release 6.9 (Final) |
RS-01 | 192.168.10.52 | CentOS release 6.9 (Final) | |
RS-02 | 192.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
由于浏览器有缓存及LVS默认会话保持等影响,测试的时候要多次测试且间隔一定时间才能切换到另一台,尽可能换不同的客户端测试。