[Nginx] 로드밸런싱 개념 및 구축 - 2

김지원·2021년 8월 17일
0

nginx

목록 보기
3/5
post-thumbnail

nginx.conf의 파일을 바꿔줬지만 동시 트래픽을 감당하기 위해서는 여러 상황을 고려해봐야한다.

동시 요청 트래픽 감당

nginx 설정 이후 성능 테스트를 해본 결과 동시 접속자 수를 늘려보면 에러율이 꽤 높게 발생하였다...

필자는 성능 테스트 툴 중에 Apache Jmeter를 사용했다.
사용방법은 블로그에 정리해두었으니 보고 참고해도 좋다.
JMeter사용법

이 문제점은 Nginx 자체 문제가 아니라 클라우드 컴퓨터 스펙 문제이기 때문에 자신의 클라우드 컴퓨터 스펙에 대한 이해와 개발 환경에 대한 이해가 필요하다.

필자의 개발 환경

  • CPU Core 2개, RAM 4G 컴퓨터를 서버로 사용
  • DB: mariaDB
  • API 개발 환경: Node.js

Node.js에서의 MariaDB 설정

mariaDB

여기서 connectionLimit이 중요하다!
해당 설정은 MariaDB에서 동시에 처리하고자 허용하는 요청의 개수를 뜻한다.
사진에는 300이지만 필자는 500으로 정해주었다.
그렇게 되면 동시에 500개까지 Connection을 할 수 있게 된다.

🤔 Connection??

API서버에서 DB에 SQL질의를 할 때마다 열리는 것이 Connection이다.
SQL질의를 할 때 1개씩 사용된다.

이를 이해하기 위해서 Pool이란 것을 이해해야한다.
Pool은 Node와 MariaDB가 연결되는 방식인데
이 Pool은 각 Connection을 담고 있는 공간으로 볼 수 있다.

👷‍♂️ 주의할 점

let conn;
try {
  conn = await mariadb.getConnection(); //pool connection
  const query = `SELECT * FROM persons`;
  
  const result = await conn.query(query);
  return result;
} catch (err) {
  throw err;
} finally {
  conn?.release(); // connection => pool
}

질의 SQL문을 만든다면 이렇게 만들게 될텐데 pool을 Connection했다면 끝날 때 release()를 해줘야한다.

반환 하지 않게 된다면 사용가능한 Connection이 -1개로 줄어들게 된다. 그래서 모든 SQL 질의에서 release()를 해줘야 한다.

Too many connections 에러!

그리고 Nginx의 설정이 mariadb보다 높게 되어 있다면 Too many connections 이슈를 보고 설정을 바꿔보자

Nginx 설정

  • 데이터의 흐름
    client => Nginx => WAS(node.js) => DB (MySQL)

    Node와 MySQL이 500개의 요청을 처리할 수 있도록 했으니 앞단인 Nginx에서도 500개를 처리할 수 있도록 해야한다.

    worker_connections 값 변경

  1. 설정 파일 들어가기

    nano /etc/nginx/nginx.conf

  2. worker_connections 값 변경

  • event{...} 지시자 안에 있다.
  • worker_processes: core 모듈 설정
    • 몇 개의 워커 프로세스를 생성할 것인지 지정하는 지시어
      🕵️‍♀️ 1이면 하나의 코어만으로 요청을 처리한다는 뜻
    • 필자는 auto로 두었다.
  • worker_connections: Worker가 실제로 처리할 Connection의 갯수이다.
  • 필자는 1024로 하였다. => Worker당 1024개의 연결을 처리하겠다는 의미

✨ 최대 접속자 수 = worker_processes * worker_connections

이렇게 되면 동시 요청시 문제없이 처리할 수 있게 된다.


참고

profile
backend-developer

0개의 댓글