...

RDBMS (MySQL vs PostgreSQL) 비교 본문

백엔드

RDBMS (MySQL vs PostgreSQL) 비교

gi2 2024. 12. 1. 15:57

RDBMS


MySQL vs PostgreSQL

MySQL은 높은 읽기/쓰기 성능에 강점이 있기 때문에 Web Application이나 중소 규모의 DB 처리에 용이하고, PostgreSQL은 복잡한 쿼리 처리, 데이터 무결성 측면에 강점이 있기 때문에 복잡한 대규모 분석 작업과 DB 모델 사용에 적합하다.

 

[1] 각 DB의 장단점

MySQL

  • 장점
    • 높은 읽기쓰기 성능 + 단순 쿼리에 강점
    • 광범위한 에코시스템 및 다양한 도구 제공
    • 간편한 설정, 클라우드 환경 최적화
  • 단점
    • 일부 고급 기능 부재(예: 테이블 상속)
    • 복잡한 쿼리에서의 성능 제한

PostgreSQL

  • 장점
    • 풍부한 기능(JSON 지원 및 복잡한 쿼리 최적화)
    • 높은 확장성 및 동시성 처리 능력
    • 강력한 데이터 무결성
  • 단점
    • 초기 설정 및 최적화 복잡성
    • 일부 도구와의 호환성 제한

 


 

[2] 구조적 차이점

1. MySQL(멀티 스레드 구조) vs PostgreSQL(멀티 프로세스 구조)

멀티 프로세스(Multi Process) → PostgreSQL

웹 브라우저에서 여러 개의 탭은 모두 각기 다른 프로세스로 동작한다. 크롬이라는 브라우저(부모 프로세스)가 System Call을 통해 여러 개의 탭(자식 프로세스)를 생성하는 구조인 것이다. 각 프로세스는 독립적인 메모리 공간을 가지고 서로 다른 작업을 수행할 수 있다. 또한 탭 하나가 망가져도 다른 탭에 영향을 주지 않는다.

부모 프로세스는 자식 프로세스를 생성함으로서 다중 프로세스 환경을 구성한다. 부모 프로세스는 자식 프로세스의 PID(Process ID)를 알고 있고, 자식 프로세스 또한 부모 프로세스의 PPID(Parent Process ID)를 안다. 이를 통해 자식 프로세스와 부모 프로세스는 통신이 가능하다.

 

PostgreSQL에서의 멀티 프로세스

PostgreSQL은 각 클라이언트 연결마다 별도의 프로세스를 생성하는 방식을 사용한다.

클라이언트가 데이터베이스로 요청을 보내면 Main Server Process가 새로운 Backend Process(자식 프로세스)를 생성하고, 생성된 프로세스는 클라이언트의 질의 응답을 처리한다.

각 클라이언트 프로세스가 독립적으로 동작하므로 메모리 사용량이 많아질 수 있어 PostgreSQL은 공유 메모리(Shared Memory)를 사용하여 데이터베이스 버퍼를 공유한다.

멀티 프로세스 구조의 장점 (PostgreSQL의 장점)

  1. 프로그램 안정성
    • 각 프로세스가 독립적인 메모리 공간을 가지고 격리되어 있으므로, 한 프로세스가 비정상적으로 동작을 종료되어도 다른 프로세스에 영향을 주지 않는다. 따라서 프로그램 전체의 안정성을 보장할 수 있다.
    • 프로세스 간 작업 충돌이 적으므로 병렬 처리도 더 안정적으로 진행 가능하다.
  2. 시스템 확장성
    • 각 프로세스가 독립적이므로, 새로운 기능이나 모듈을 추가할 때 다른 프로세스에 영향을 주지 않아 시스템의 규모를 쉽게 확장할 수 있다.

멀티 프로세스 구조의 단점 (PostgreSQL의 단점)

  1. Context Switching Overhead
    • 프로세스를 Context Switching 하기 위해 CPU는 다음 프로세스 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 준비해야 한다. 따라서 멀티 스레드 방식에 비해 Context Switching에 많은 비용이 필요하다.
  2. 자원 공유의 비효율성
    • 멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 가지므로 결과적으로 메모리 사용량이 증가하게 된다. 만일 각 프로세스 간 자원 공유가 필요할 경우 IPC(Inter Process Communication)을 사용하는데, IPC 자체로 오버헤드가 발생한다.

 


 

