웹 서버 와 데이터베이스 의 부하 균형 및 역방향 프 록 시 이해

그러나 이 사이트 의 평균 초당 요청 이 200 여 번 이 라면 문 제 는 다음 과 같다.이것 은 이미 가장 좋 은 웹 서버 인 데 나 는 어떻게 해 야 합 니까?같은 상황 도 데이터베이스 에 적용 된다.이런 문 제 를 해결 하려 면 부하 균형 의 원 리 를 알 아야 한다.
웹 서버 는 부하 균형 을 어떻게 합 니까?
웹 서버 를 위해 부하 균형 을 적용 하 는 비교적 많은 방식 은 DNS 리 셋 과 리 버스 에이전트 이 며,다른 방식 의 원리 도 매우 유사 하 다.
우 리 는 바 이 두 를 여러 번 핑 하면 답장 의 IP 가 다 를 수 있 습 니 다.예 를 들 어 첫 번 째 결 과 는 다음 과 같 습 니 다.

Ping baidu.com [220.181.111.86] 32 :
220.181.111.86 : =32 =27ms TTL=51
220.181.111.86 : =32 =27ms TTL=51
220.181.111.86 : =32 =27ms TTL=51
조금 있다 가 다시 핑 을 하면 결 과 는 달라 질 수 있 습 니 다.

Ping baidu.com [220.181.111.85] 32 :
220.181.111.85 : =32 =27ms TTL=51
220.181.111.85 : =32 =27ms TTL=51
220.181.111.85 : =32 =29ms TTL=51
nslookup 명령 을 사용 하면 여러 개의 ip 이 baidu.com 과 대응 하 는 것 을 볼 수 있 습 니 다.여기 서 사용 하 는 것 은 DNS 리 셋 기술 이다.원 리 는 매우 간단 하 다.DNS 서버 는 특정한 도 메 인 이름 에 대응 하 는 여러 개의 IP 를 저장 하고 클 라 이언 트 가 DNS 요청 을 할 때 DNS 서버 는 알고리즘 에 따라 IP 를 클 라 이언 트 에 게 보낸다.보 내 는 것 은 보통 IP 주소 집합 이지 만 매번 의 정렬 이 다 릅 니 다.첫 번 째 IP 는 201.11.11.1 이 고 두 번 째 IP 는 201.11.11.2 일 수 있 습 니 다.클 라 이언 트 가 사용 하 는 것 은 첫 번 째 IP 입 니 다.쉽게 말 하면 클 라 이언 트 가 매번 가 져 오 는 도 메 인 이름 의 IP 가 다 를 수 있 습 니 다.서로 다른 IP 는 서로 다른 웹 서버 에 대응 하지만,이러한 웹 서버 의 내용 은 같 아야 한다.
우 리 는 아래 그림 에서 역방향 대 리 를 이해한다.
클 라 이언 트 가 역방향 프 록 시 에 HTTP 요청 메 시 지 를 보 냅 니 다.(이 사이트 에 도 메 인 이름 이 있 으 면 도 메 인 이름 의 IP 는 역방향 프 록 시 에 있 는 외부 네트워크 IP)역방향 프 록 시 는 요청 메 시 지 를 웹 서버 에 무 작위 로 보 냅 니 다.웹 서버 는 HTTP 응답 메 시 지 를 역방향 프 록 시 에 보 내 고 이 메 시 지 를 클 라 이언 트 에 게 되 돌려 줍 니 다.이렇게 간단 한 이상 우 리 는 간단 한 역방향 대 리 를 실현 하 는 데 착수 할 수 있다.
Liux mint 15 에 apache 와 nginx 서버 를 설치 하고 apache 의 80 포트 의 문서 루트 디 렉 터 리 에 파일 index.html 를 만 듭 니 다.내용 은 다음 과 같 습 니 다.

<html>
<head>
<title>index</title>
</head>
<body>
<h1>hello, i am apache</h1>
</body>
</html>
nginx 의 8080 포트 의 문서 루트 디 렉 터 리 에 파일 index.html 를 만 듭 니 다.내용 은 다음 과 같 습 니 다.

<html>
<head>
<title>index</title>
</head>
<body>
<h1>hello, i am nginx</h1>
</body>
</html>
원본 파일 simplereverse_proxy.py,내용 은 다음 과 같 습 니 다.

