도리도리
442
2021-07-19 00:03:37
6
252

db병목현상 해결방법 메시지 큐 도입하면 해결될까요 ?


평소에는 문제가 없는데 사용자가 몰릴경우 db에 부하가 발생합니다.

데이터 등록되는 간격이 0.003초 정도로 동시에 insert/select 가 발생하는데

그로인해 데이터 꼬이는 문제도 같이 발생합니다


서버 cpu/메모리는 아무 이상 없고 쿼리 실행속도만 현저히 느려지는데 

이런 문제를 해결할라면 요청사항을 큐에 담아서 순차적으로 처리하면 문제가 해결될까요 ?

큐도 종류가 많던데 어떤 메시지 큐를 이용하는게 좋을지 조언 부탁드립니다.


0
  • 답변 6

  • 신히
    696
    2021-07-19 00:32:16

    이상하네요.. 과도한 DB 사용시에는 CPU 사용률이 올라갈 수 밖에 없는데요...

    아니면 INSERT, UPDATE가 과도하게 발생해서 디스크 사용률이 올라간다거나요.

    실행속도만 느려진다면 혹시 DB pool 이 너무 적은거 아닌가요?

    병렬처리가 가능하도록 pool의 개수와 동시에 처리할 수 있는 서비스 개수를 늘려보세요.

  • 팩트폭행범
    2k
    2021-07-19 00:34:22

    원인이 너무 많은데요 db pool도 확인해보시고 db서버가 따로 있다면 할당된 메모리도 확인해보시고 그 두개가 문제 없다면 그때 소스를 까보세요 

  • 도리도리
    442
    2021-07-19 00:45:31 작성 2021-07-19 00:45:58 수정됨

    사용자가 순간 집중되다보니 insert 쿼리가 과도하게 발생하기는 했습니다.

    insert 쿼리에 등록된 데이터도 많기도 했었구요

    db pool 문제도 있긴했지만 수정 이후에 부하 테스트 시 제약조건 위배(FK) 지속적으로 발생하기도 하고 데이터가 꼬이는 문제도 발생했습니다.


    그래서 queue 까지 접근하게 된겁니다. ㅠ





  • 해리아범
    280
    2021-07-19 08:25:16

    메세지큐를 선택하는 게 과연 좋은 해결책인지 모르겠네요. 말씀하신 상황에선 아직 원인분석이 덜 된 것 같기도 한데요. 커넥션풀, 캐시, 쿼리 다 봐야할 것 같습니다

    100개 쓰레드에서 메세지큐로 쏘고 100개 쓰레드에서 받아서 처리하면 기존과 동일한 문제가 발생하겠죠? 받는 쪽을 극단적으로 줄이면 일단 그런 문제는 사라지겠지만 전체적인 성능이 많이 떨어지겠죠?

    마음 급하신 건 이해하겠으나 단순히 하나의 만병통치약은 없습니다. 원인을 다시 분석하고 대안들을 연결해서 생각해보기면 어떨까요?

  • 초무쿤
    6k
    2021-07-19 08:52:22 작성 2021-07-19 19:09:00 수정됨

    메시지큐는 해결방법이 아닐겁니다.

     (해결도 안될뿐더러 또다른 이슈 양산할 가능성이 다분)

    0. 커넥션 풀 확인(capacity는 적정한지.leack은 없는지)

    1. 일단 부하발생하는 SQL 확인 및 튜닝

    2. 어플리케이션 캐시 도입 (공통코드라던지 자주 변경이 없음에도 계속 조화되는 부분, 왜민한 DAO프레임워크에는 캐시기능이 있음)

    3. DB서버 설정 및 커널 패라미타 튜닝 (제일 마지막)


    ps mysql이고 inser량이 많은 경우면 innodb_flush_log_at_trx_commit  옵션도 한번 타협해볼만합니다. (살을 주고 뺘를 취하는 전략이라 보통은 안씀)

  • 쿠잉
    3k
    2021-07-19 09:29:58 작성 2021-07-19 09:30:19 수정됨


    서버 cpu/메모리는 아무 이상 없고 
    쿼리 실행속도만 현저히 느려지는데 


    db가 일을 하는 on cpu가 아닌것 같습니다

    그리고 댓글에서 fk  제약조건을 언급하신부분을 보면 db의 문제보다 트랜잭션 처리에서 문제가 있어보이네요

    큐로 해결 할것은 아닌것  같네요


  • 로그인을 하시면 답변을 등록할 수 있습니다.