MySQL Enterprise Edition은 여러 모로 기업을 위한 솔루션입니다. 여러 이유 중 이번 포스팅에서는 MySQL 스레드 풀 기능을 알아볼까 합니다.
MySQL 스레드 풀 기능의 등장 배경
커뮤니티 버전을 쓰시는 분은 이 기능이 익숙하지 않을 수 있습니다. MySQL에는 "연결당 하나의 스레드"라는 기본 연결 처리 모델이 있습니다. 즉, 클라이언트가 MySQL에 연결하면 MySQL은 연결을 처리하기 위해 새 스레드를 만듭니다. 이 스레드는 연결이 닫힐 때까지 클라이언트가 보낸 모든 SQL 문을 실행하는 역할을 담당합니다. "연결당 하나의 스레드" 방식의 장점은 이해하고 구현하기가 간단하다는 것과 각 클라이언트 연결을 다른 클라이언트 연결로부터 격리하여 보안 측면에서 유리하다는 것을 꼽을 수 있습니다. 하지만 실제 프로덕션 환경에서는 장점보다 단점이 더 크게 다가옵니다.
"연결당 하나의 스레드" 모델은 연결을 많이 하는 애플리케이션의 경우 성능에 부정적인 영향을 미칠 수 있습니다. 클라이언트가 MySQL에 연결하면 연결을 처리하기 위해 새 스레드가 만들어집니다. 이 스레드는 연결이 종료될 때까지 클라이언트가 전송한 모든 SQL 문을 실행합니다. 연결을 많이 만드는 애플리케이션의 경우 MySQL이 지속적으로 스레드를 생성 및 소멸하기 때문에 성능이 저하될 수 있습니다.
자원 효율도 문제입니다. 연결당 하나의 스레드 모델은 많은 수의 동시 연결을 하는 애플리케이션의 경우 메모리 및 CPU와 같은 리소스 사용량이 높아질 수 있습니다. 연결이 짧은 시간 동안만 사용되더라도 MySQL은 각 연결에 대해 새 스레드를 생성해야 하기 때문입니다.
확장성도 단점이라 할 수 있습니다. 연결당 하나의 스레드 모델은 많은 수의 동시 연결을 수행하는 애플리케이션의 경우 MySQL의 확장성을 제한할 수 있습니다. 이는 MySQL이 스레드가 부족해지기 전까지 제한된 수의 동시 연결만 처리할 수 있기 때문입니다. 이런 문제를 해결하기 위해 MySQL Enterprise Edition에 추가된 기능이 바로 MySQL 스레드 풀입니다.
진화를 거듭하는 MySQL 스레드 풀
MySQL 스레드 풀은 들어오는 모든 연결을 처리하는 데 사용되는 스레드 풀을 생성합니다. 새 연결이 만들어지면 MySQL은 풀의 스레드 중 하나에 연결을 할당합니다. 이를 통해 MySQL은 많은 수의 동시 연결을 과부하 없이 처리할 수 있습니다. MySQL 스레드 풀 기능이 제공하는 장점은 곧 “연결당 하나의 스레드”의 단점에 대한 해결책이라 볼 수 있습니다.
MySQL 스레드 풀은 동시 연결을 보다 효율적으로 처리하여 MySQL의 성능을 향상시킬 수 있습니다. MySQL 스레드 풀은 MySQL이 너무 많은 스레드를 생성하는 것을 방지하여 MySQL의 리소스 사용량을 줄일 수 있습니다. MySQL 스레드 풀은 MySQL이 더 많은 동시 연결을 처리할 수 있도록 하여 MySQL의 확장성을 높일 수 있습니다.
MySQL 스레드 풀 기능은 MySQL 5.6에 처음 추가되었는데 MySQL 서버 잠금 구조 및 알고리즘이 시간이 지남에 따라 개선됨에 따라 원래 스레드 풀 디자인이 제공하는 이점이 줄게 되었습니다. 이에 MySQL 8.0에 포함된 스레드 풀 기능은 여러모로 개선이 이루어졌습니다.
MySQL 8.0의 스레드 풀 기능 둘러보기
MySQL 8.0의 스레드 풀의 기능과 특징을 좀 더 자세히 알아보겠습니다. MySQL 스레드 풀은 사용자 연결과 스레드를 분리합니다. 이전 버전에 적용된 것과 달리 최신 MySQL 스레드 풀 기능의 경우 사용자 연결에 더 이상 명령문을 실행하기 위한 전용 스레드가 없습니다. 대신 스레드 풀은 스레드 그룹으로 구성되며 기본값은 16개 스레드 그룹입니다. 사용자 연결은 라운드 로빈 방식으로 스레드 그룹에 할당됩니다. 각 스레드 그룹은 사용자 연결의 하위 집합을 관리합니다. 각 스레드 그룹 내에는 해당 스레드 그룹에 할당된 사용자 연결에서 받은 쿼리 실행을 담당하는 하나 이상의 스레드가 있습니다.
기본적으로 스레드 풀은 구성된 수의 스레드(기본적으로 하나)만 스레드 그룹 내에서 실행되도록 하는 것을 목표로 합니다. 그러나 최적의 성능을 달성하기 위해 스레드 풀은 스레드 그룹 내에서 더 많은 스레드가 실행되도록 선택적으로 허용할 수 있습니다.
한편, MySQL 8.0 스레드 풀 기능은 트랜잭션 수를 제한하는 방법을 제공합니다. 스레드당 트랜잭션 수를 제한하면 단일 스레드가 스레드 풀을 독점하는 것을 방지하여 MySQL의 성능을 향상시킬 수 있습니다. 그리고 스레드당 트랜잭션 수를 제한하면 단일 스레드가 너무 많은 리소스를 사용하는 것을 방지하여 MySQL의 리소스 사용량을 줄일 수 있습니다. 확장성도 좋아지는 데 스레드당 트랜잭션 수를 제한하면 단일 스레드가 다른 스레드의 트랜잭션 실행을 차단하는 것을 방지하여 MySQL의 확장성을 향상시킬 수 있습니다. 이런 이유로 MySQL 8.0을 사용하는 경우 최대_트랜잭션_당_스레드 구성 매개변수를 설정하는 것을 권장합니다.
MySQL 8.0의 스레드 풀에 권장되는 구성
다음은 스레드 풀에 권장되는 초기 구성입니다. 이 구성은 더 나은 성능을 달성하기 위해 특정 로드 요구 사항에 따라 추가로 조정할 수 있습니다.
그렇다면 스레드 풀 설정을 통해 성능과 확장성이 얼마나 개선될까요? 다음과 같은 조건에서 기본 스레드 처리 모델을 사용하는 서버의 TPCC-100W(10GB 데이터) 결과와 스레드 풀 및 최대 트랜잭션 제한 기능을 사용하는 서버의 결과를 비교해 보았습니다.
결과를 도식화하면 다음과 같습니다. 이 표에서 알 수 있듯이 MySQL 스레드 풀을 활용하는 경우 기본 연결 처리에서 관찰되는 성능 저하율에 비해 사용자 연결 수가 많을수록 성능 저하율이 훨씬 낮습니다. 기본 연결 처리 메커니즘은 512개의 사용자 연결에 도달한 후 초당 트랜잭션 감소를 보여 4096개의 사용자 연결 이상에서만 초당 약 2000개의 트랜잭션을 처리합니다. 그러나 MySQL 스레드 풀을 사용하면 더 많은 수의 사용자 연결로도 우수한 성능이 유지되어 4096 사용자 연결보다 초당 약 17000 트랜잭션을 처리할 수 있습니다.
이상으로 MySQL Enterprise Edition을 써야 하는 이유 중 하나인 스레드 풀 기능에 대해 알아보았습니다. MySQL 8.0 업그레이드를 고려하고 있다면 이 기능을 꼭 설정해 쓰시기 바라며 도움이 필요하면 락플레이스로 연락 바랍니다.
운영체제, 미들웨어, 데이터베이스, 마이그레이션(U2L, DB, WAS), 가상화, 클라우드 및 빅데이터 컨설팅 서비스 관련하여 궁금하신 점은 언제든 문의해 주시기 바랍니다. 아래 링크를 클릭해주세요.
1:1 문의 바로가기 click
락플레이스는 2005년에 출범하여 대한민국 리눅스의 역사와 성장을 함께 해온 19년차 오픈소스&클라우드 전문 기업으로 국내 최다 엔지니어, 국내 최고 기술력, 국내외 유수기업 컨설팅의 풍부한 경험과 탄탄한 기술력으로 고객의 성공적인 오픈소스 플랫폼 구축과 응용 프로그램 전체 범위의 서비스를 제공하고 있습니다.
'PRODUCT > DBMS' 카테고리의 다른 글
MySQL의 식지 않는 인기 비결 (0) | 2023.08.16 |
---|---|
엔터프라이즈 시장에서 오픈 소스 데이터베이스의 존재감을 키우는 Postgres의 미래! (0) | 2023.07.06 |
하이브리드 멀티 클라우드 환경에서 MySQL을 사용 중이라면? Dynatrace를 활용한 MySQL 모니터링을 추천합니다! (0) | 2023.04.20 |
MySQL Enterprise Security 4의 강화된 인증 기능 (0) | 2023.02.28 |
MySQL Case Study - 가드미 국제 보험(Guard.me Intetnational Insurance) 사례 (0) | 2022.09.28 |