#!/usr/bin/python
#-*-encoding:utf8-*-
'''

'''
import BaseHTTPServer
import urllib2
HOST_NAME = '127.0.0.1'
PORT_NUMBER = 8081  #
SERVER_URL=('http://127.0.0.1:80','http://127.0.0.1:8080')
server_choice = 0
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(s):
        """response to a GET request"""
        global server_choice
        url = SERVER_URL[server_choice]
        print url
        server_choice = (server_choice + 1) % 2
        headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
        try:
            req = urllib2.Request(url, None, headers)
            response = urllib2.urlopen(req)
            html = response.read()
            #print html
            s.send_response(200);
            s.send_header("Content-type", "text/html")
            s.end_headers()
            s.wfile.write(html)
        except:
            s.send_response(404);
            s.send_header("Content-type", "text/html")
            s.end_headers()
            s.wfile.write('<h2>404</h2>')
if __name__ == '__main__':
    server_class = BaseHTTPServer.HTTPServer
    httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
apache,nginx 를 시작 하고 simple 을 실행 합 니 다.reverse_proxy.py。우 리 는 브 라 우 저 에서http://127.0.0.1:8081을 열 었 습 니 다.우 리 는 볼 수 있 습 니 다.새로 고침 하면 볼 수 있 습 니 다.그리고 simplereverse_proxy.py 는 다음 과 같은 정보 출력 이 있 습 니 다.

bash >> ./simple_reverse_proxy.py
http://127.0.0.1:80
127.0.0.1 - - [05/Sep/2013 19:25:02] "GET / HTTP/1.1" 200 -
http://127.0.0.1:8080
127.0.0.1 - - [05/Sep/2013 19:25:43] "GET / HTTP/1.1" 200 -
물론 오픈 소스 세계 에는 이미 우수한 역방향 프 록 시 서버 가 많 습 니 다.예 를 들 어 Nginx.
역방향 대리 의 원 리 를 이해 하면 더 복잡 한 구조 도 쉽게 이 루어 진다.
데이터베이스 부하 균형
대형 사이트 에 대해 데이터베이스 시스템 은 대량의 읽 기 요청,쓰기 요청 을 부담 할 수 없 는 상황 에 직면 하 게 될 것 이다.그렇다면 우 리 는 어떻게 부하 균형 을 통 해 높 은 병발 의 읽 기와 쓰기 요 구 를 실현 할 수 있 을 까?
이 중 하 나 는 읽 기와 쓰기 분리 입 니 다.데이터베이스 서버 에 대한 읽 기와 쓰기 요청 을 읽 기 요청 과 쓰기 요청 으로 나 누 어 하나의(또는 여러 개)데이터베이스 서버 에 쓰기 요청 을 보 내 고 다른(또는 여러 개)서버 에 읽 기 요청 을 보 내 면 응답 시간 을 뚜렷하게 향상 시 킬 수 있 습 니 다.그러나 그 중 하 나 는 여러 데이터베이스 서버 의 데이터 가 일치 해 야 한 다 는 점 이다.걱정 하지 마라.많은 데이터베이스 시스템 이 이미 이 기능 을 실현 했다.다음은 구조 예시 이다.
위의 그림 에서 사실은 충돌 문 제 를 쓰 고 다음 과 같은 장면 을 상상 한다.
이 시스템 은 특정한 사이트 의 사용자 등록 정 보 를 저장 하 는 데 사 용 됩 니 다.이 사 이 트 는 사용자 이름 이 같 지 않 고 사용자 이름 을 유일한 메 인 키 로 하기 때문에 단일 데이터 베이스 구조 에서 업무 처리 와 관련 되 어야 합 니 다.현재 이 부하 균형 데이터베이스 구조 에서 사용자 A 는 사용자 이름 을 xiaoming 으로 등록 하려 고 합 니 다.이 쓰기 요청 은 db server 1 에 배분 되 었 습 니 다.이와 함께 사용자 B 역시 사용자 이름 xiaoming 을 등록 합 니 다.db server 1 에 요청 을 썼 다 면 문제 가 발생 하지 않 았 을 것 입 니 다.그러나 db server 2 에 할당 된다 면?두 db server 는 각각 다른 사용자 의 사용자 이름 이 같은 사용자 정 보 를 저장 합 니 다!해결 방법 은 매우 간단 합 니 다.요청 한 분 배 는 무 작위 알고리즘 을 사용 할 수 없습니다.예 를 들 어 등 록 된 사용자 이름 이니셜 이 x 일 때 쓰기 요청 은 각 db server 2 를 분배 하고 다른 쓰기 요청 은 db server 1 에 일률적으로 분배 해 야 합 니 다.
또 다른 문 제 는 이런 구 조 는 개발 응용 에 큰 유연성 을 제공 했다.바로 이런 구 조 는 일부 ORM 구조 에 적용 되 지 않 고 해결 방법 은 바로 이 구조 에'데이터 베이스 대리'를 더 하 는 것 이다.예 를 들 어 MySQL 에 대해 서 는 MySQL Proxy 와 같은 솔 루 션 이 있 습 니 다.

좋은 웹페이지 즐겨찾기