CDN 스케줄 러 HAProxy, Nginx, Varnish

6263 단어 CDN
CDN 기능 은 다음 과 같다. 1. 전체 네트워크 IP 를 여러 개의 IP 세그먼트 그룹 으로 나 누고 그룹의 근 거 는 보통 운영 자 나 지역 이다. 같은 네트워크 환경 에서 사용 자 를 같은 그룹 에 모 으 는 것 이 목적 이다.2. CDN 서버 들 의 네트워크 와 용량 에 따라 어떤 CDN 서버 가 어떤 IP 세그먼트 그룹 에 적합 한 지 확인한다.3. 상기 두 단계 에서 얻 은 결론 에 따라 사용자 로 하여 금 그의 서버 에 가장 적합 한 서 비 스 를 받 게 한다.
즉, 사용자 의 서로 다른 소스 IP 에 따라 사용자 요청 을 서로 다른 CDN 서버 로 재 설정 하 는 것 이다.그렇다면 어떻게 이 뤄 질 까?
스마트 DNS 는 방법 중 하나 로 안정 적 이 고 효과 적 이다.그러나 적어도 두 가지 환경 에서 우 리 를 완전히 만족 시 키 지 못 한다. 1. 특별한 스케줄 이 필요 할 때.대부분의 DNS 서버 는 DNS 확장 프로 토 콜 을 지원 하지 않 기 때문에 사용자 의 실제 IP 를 받 지 못 하고 Local DNS 에 따라 만 스케줄 링 할 수 있 습 니 다.2. 방문 이 특히 잦 을 때.매번 스케줄 링 이 DNS 를 한 번 촉발 하기 때문에 요청 이 밀집 되면 DNS 요청 자체 가 가 져 오 는 비용 도 상응 하 게 커진다.3. 서버 의 대역 폭 용량, 연결 수, 부하 상황, 즉석 여부 에 따라 조정 해 야 할 때.DNS Server 에 CDN 노드 서버 정보 가 없 기 때문에 이런 스케줄 링 은 어려워 질 수 있다.
이 럴 때 저 희 는 1. 사용 자 를 한 대 또는 몇 대의 통 일 된 서버 로 먼저 안내 할 수 있 습 니 다.2. 사용자 의 실제 IP 를 받 아 서비스 서버 를 계산 하도록 합 니 다.3. HTTP 302 또는 다른 방식 으로 사용 자 를 최종 서버 로 지정 합 니 다.
사용자 가 먼저 방문 한 몇 대의 서버 에 배치 되 어 있 으 며, IP 를 찾 은 후에 사용자 가 요청 한 소프트웨어 를 다시 지정 합 니 다. 우 리 는 그것 을 '스케줄 러' 라 고 부 릅 니 다.
HAProxy 구현: HAProxy 는 0.0.0.1 - 0.8255.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 형 을 정리 합 니 다:
# head geo.txt
"1.0.0.0","1.0.0.255","AU"
"1.0.1.0","1.0.3.255","CN"
"1.0.4.0","1.0.7.255","AU"
"1.0.8.0","1.0.15.255","CN"
"1.0.16.0","1.0.31.255","JP"
"1.0.32.0","1.0.63.255","CN"
"1.0.64.0","1.0.127.255","JP"
"1.0.128.0","1.0.255.255","TH"
"1.1.0.0","1.1.0.255","CN"
"1.1.1.0","1.1.1.255","AU"

d > HAProxy 가 인식 하 는 IP 세그먼트 목록 출력:
# cut -d, -f1,2,5 geo.txt | ./iprange | head
1.0.0.0/24 "AU"
1.0.1.0/24 "CN"
1.0.2.0/23 "CN"
1.0.4.0/22 "AU"
1.0.8.0/21 "CN"
1.0.16.0/20 "JP"
1.0.32.0/19 "CN"
1.0.64.0/18 "JP"
1.0.128.0/17 "TH"
1.1.0.0/24 "CN"
1.1.1.0/24 "AU"

