스키마 변경 — 배포가 서비스를 멈추지 않게 · 잠금과 배포 · 실습
마이그레이션이 서비스를 세우는 것을 본다
목표
마이그레이션 사고는 작업이 오래 걸려서 나는 게 아닙니다. **잠금을 기다리는
동안 뒤가 줄을 서서** 납니다.
이 실습은 그 줄 세우기를 직접 만들어 봅니다. 몇 초면 재현됩니다.
준비
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_timeout → 04-locktimeout.txt
5. 인덱스가 쓰기를 막음 → 05-index.txt
6. CONCURRENTLY → 06-concurrently.txt
7. 못 쓰는 인덱스 찾기 → 07-invalid.md
8. 정리 → 08-notes.md
참고
3단계가 이 실습의 전부입니다. 나머지는 그것을 피하는 방법입니다.
단계 8개
- 기본값 있는 컬럼 추가는 느린가
- 그런데 어떤 잠금을 잡나
- 뒤에 오는 것들이 줄을 선다
- lock_timeout 으로 막는다
- 인덱스 생성이 쓰기를 막는다
- CONCURRENTLY 로 만든다
- 실패한 인덱스는 남는다
- 세 가지를 정리한다