한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

게임 렉 백서 › L12 데이터베이스

운영 중 스키마 변경(DDL) 잠금 Schema change lock (DDL / metadata lock)

원인 ID db-ddl-lock · 주 담당 인프라팀·DB 인프라 · 함께 게임개발팀·서버 개발

그림과 실험이 있는 원본 카드로 열기 →

서비스 중에 테이블에 컬럼이나 인덱스를 추가하면, 잠깐 필요한 잠금 하나 때문에 그 테이블을 쓰는 모든 요청이 대기할 수 있습니다.

왜 핫픽스로 운영 중인 테이블에 컬럼·인덱스 추가 → 그러면 스키마 변경이 앞서 열린 긴 트랜잭션을 기다리고 뒤에 오는 모든 요청은 그 스키마 변경을 기다림 → 화면에서는 그 테이블을 쓰는 기능(인벤토리, 우편 등)이 통째로 멈추고 타임아웃

증상
입력 지연, 씹힘·롤백, 접속 불가·무한 로딩
요인
정체
누가 겪나
특정 기능만, 서버 전체
언제
가끔 무작위로, 접속·점검 직후
담당
주 담당 인프라팀·DB 인프라 · 함께 게임개발팀·서버 개발
게임개발팀 할 일
스키마 변경이 든 핫픽스는 DB 인프라와 일정 협의, 새 컬럼이 없어도 동작하는 코드를 먼저 배포.
인프라팀 할 일
잠금 대기 한도를 짧게 걸고 실패하면 다시 시도, 긴 트랜잭션이 없을 때 실행, 온라인 변경 도구 사용, 큰 테이블은 점검 시간에.
그래프에서는
어느 순간부터 계단처럼 올라감 · 잠금 대기 세션 수, 그 테이블의 쿼리 지연
확인할 곳
MySQL은 SHOW PROCESSLIST에서 State가 Waiting for table metadata lock인 세션을 세고, sys.schema_table_lock_waits로 막고 있는 세션(blocking_pid)을 찾음. PostgreSQL은 pg_locks에서 granted가 false인 요청과 AccessExclusiveLock을 보고, pg_blocking_pids()로 막고 있는 세션을 찾음
이러면 맞음
스키마 변경을 시작한 시각부터 그 테이블을 쓰는 모든 쿼리가 잠금 대기로 쌓이고, 맨 앞에 끝나지 않은 트랜잭션이나 스키마 변경 문장이 있음
이러면 아님
대기가 특정 행에만 몰리고 같은 테이블의 다른 행은 잘 처리되면 핫 로우(db-hot-row)
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
MySQL은 스키마를 바꿀 때 메타데이터 잠금을, PostgreSQL은 가장 강한 테이블 잠금을 잠깐 잡습니다. 변경 자체는 순식간이어도, 앞에 끝나지 않은 트랜잭션이 하나 있으면 그 뒤로 모든 요청이 대기합니다.

출처

  1. Online DDL Performance and Concurrency MySQL
    온라인 DDL도 끝낼 때 배타적 메타데이터 잠금이 잠깐 필요, 긴 트랜잭션이 있으면 기다리고 기다리는 잠금 요청이 뒤의 모든 트랜잭션을 막음
  2. Server System Variables MySQL
    lock_wait_timeout: 메타데이터 잠금 대기 한도, 기본값 31,536,000초(1년)
  3. ALTER TABLE (PostgreSQL Documentation) PostgreSQL
    따로 적지 않은 ALTER TABLE은 가장 강한 ACCESS EXCLUSIVE 잠금을 잡음
  4. Client Connection Defaults (PostgreSQL Documentation) PostgreSQL
    lock_timeout: 잠금을 이 시간 넘게 기다리면 문장을 중단
  5. General Thread States MySQL
    Waiting for table metadata lock: 메타데이터 잠금을 기다리는 스레드 상태
  6. The schema_table_lock_waits and x$schema_table_lock_waits Views MySQL
    메타데이터 잠금을 기다리는 세션(waiting_query)과 막고 있는 세션(blocking_pid)
  7. pg_locks (PostgreSQL Documentation) PostgreSQL
    granted가 false면 잠금을 기다리는 중, mode에 AccessExclusiveLock 같은 잠금 종류
  8. System Information Functions and Operators (PostgreSQL Documentation) PostgreSQL
    pg_blocking_pids(): 지정한 세션이 잠금을 못 얻게 막고 있는 세션 목록

함께 보면 좋은 원인

같은 층: L12 데이터베이스

같은 증상(입력 지연)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기