e > 관리 하기 쉬 운 목적 으로 통 합 된 IP 세그먼트 를 같은 파일 에 분류 합 니 다.
# cut -d, -f1,2,5 geo.txt | ./iprange | sed 's/"//g' | awk -F' ' '{ print $1 >> $2".subnets" }'
# ls *.subnets
A1.subnets  AX.subnets  BW.subnets  CX.subnets  FJ.subnets  GR.subnets  IR.subnets  LA.subnets  ML.subnets  NF.subnets  PR.subnets  SI.subnets  TK.subnets  VE.subnets
# cat AU.subnets 
1.0.0.0/24
1.0.4.0/22
1.1.1.0/24

f > 이 파일 들 을 같은 폴 더 아래 에 놓 습 니 다. / etc / haproxy / conf / 를 예 로 들 면.
2. HAProxy 를 올 바 르 게 설정 하여 이 IP 세그먼트 를 규칙 으로 올 바 르 게 조정 합 니 다.다음은 haproxy. cfg 의 예 입 니 다.설정 후 Haproxy 를 다시 시작 하면 됩 니 다.
global
    log         127.0.0.1 local2 debug

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     8000
    user        haproxy
    group       haproxy
    daemon

    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 8000

frontend  main *:5000
    acl geo_A1 src -f /etc/haproxy/conf/A1.subnets
    acl geo_AX src -f /etc/haproxy/conf/AX.subnets
    acl geo_BW src -f /etc/haproxy/conf/BW.subnets
    acl geo_CX src -f /etc/haproxy/conf/CX.subnets
    acl geo_FJ src -f /etc/haproxy/conf/FJ.subnets

    ...

    reqrep ^([^\ ]*)\ /(.*)\ HTTP    \1\ /\2&ipfrom=A1\ HTTP if geo_A1
    reqrep ^([^\ ]*)\ /(.*)\ HTTP    \1\ /\2&ipfrom=AX\ HTTP if geo_AX
    reqrep ^([^\ ]*)\ /(.*)\ HTTP    \1\ /\2&ipfrom=BW\ HTTP if geo_BW
    reqrep ^([^\ ]*)\ /(.*)\ HTTP    \1\ /\2&ipfrom=CX\ HTTP if geo_CX
    reqrep ^([^\ ]*)\ /(.*)\ HTTP    \1\ /\2&ipfrom=FJ\ HTTP if geo_FJ

    ...

    default_backend             static

backend static
    server      static 127.0.0.1:6081 check

Nginx 구현: Nginx 는 핵심 모듈 HttpGeoModule (http://wiki.nginx.org/HttpGeoModule) 의 협조 하에 스케줄 링 을 실현 한다.
http{

...

geo $useriprang {
    ranges;
    default a;
    0.0.0.1-0.8.255.255 a;
    0.9.0.0-0.255.255.255   a;
    1.0.0.0-1.0.0.255   a;
    1.0.1.0-1.0.1.255   b;
    1.0.2.0-1.0.3.255   b;
    1.0.4.0-1.0.7.255   a;
    ...
    223.255.252.0-223.255.253.255   c;
    223.255.254.0-223.255.254.255   a;
    223.255.255.0-223.255.255.255   a;
}

upstream backend {
    server 127.0.0.1:81;
}

server {
    listen       80;
    client_max_body_size 10240m;

    location / {
        proxy_redirect off;
        proxy_pass http://backend$request_uri&useriprang=$useriprang;
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        proxy_cache cache_one;
        proxy_cache_key $host:$server_port$uri$is_args$args;
        expires  5s;
    }

}

...

}

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 는 뚜렷 한 성능 저하 가 나타 나 고 나머지 두 가 지 는 이런 문제 가 없다.
다른 본 고 에서 사용 한 소프트웨어 버 전 은 다음 과 같다. HAProxy 1.4.22, Nginx 1.2.9, Varnish 3.0.4.HAProxy 와 Varnish 는 모두 현재 의 최신 버 전이 다.본문 에 참고 가 있다http://blog.exceliance.fr/2012/07/02/use-geoip-database-within-haproxy/다음으로 이동:
http://blog.yikuyiku.com/?p=3851
원본 주소:http://www.ttlsa.com/web/the-cdn-scheduler-nginx-haproxy-varnish/

좋은 웹페이지 즐겨찾기