지난 번에 Nginx를 이용해 로드밸런스 서버를 만들어 트래픽을 분산시키기에서 로드밸런스 서버 1대와 어플리케이션 서버 2대를 설정해서 Lionz프로젝트에 로드밸런싱을 적용해봤습니다.
점차 부하를 늘려보며 어디까지 버틸 수 있을까 테스트를 해보려고 합니다.
- 600명 (에러x)
- 1000명 (에러O)
- Grafana 모니터링
그래프를 보면 600명(vus=600)으로 보냈을 때 두 서버의 CPU이용률이 50%정도를 보였고
1000명(vus=1000)으로 보냈을 때 두 서버의 CPU이용률이 약 70%정도를 보이면서 에러가 발생했습니다.
lionz-4라는 이름으로 서버를 한 대 추가적으로 생성했습니다.
이어서 바로 내도메인.한국에서 도메인을 연결해줬습니다.
cd /etc/nginx/sites-enabled
을 입력해 sites-enabled폴더로 이동하고 그 안에 만들어놨던 myapp이라는 파일을 수정했습니다.
upstream 원하는이름 {
//원하는 알고리즘
server 111.111.111.111:8080;
server 222.222.222.222:8080;
server 333.333.333.333:8080;
}
server {
listen 80;
location / {
proxy_pass http://원하는이름;
}
}
그냥 server 새로만든서버 IP:8080;
만 추가해주면 됩니다!
vi $(brew --prefix)/etc/prometheus.yml
를 입력해 prometheus.yml로 이동합니다.
target부분에 새로 만든 서버의 도메인인 hanzu.n-e.kr를 추가해줍니다.
그리고 재시작해줍니다.
localhost:9090을 들어가 확인해보니 아주 잘 된 것 같습니다!
Grafana도 들어가보니 제대로 추가가 된 것 같습니다!
k6 run --vus 1000 --duration 30s scenario.ts
오.. 1000명으로 설정하고 보냈는데 처음으로 에러가 안뜨고 마무리 되었습니다.
k6로 저렇게 명령어를 입력하면 test.csv라는 파일이 만들어져서 하나하나 요청들의 상태들 확인할 수 있는데 전부 True
로 정상적으로 보내진 것을 확인했습니다.
Grafana로 한 번 볼까요?
보시면 서버 한 대가 좀 많이 무리를 하긴 했지만 그래도 나머지 두 서버도 열심히 일한 것 같습니다. 그러니까 에러가 안났겠죠?
방금 부하를 줬을 때 서버들이 견디긴 했지만 서버 한 대가 많이 무리를 했어서 약간 신경이 쓰입니다.
여러 방법들을 적용해서 관찰해보겠습니다.
- 로드밸런싱 알고리즘이란?
-> 로드밸런스 서버가 애플리케이션 서버들에게 트래픽을 어떻게 분배할지를 결정해야하는데 그 때 결정할 수 있는 알고리즘들이 여러 개 존재합니다.
- 모든 서버에 순서대로 요청을 분배하는 방식입니다.
- 간단하고 균등하게 트래픽을 분산합니다.
- 서버의 상태에 관계없이 동작하기 때문에 서버들의 리소스나 성능 차이를 고려하지 않습니다.
upstream 원하는 이름 {
server 111.111.111.111:8080;
server 222.222.222.222:8080;
server 333.333.333.333:8080;
}
위와 같이 아무것도 설정하지 않으면 기본으로 라운드 로빈으로 실행이됩니다.
아까 위에서 봤던 결과가 라운드 로빈일 때 입니다.
결과 (라운드 로빈)
- 현재 연결 수가 가장 적은 서버로 트래픽을 보내는 방식입니다.
- 서버들의 리소스 사용량을 고려하여 트래픽을 분산합니다.
- 서버들의 연결 수가 다르게 분포되어 있을 때 효과적입니다.
upstream 원하는 이름 {
least_conn; // Least Connections 알고리즘
server 111.111.111.111:8080;
server 222.222.222.222:8080;
server 333.333.333.333:8080;
}
- 부하
- 결과 (최소 연결 수)
똑같이 1000명으로 설정해서 보낸건데 CPU사용률이 제일 높은게 25%밖에 안되고 되게 균형있게 부하를 부담한 것 같은 느낌입니다.
트래픽을 무작위로 분배하는 알고리즘입니다.
upstream 원하는 이름 {
random; // Random 알고리즘
server 111.111.111.111:8080;
server 222.222.222.222:8080;
server 333.333.333.333:8080;
}
- 부하
역시 전송은 계속 잘 되고있습니다.
- 결과 (Random)
세 대의 서버가 정말 균등하게 트래픽을 분산받고 있는 모습입니다.
제가 볼 땐 현재까지는 Random이 가장 이상적인 것 같지만 Random알고리즘은 서버의 상태를 고려하지 않고 진행하기 때문에 실제로 적용하기에는 무리가 있어보인다는 생각입니다!
아마 실제로 제가 많은 사람들이 이용하는 서비스를 만들게 된다면 로드밸런싱 알고리즘은 Least Connections (최소 연결 수)로 할 것 같습니다.
부하를 적게 받고 있는 서버에 트래픽을 보내기 때문에 꽤나 이상적으로 트래픽이 분산이 되고 서버의 상태를 고려하기 때문에 서버가 망가지면 트래픽을 보내지 않기 때문에 안전할 것 같다는 생각을 하게 됐습니다.