反向代理- 提到反向代理,就不得不提到正向代理。两者虽然都是代理,但方式却截然不同。所以,在我们介绍反向代理之前,先看一下什么是正向代理
7 _- y- W {' A+ X6 @
复制代码 正向代理介绍- 正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
6 ?+ C/ S% U% j0 B% F/ v& s# S
复制代码有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。
3 S T' p, ^ ?/ I& `& j5 ~# T+ p9 ^1 n; p! X) [& d1 f B( y
0 q8 r! g) @) n! D0 N
这个过程其实和租房子很像。
; G3 _! T3 e4 O- ^" n9 _+ u( U租房子的时候,一般情况下,我们很难联系到房东,因为有些房东为了图方便,只把自己的房屋信息和钥匙交给中介了。而房客想要租房子,只能通过中介才能联系到房东。而对于房东来说,他可能根本不知道真正要租他的房子的人是谁,他只知道是中介在联系他。这里面一共有三个角色,租客(用户)、中介(代理服务器)和房东(国外网站,目标服务器)。引入中介(代理服务器)的原因是用户无法联系上房东(用户无法访问国外网站)。3 c+ T0 W. F; ] t3 \1 e
. a. f7 ^- X. q' u/ T( v$ M所以,正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器"进行交互。通过正向代理服务器访问目标服务器,目标服务器是不知道真正的客户端是谁的,甚至不知道访问自己的是一个代理(有时候中介也直接冒充租客)。
. T0 y E& c$ h- ~- H) Z- L* O/ t# V$ y
正向代理的用途$ b: Q% m: D: j/ h2 ^4 f- s
0 a3 O9 K" g7 q4 {$ k- C
反向代理介绍
* S K* Y: L* P; |. L0 @- c+ |8 ?9 E/ w, A
- 反向代理(reverse proxy):是指以代理服务器来接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就变现为一个反向代理服务器。
2 ?: S; n* x. ?, N$ ?' y2 k
复制代码 反向代理(reverse proxy):是指以代理服务器来接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就变现为一个反向代理服务器。
+ `# C _) C9 @1 {! b# e: `' M: P) x
8 d( \. I1 y$ v' ~2 y
% x# |" n; [% @+ {" o; w( i
前面提到过了,为了提升网站的各方面能力,我们一般会把多台机器组成一个集群对外提供服务。然而,我们的网站对外提供的访问入口都是一个的,比如 www.taobao.com。那么当用户在浏览器输入www.taobao.com的时候如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡在做的事情。
4 J, ~4 r* G1 f/ X& N1 p
$ [7 I! E+ P3 h3 A! W
% @( G/ n: c; \! V$ {在这七层模型种,高层次都是依赖于低层次的。层次越高,使用起来越方便。
7 J" g% A, z: d6 f( o( J1 q/ B P( [) B* `9 d6 U4 ^& x+ ]) Y
: b/ {' l+ `4 ~0 f, s! l2 a5 g1 E" r' ], U4 R: ]; k
4 i1 R4 K8 t6 Z( H* x' }4 `
" Z- y7 P) M" c8 J; h# i9 P I# V N m [+ D5 ^5 |
我们经常听到的一些和计算机网络有关的概念中:- telnet、HTTP、FTP、NFS、SMTP、DNS等属于第七层应用层的概念。
6 n2 F$ V0 a7 Y- v
; L+ r; J( U0 f4 b' V7 m7 L- TCP、UDP、SPX等属于第四层传输层的概念。7 G5 u2 Z$ z8 i2 ?* L. _) ^/ P
- * b4 n0 P; N% @4 g2 j
- IP、IPX等属于第三层网络层的概念。4 t* y: [3 b8 k" i6 m- B$ E+ C
* z* C( h& T$ a. m" I5 |4 } U- ATM、FDDI等属于第二层数据链路层的概念。* m6 [/ p( n" D" m9 G. H( G
4 E: T8 }& Y; o6 j" l) H
复制代码
4 E1 T+ @% K& N8 L1 _* V9 N& D了解了网络协议的七层模型以后,再来看看负载均衡。我们可以很明确的一点是,负载均衡是要在网络传输中做文章的。而要在网络传输过程搞事情,那么这七层模型就势必躲不开。: W! n b# C2 } B' N' ~) |
; B) z3 D& r, T+ H1 S8 T
所以,根据负载均衡技术实现在OSI七层模型的不同层次,是可以给负载均衡分类的。
) }) J% n" T' g8 G* T
+ S2 ], h" _' c- ?6 Q常见的实现方式中,主要可以在应用层、传输层、网络层和数据传输层做文章。所以,工作在应用层的负载均衡,我们通常称之为七层负载均衡、工作在传输层的我们称之为四层负载均衡。% p# A+ k% v ] n5 v) {3 G
% n* f1 y: k( O1 {* f
大致可以分为以下几种,其中最常用的是四层和七层负载均衡:
/ D0 f- Y1 \4 g* b5 G! \; Z. h
: H. d( r8 w9 u; [ W j- 二层负载均衡
$ Q3 l0 [8 b; M' U/ b( e负载均衡服务器对外依然提供一个VIP(虚IP),集群中不同的机器采用相同IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。 - 三层负载均衡4 c/ r: W. W; e
和二层负载均衡类似,负载均衡服务器对外依然提供一个VIP(虚IP),但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。 - 四层负载均衡
/ ~% p. k5 F7 A6 ^四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。 - 七层负载均衡
+ M& g" Y8 D7 U ^0 C/ V七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。' l) ~# U' n) z ~# [
. o% c7 L$ y$ J( _& a负载均衡工具
% b9 p7 z1 C7 [# R市面上有很多开源的负载均衡的工具或软件,基本都是基于前面提到的方案实现的,大多数是工作在第七层和第四层的。Nginx/LVS/HAProxy 是目前使用最广泛的三种负载均衡软件。
3 v' W3 ^' r: o: z7 ^, N
4 ^" q! E, l; D9 w T- T. `6 lLVS
7 l; A' X3 m2 SLVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
* T# d7 `$ F$ \* k5 L& ?1 v! ~6 m1 V/ _' C) Q' k# s
LVS主要用来做四层负载均衡。( u1 k) O) v/ C5 J) A* E
& V, f6 Y: W; Y8 B* K7 y: e( g
Nginx( l1 s" t: [- ]2 S7 W
Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。; X/ l1 E- ]1 t) x7 _
: F! [+ q$ i- ]+ T0 N
Nginx主要用来做七层负载均衡。1 w1 s Z/ G+ V" n' J! N5 R9 q
" S4 t% z7 t; p0 }$ i" C7 V
HAProxy
: z! I: j% k1 k) d( SHAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
. F9 l3 y( X* }: J- f4 E: _% m" r* v6 l
HAProxy主要用来做七层负载均衡。! \& Y/ r- A$ z7 E( v
: d3 R# F5 V8 d1 i负载均衡核心:负载均衡算法实现
6 K% \/ C s: D5 G. b负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候,是通过负载均衡算法来实现的。负载均衡算法,是一个负载均衡服务器的核心。- i2 L) c1 l* n' I* E( D& p( [
; N( ?* M& e+ \" }
就像电影院门口的引导员一样,他根据什么把排队人员分配到具体的入口呢?是哪个入口人少吗?还是哪个入口速度最快?还是哪个入口最近呢?如果来了一个VIP怎么办呢?: z+ x1 j# ^) E2 h+ e; b$ d8 l
( Q" N% t5 w- ?+ S, v, R
负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法。
" ^5 I* ?, J/ M5 ?+ o" q" \4 B. X' A
静态负载均衡算法包括:轮询,比率,优先权
1 ^5 n2 r6 }# N# O) G& r+ O& t* G+ o9 K m/ S; y6 k% @
动态负载均衡算法包括: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务器补充,服务质量,服务类型,规则模式。" \! w5 ~) K2 `3 F( Y) m0 _) Q& }$ |
1 k+ p: N" H6 \1 S. d! w8 {4 C
- 轮询(Round Robin):顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。
- 比率(Ratio):给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配, 直到其恢复正常。
- 优先权(Priority):给所有服务器分组,给每个组定义优先权,BIG-IP 用户的请求,分配给优先级最高的服务器组(在同一组内,采用轮询或比率算法,分配用户的请求);当最高优先级中所有服务器出现故障,BIG-IP 才将请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
- 最少的连接方式(Least Connection):传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配, 直到其恢复正常。
- 最快模式(Fastest):传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
- 观察模式(Observed):连接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
- 预测模式(Predictive):BIG-IP利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的请求。(被BIG-IP 进行检测)
- 动态性能分配(Dynamic Ratio-APM):BIG-IP 收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。
- 动态服务器补充(Dynamic Server Act.):当主服务器群中因故障导致数量减少时,动态地将备份服务器补充至主服务器群。
- 服务质量(QoS):按不同的优先级对数据流进行分配。
- 服务类型(ToS): 按不同的服务类型(在Type of Field中标识)负载均衡对数据流进行分配。
- 规则模式:针对不同的数据流设置导向规则,用户可自行。 e' a; a4 O3 B* S# K! B
) |2 h2 B @) e以上,就是目前实现负载均衡的主流算法。不同的负载均衡服务器会选择不同的算法。就像电影院和火车站可能会选用不同的引导策略一样。火车站可能会把行李少的旅客分配到一个专门的入口,可能给即将发车的旅客分派到特快入口,手持可扫描车票的用户单独分配到特殊入口等。 1 t, a# [& X' L2 W g' F
$ S) B7 i, o& l) y. {
6 |. n( U: V: ?9 e+ v$ |5 Y7 v+ f- h
3 `) m; W1 @0 Q: J9 K
) b7 a$ Z. f9 J% O
" m9 O# b' c" k2 I- {( I* V% [) w/ F
' J$ ^+ }8 T+ w7 g$ Q
|