CDN调度器HAProxy、Nginx、Varnish

CDN功能如下:

1、将全网IP分为若干个IP段组,分组的依据通常是运营商或者地域,目的是让相同网络环境中的用户聚集到相同的组内;

2、依据CDN服务器们的网络和容量,确定哪些CDN服务器适合服务哪些IP段组;

3、根据以上两步得到的结论,让用户去最适合他的服务器得到服务。

说白了,就是根据用户不同的来源IP把用户请求重定向到不同的CDN服务器上去。

那么,如何实现呢?

智能DNS是办法之一,稳定可靠且有效。

但至少在两个环境下它不能完全满足我们:

1、需要特别精细的调度时。由于大多数DNS Server不支持DNS扩展协议,所以拿不到用户的真实IP,只能根据Local DNS来调度。

2、访问特别频繁时。由于每次调度都将触发一次DNS,如果请求变得密集,DNS请求本身带来的开销也会相应变大;

3、需要根据服务器的带宽容量、连接数、负载情况、当机与否来调度时。由于DNS Server没有CDN节点服务器的信息,这种调度会变得困难。

这时候我们可以:

1、将用户先行引导到某一台或几台统一的服务器上去;

2、让它拿到用户的真实IP,计算出服务他的服务器;

3、通过HTTP302或其它方式把用户定位到最终服务器上。

部署在用户先访问到的那几台服务器上,负责定位IP然后重定向用户请求的那个软件,我们叫它“调度器”。

HAProxy实现:

HAProxy不支持形如0.0.0.1-0.8.255.255 cn的IP段表示方法,只支持1.1.4.0/22 “CN”的IP段表示方法。

1、我们需要先把IP段转化成它认识的方式;

a> 下载iprang.c或者iprang.c本地镜像;

b> 编译gcc -s -O3 -o iprange iprange.c;

c> 整理IP段列表geo.txt形如:

1

2

3

4

5

6

7

8

9

10

11

# head geo.txt

d> 输出HAProxy认识的IP段列表:

1

2

3

4

5

6

7

8

9

10

11

12

# cut -d, -f1,2,5 geo.txt | ./iprange | head

e> 便于管理的目的,将整合后的IP段归类到同一个文件中:

1

2

3

4

5

6

7

# ls *.subnets

subnets

# cat AU.subnets

24

22

24

f> 把这些文件放到同一个文件夹下,我们以/etc/haproxy/conf/为例。

2、正确配置HAProxy以这些IP段为规则正确调度;

下面是一个haproxy.cfg的例子。配置好后重启Haproxy即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

global

debug

haproxy

pid

8000

haproxy

haproxy

daemon

stats

defaults

http

global

httplog

dontlognull

close

8

redispatch

3

10s

1m

10s

1m

1m

10s

10s

8000

5000

subnets

subnets

subnets

subnets

subnets

.

geo_A1

geo_AX

geo_BW

geo_CX

_FJ

.

static

static

check

Nginx实现:

Nginx可以在核心模块HttpGeoModule(http://wiki.nginx.org/HttpGeoModule)的配合下实现调度:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

{

.

{

;

;

;

;

;

;

;

;

.

;

;

;

}

{

;

}

{

;

;

{

;

//backend$request_uri&useriprang=$useriprang;

;

;

;

;

}

}

.

}

Varnish实现:

Varnish则有两个插件可以实现调度:

https://github.com/cosimo/varnish-geoip (Last updated: 28/05/2013)

https://github.com/meetup/varnish-geoip-plugin (Last updated: 2010)

性能问题

如上所述,使用Haproxy、Nginx、Varnish都能快速实现这个功能。

其中Nginx和Varnish使用了二分法在IP表中定位用户IP,而Haproxy是逐条过滤。

所以在IP分得较细,IP段组较多(归类后超过1000组)时,Haproxy会出现明显的性能衰减,其余两者没有这个问题。

其它

本文使用的软件版本如下:

HAProxy1.4.22,Nginx1.2.9,Varnish3.0.4。

HAProxy和Varnish都是目前的最新版本。

本文有参考http://blog.exceliance.fr/2012/07/02/use-geoip-database-within-haproxy/

转自:http://blog.yikuyiku.com/?p=3851