728x90


[Docker][ShellScript]Nginx.LoadBalancer-Nodejs : 엔진엑스로 nodejs에 로드밸런싱하기

http://nginx.org/en/docs/http/ngx_http_upstream_module.html


로드 밸런서라는것을 아는가?

개념은 위의 그림을 보면 이해할 수 있는데 가령 WAS(Web Application Server)가 한개라고 가정해보자.

그러면 서버 한대분량의 부하(Load)만 받을 수 있을 것이다.


하지만 사용자가 늘어서 서버 두대를 사용해야할 경우 어떻게 해야할까?

그 경우에는 보통 위처럼 nginx를 앞에 두고 서버를 nginx에 연결하는 방식으로 만들 것이다.

즉 nginx는 요청을 받아서 WAS에 중계해주는 역활을 한다.

그러면 Load가 고르게(Balance)들어가게 될건데 이걸 로드밸런서라고한다.


nginx는 로드밸런서로 사용할 수 있고 이번에는 로드밸런서를 만들어보도록하자.

생각보다 만드는 방법은 간단하다.


먼저 nginx.conf를 보자.



http안에 만들어야하는데 필자는 include를 통해서 가져오게 되어있다.

안에 직접 만들어도되고 sites-enabled 안에 파일로 넣어도된다.



그럼 sites-available밑에 하나 새로 만들어준다.

이름은 뭐든 상관없는데 기존거를 없애고 새로 만들자.

필자는 이름을 default라고 하겠다.



그 다음 위에 처럼 만들어준다.


upstream 만들기


upstream <업스트림 이름> {

<로드밸런스 타입: defulat는 round-robin>

server <host1>:<port1>

...

server <host2>:<port2>

}


upstream은 강의 상류를 의미하는데 즉 위에서 아래로 뿌려주는 것을 의미한다. 반대는 downstream이다.

즉 여러군대로 뿌려주는 녀석을 upstream이라고 부른다.

위에서는 해당 nginx가 여러 서버에 분배해 주므로 upstream 서버라고 부를 수도 있다.


로드밸런스는 부하(Load)를, 즉 접속자를 분산해서 고루고루 보내주는데 어떻게 분배할지 규칙을 알아야한다.

규칙은 아무것도 적지 않는다면 라운드로빈으로 동작한다.

즉 그냥 균등하게 분배한다는 것이다.


server {

...

location <url>{

proxy_pass http://<업스트림 이름>

}

...

}


그리고 서버의 location에서 로드밸런싱할 url을 선택한다.

그 후 proxy_pass에 붙혀주면된다.


적용했으면 서버 재시작하고 다시해보자.


새로고침해서 계속 접속해보자.



왼쪽이 1번 서버고 오른쪽이 2번 서버인데 부하가 균등하게 분배되서 전달됨을 확인할 수 있다.



또 달리 자주쓰는 분배규칙(Load balancing methods)은 ip_hash이다.

이는 ip를 해시값으로 해서 나눠주는 것이다. 이렇게 분배하게되면 한번접속했던 아이피는 계속 같은 서버를 쓰게된다. 



보면 알겠지만 한쪽 서버만 주구장창 쓰는걸 확인할 수 있다.


Load balancing methods(부하 부산 규칙)


round-robin(디폴트) - 그냥 돌아가면서 분배한다.

hash - 해시한 값으로 분배한다 쓰려면 hash <키> 형태로 쓴다. ex)hash $remote_addr <- 이는 ip_hash와 같다.

ip_hash - 아이피로 해싱해서 분배한다.

random - 그냥 랜덤으로 분배한다.

least_conn - 연결수가 가장 적은 서버를 선택해서 분배, 근데 가중치를 고려함

least_time - 연결수가 가자 적으면서 평균 응답시간이 가장 적은 쪽을 선택해서분배


http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html

자세한 설명은 위를 확인하자.



그리고 파라메터를 줄 수 있다.

위의 경우 weight로 가중치를 줄 수 있는데 규칙은 유지하되 2배더 많이 사용한다는 뜻이다.

그럼 재시작해서 실행해보자



보면 알겠지만 두배 더 많이 접속한걸 확인할 수 있다.


Parameter


weight - 가중치를 둬서 더많이 가게 한다.

max_conns - 최대 연결 한계를 정한다

max_fails - 최대 실패 한계를 정한다. 최대 실패횟수에 도달하면 서버가 죽은것으로 간주한다.

fail_timeout - 시간을 정한다. 이 시간을 넘어서도 응답하지 않으면 서버가 죽은것으로 간주한다.

backup - 이 서버는 백업서버로 간주하고 다른 메인 서버가 죽었을때 동작한다. load balancing methods가 hash나 random일때는 무의미

down - 표시한 서버는 사용치 않는다.




+ Recent posts