멀티 스레드(Multi Thread) → MySQL

웹 서버는 대표적인 멀티 스레드 응용 프로그램이다. 사용자가 서버 DB에 자료를 요청하는 동안 브라우저의 다른 기능을 이용할 수 있는 이유라 할 수 있다. 즉, 하나의 스레드가 지연되어도 다른 스레드는 작업을 지속할 수 있다.

웹 브라우저에서 멀티 프로세스가 여러 개의 탭(창)이면 멀티 스레드는 한 탭 내에서의 다양한 동작들(이벤트 처리, 네트워크, I/O 및 기타 작업)이라고 생각하면 쉽다.

Thread는 하나의 Process 내에 있는 실행 흐름 이고, 멀티 스레드는 하나의 프로세스 안에 여러 개의 스레드가 있는 것을 의미한다. 따라서 하나의 프로그램 내에서 두 가지 이상의 동작을 동시에 처리하는 행위가 가능해진다.

 

MySQL에서의 멀티 스레드

포그라운드 스레드

  • MySQL 서버에 접속된 클라이언트 수만큼 존재하며, 각 요청 쿼리를 처리한다. 사용자가 커넥션을 종료하면, 해당 스레드는 스레드 캐시로 되돌아간다.(Thread Cache←Thread Pool과 비슷!)
  • 읽기 작업은 포그라운드에서 처리된다.

백그라운드 스레드

  • 포그라운드가 처리하는 그 외 모든 기능을 처리한다.
    • 인서트 버퍼를 병합하는 스레드
    • 로그를 디스크로 기록하는 스레드(Log Thread)
    • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드(Write Thread)
    • 데이터를 버퍼로 읽어 오는 스레드
    • 잠금이나 데드락을 모니터링하는 스레드
  • 쓰기 작업은 백그라운드에서 처리된다. 읽기 작업과 달리 쓰기 작업은 지연되어 처리될 수 있으므로 데이터 일괄 처리 기능(모아두었다가 한 번에 쓰기)를 지원한다.

멀티 스레드 구조의 장점 (MySQL의 장점)

  1. Thread가 Process보다 가볍다.
    • 스레드는 프로세스와 달리 코드/데이터/스택 영역을 제외한 나머지 자원을 서로 공유하기 때문에 기본적으로 내장되어 있는 데이터 용량이 프로세스보다 작다. 따라서 스레드를 생성/제거할 때 프로세스 내부의 자원만을 관리하면 되기 때문에 프로셋 생성/제거보다 훨씬 빠르다.
  2. 자원의 효율성
    • 멀티 스레드 구조에선 하나의 프로세스 내 여러 개의 스레드가 생성되기 때문에 힙 영역과 같은 공유 메모리에 대해 스레드 간 자원 공유가 가능하다. 따라서 IPC가 없이도 스레드 간 자원을 공유할 수 있다.
  3. Context Switching 비용 감소
    • 스레드 문맥 교환 비용은 스위칭할 때 스레드 간 공유 자원을 제외한 나머지(스택, 레지스터)만을 교체하면 되므로 프로세스의 문맥 교환 비용보다 상대적으로 낮다.

멀티 스레드 구조의 단점 (MySQL의 단점)

  1. 안정성 문제
    • 멀티 스레드 구조에서는 하나의 스레드에서 장애 발생 시 다른 스레드도 영향을 받아 전체 프로그램이 종료될 수 있다.
  2. Lock 경합
    • 다수의 스레드가 공유 자원(ex. Inno DB의 버퍼 Pool)에 접근하면 Race Condition 문제가 발생할 수 있다.
  3. 동기화로 인한 성능 저하
    • 멀티 스레드 모델은 여러 개의 스레드가 공유 자원을 동시에 접근할 수 있기 때문에, 동기화 문제가 발생할 수 있다. 예로 여러 스레드가 동시에 한 자원을 변경한다면 의도되지 않은 값을 읽어 서비스에 치명적인 버그가 발생할 수 있다. 따라서 동기화 작업이 필수적인데, 이 작업은 여러 스레드 접근을 제한하는 것이기 때문에 병목 현상이 발생해 성능이 저하될 가능성이 높아진다.

 

Comments