모든 포스트
PostgreSQL 실전 강좌 #7 파티셔닝: 거대 테이블을 시간 단위로 나누기
수억 행 테이블의 표준 처방인 선언적 파티셔닝을 다룹니다. 파티셔닝이 실제로 해결하는 문제(오래된 데이터 삭제가 DROP 한 방·파티션 프루닝·VACUUM 부담 분산)와 해결하지 않는 문제, RANGE 파티셔닝으로 월별 테이블을 만드는 문법, 파티션 키가 PK에 포함되어야 하는 제약, 파티션 프루닝이 적용되는 쿼리 조건, 새 파티션을 계속 만들어야 하는 운영 부담과 pg_partman, 그리고 "언제 도입하는가"의 판단 기준까지 다루겠습니다.
Rust 실전 강좌 #7 릴리스 최적화와 크로스 컴파일: 작고 빠른 바이너리를 어디서나
배포 준비의 전반부입니다. [profile.release]로 조이는 최적화(lto, codegen-units, strip)와 각 옵션의 대가, panic = "abort"를 함부로 켜면 안 되는 이유, 바이너리 크기가 줄어드는 과정, 그리고 rustup target으로 하는 크로스 컴파일 — 특히 glibc 의존을 없애 오래된 서버에서도 도는 musl 정적 링크 빌드와 링커 문제를 도커로 우회하는 cross 도구까지 다루겠습니다.
SRE 실무 #5 포스트모템: 비난 없는 회고와 액션 아이템의 사후 관리
장애를 조직의 학습으로 바꾸는 포스트모템 운영을 다룹니다. 비난 없음(blameless)이 온정주의가 아니라 정보 획득 전략인 이유, 어떤 장애에 포스트모템을 쓸지 정하는 트리거 기준, 타임라인·영향·원인 분석·액션 아이템으로 이어지는 템플릿, 사람 실수에서 멈추지 않고 시스템 원인까지 내려가는 질문법, 그리고 액션 아이템이 방치되지 않게 하는 추적 규칙까지 다룹니다.
테라폼 기초 강좌 #8 모듈 기초: 리소스 묶음의 재사용과 레지스트리 모듈
모든 테라폼 디렉터리가 이미 모듈이라는 것에서 출발해, 변수를 입력으로 output을 출력으로 갖는 자식 모듈을 직접 만들고 module 블록으로 호출하는 방법을 정리합니다. 레지스트리의 검증된 모듈을 버전 고정과 함께 가져다 쓰는 법, 그리고 모듈을 나누는 기준과 과도한 분리의 경계까지 다루겠습니다.
PostgreSQL 실전 강좌 #6 잠금과 동시성: 데드락, DDL 락, SKIP LOCKED
MVCC가 다 해결해 주지 않는 영역, 잠금을 다룹니다. 행 잠금(쓰기끼리의 충돌)과 테이블 잠금(DDL)의 층위, 잠금 대기를 pg_locks와 pg_blocking_pids로 추적하는 법, 데드락이 나는 구조(교차 순서 갱신)와 예방 규칙(같은 순서로 잡기), SELECT FOR UPDATE로 읽고-판단-쓰기를 안전하게 만드는 법, 그리고 작업 큐의 표준 패턴 FOR UPDATE SKIP LOCKED까지 다루겠습니다.
Rust 실전 강좌 #6 테스트: 파서 단위 테스트에서 CLI 통합 테스트까지
loglens에 안전망을 두릅니다. 같은 파일 안에 두는 #[cfg(test)] 단위 테스트(파서의 정상·경계·실패 케이스), tests/ 디렉터리의 통합 테스트, assert_cmd와 predicates로 빌드된 바이너리를 실제로 실행해 출력과 종료 코드를 검증하는 CLI 테스트, tempfile로 만드는 임시 로그 파일, 그리고 cargo test가 테스트를 병렬 실행한다는 사실이 갖는 함의까지 다루겠습니다.
SRE 실무 #4 온콜 운영: 로테이션, 에스컬레이션, 부담 관리
지속 가능한 온콜 체계를 설계하는 법을 다룹니다. 로테이션이 성립하는 최소 인원과 근무 편성 방식, 1차 대응자가 막혔을 때를 위한 에스컬레이션 체인, 교대를 넘길 때의 핸드오프 루틴, 교대당 페이지 건수로 부담을 측정하고 상한을 두는 이유, 온콜 중 발견한 문제를 갚는 후속 작업 시간 확보, 그리고 보상과 문화까지, 온콜이 번아웃 제조기가 되지 않기 위한 조건들을 다룹니다.
테라폼 기초 강좌 #7 리소스 수명주기 제어: 교체 조건, create_before_destroy, prevent_destroy
어떤 속성 변경이 update로 끝나고 어떤 변경이 리소스 교체를 강제하는지 plan에서 읽어 내는 법을 정리합니다. 교체 순서를 뒤집어 중단을 줄이는 create_before_destroy, 운영 리소스의 삭제를 막는 prevent_destroy, 코드 밖 변경을 무시하는 ignore_changes, 그리고 -replace 플래그로 교체를 강제하는 방법까지 다루겠습니다.
PostgreSQL 실전 강좌 #5 VACUUM과 autovacuum: dead tuple 청소의 원리와 튜닝
PostgreSQL 운영 지식의 한가운데인 VACUUM을 다룹니다. MVCC가 남기는 dead tuple과 VACUUM이 하는 일(공간 재사용 표시·가시성 지도 갱신·트랜잭션 ID 되감기 방지), 보통은 autovacuum에 맡기면 되는 이유와 기본 문턱의 한계(큰 테이블일수록 청소가 늦음), 테이블별 스케일 팩터 조정, 청소를 방해하는 장기 트랜잭션, 블로트 확인 쿼리, 그리고 VACUUM FULL의 위험성까지 다루겠습니다.
Rust 실전 강좌 #5 rayon 병렬화: 데이터 레이스 없는 map-reduce
집계를 여러 코어에 나눕니다. 병렬화가 이득인 조건(CPU 바운드)과 스트리밍에서 통째 읽기로 전략을 바꾸는 이유, rayon의 par_lines와 fold·reduce로 만드는 스레드별 부분 집계와 병합, Mutex로 하나의 HashMap을 공유하면 느려지는 이유(락 경합), 그리고 공유 가변 상태 실수를 컴파일러가 잡아내는 장면까지 다루겠습니다.
SRE 실무 #3 경보 설계: 증상 기반 알림과 다중 창 번 레이트
새벽에 사람을 깨울 가치가 있는 경보만 남기는 설계를 다룹니다. 원인 기반 경보(CPU 높음)가 아니라 증상 기반 경보(사용자 요청 실패)로 전환해야 하는 이유, 페이지와 티켓을 가르는 기준, 번 레이트 경보를 짧은 창과 긴 창의 조합으로 만들어 오탐과 미탐을 함께 줄이는 다중 창 구성, 경보 피로를 측정하고 줄이는 운영 루틴까지 다룹니다.
테라폼 기초 강좌 #6 의존성과 반복: depends_on, count vs for_each, dynamic 블록
참조가 곧 의존성이 되어 생성 순서가 결정되는 원리와 depends_on이 필요한 예외 상황을 정리합니다. count로 리소스를 복제할 때 리스트 중간 제거가 일으키는 재생성 함정, 키 기반이라 안전한 for_each와의 선택 기준, 그리고 중첩 블록을 반복하는 dynamic 블록까지 다루겠습니다.