LabHub

스키마 변경 — 배포가 서비스를 멈추지 않게 · 잠금과 배포 · 실습

마이그레이션이 서비스를 세우는 것을 본다

LabHub 에서 이어서 보기

목표

마이그레이션 사고는 작업이 오래 걸려서 나는 게 아닙니다. **잠금을 기다리는
동안 뒤가 줄을 서서** 납니다.

이 실습은 그 줄 세우기를 직접 만들어 봅니다. 몇 초면 재현됩니다.

준비

create table big(id bigserial primary key, name text, n int);insert into big(name,n) select 'row'||i, i from generate_series(1,300000) i;

시간 재기

psql -h 127.0.0.1 -U lab -d labdb\timing on

두 세션 만들기

psql -h 127.0.0.1 -U lab -d labdb \  -c "begin; select count(*) from big; select pg_sleep(8);" &sleep 1# 여기서 두 번째 세션wait

단계

1. 컬럼 추가 시간 → 01-addcolumn.txt
2. 잠금 종류 → 02-lockmode.txt
3. 줄 세우기03-queue.txt
4. lock_timeout04-locktimeout.txt
5. 인덱스가 쓰기를 막음 → 05-index.txt
6. CONCURRENTLY06-concurrently.txt
7. 못 쓰는 인덱스 찾기 → 07-invalid.md
8. 정리 → 08-notes.md

참고

3단계가 이 실습의 전부입니다. 나머지는 그것을 피하는 방법입니다.

단계 8개

  1. 기본값 있는 컬럼 추가는 느린가
  2. 그런데 어떤 잠금을 잡나
  3. 뒤에 오는 것들이 줄을 선다
  4. lock_timeout 으로 막는다
  5. 인덱스 생성이 쓰기를 막는다
  6. CONCURRENTLY 로 만든다
  7. 실패한 인덱스는 남는다
  8. 세 가지를 정리한다