동키 기술 블로그
연재
전체 연재 보기최근 글
주제별로 보기COMMIT 직후 서버가 꺼져도 값은 남을까
UPDATE가 데이터 페이지와 Undo, Redo에 남기는 흔적을 따라갑니다.
COMMIT과 Page Flush는 같은 일이 아니다
COMMIT과 페이지 플러시가 나뉘는 이유를 WAL과 STEAL/NO-FORCE로 살펴봅니다.
COMMIT은 Redo Log의 어디까지 기다리는가
Redo Log의 write와 durable flush를 구분하고, COMMIT이 기다리는 LSN을 살펴봅니다.
Checkpoint는 복구 시작점을 어떻게 옮기는가
Checkpoint, Page LSN, Doublewrite가 복구 과정에서 맡는 역할을 정리합니다.
InnoDB는 왜 Redo한 뒤 Undo하는가
장애 뒤 Redo를 적용하고, 미완료 트랜잭션을 Undo로 되돌리는 순서를 따라갑니다.
SIGKILL로 확인한 커밋과 롤백
MySQL을 강제로 종료한 뒤 커밋과 롤백을 확인하고, 실험으로 단정할 수 없는 범위를 구분합니다.
TCP 바이트 스트림과 Seq/ACK
TCP가 Seq와 ACK로 받은 바이트와 빈 구간을 확인하는 방식을 살펴봅니다.
RTO로 손실을 감지하는 과정
RTT로 타임아웃을 계산하고, 재전송과 연속 타임아웃에 대응하는 과정을 정리합니다.
중복 ACK를 이용한 빠른 재전송과 SACK
중복 ACK와 SACK으로 손실 구간을 찾고 재전송하는 과정을 따라갑니다.
마지막 세그먼트가 손실됐을 때 - TLP와 RACK
마지막 세그먼트가 손실됐을 때 TLP와 RACK이 복구를 돕는 방식을 살펴봅니다.
PCAP으로 TCP 손실 복구 관찰하기
패킷 캡처로 TCP의 복구 흐름을 읽고, 캡처만으로 확정할 수 없는 동작을 구분합니다.
TCP가 복구해도 서비스는 느려질 수 있다
TCP 복구 지연이 소켓 읽기, HTTP 응답, 애플리케이션 재시도에 미치는 영향을 살펴봅니다.
오픈미션 주제 선정기
혼자, 프레임워크 없이 멀티플레이 게임을 만들기로 한 이유와 계획을 기록했습니다.
WebSocket을 바닥부터 구현하기
RFC 6455를 읽으며 핸드셰이크와 텍스트 프레임을 구현한 과정입니다. 지원하지 못한 범위도 함께 정리했습니다.
멀티스레드 환경에서 살아남기
동시 접속에서 생긴 경쟁 조건과 객체 참조 누적을 분석하고, 현재 구현에 남은 문제를 살펴봅니다.
God Object를 해체하고 설계 개선하기
GameService에 모인 책임을 나누고 의존 관계를 정리한 과정과 남은 설계 과제를 돌아봅니다.
프레임워크 없이 개발하며 배운 것들
서버를 직접 만들며 알게 된 프레임워크의 역할과, 프로토콜·동시성·설계에서 놓친 점을 돌아봅니다.

