mysqlbinlog 파이프로 파일 전체를 재생하던 고객사 동기화를 바꾼 작업입니다. Go Updater가 배치 binlog 파일을 오프라인으로 파싱하고, 정상 변환된 INSERT·UPDATE는 다시 실행해도 중복 반영되지 않게 했습니다.
레거시 동기화의 단위는 binlog 파일 전체였습니다. 파일 안의 이벤트 하나가 실패해도 파일 전체가 막히고, 어디까지 들어갔는지는 stderr 텍스트를 긁어 세는 수준이라 복구 위치를 특정할 수 없었습니다. 품질 개선 회의에서 CDC 구조 전환을 직접 제안한 이유입니다.
정상 변환된 INSERT·UPDATE에 한해 UPSERT로 적용했습니다. DELETE·DDL과 truncation skip은 이 보장에 포함하지 않았으며, 파일 전체가 언제나 무손실로 재실행된다고 주장하지 않습니다.
레거시(v2/v3) Updater는 mysqlbinlog 유틸리티를 파이프로 실행해 binlog를 타겟 DB에 그대로 밀어넣는 단순 리플레이였습니다. SQL을 제어할 수 없으니 중복 키 에러가 나면 수동 개입이 필요했고, DEFINER 절·Virtual Column처럼 고객사 환경에서 깨지는 구문도 거를 수 없었습니다. 일부 고객사는 MySQL replica 방식의 상시 TCP 연결을 허용하지 않아, 기존 HTTPS 파일 배포 경계를 유지한 채 변경분을 전달해야 하는 제약도 있었습니다.
Transaction_payload를 풀어 고객사 환경에서 처리파일 배포 경계를 바꾸지 않은 채 Go Updater의 오프라인 파싱과 DML 변환을 적용했습니다. 재실행 안전성은 정상 변환된 INSERT·UPDATE 범위이며, truncation skip은 별도 정합성 확인이 필요합니다.
2025년 9월 품질 개선 회의에서 파일 단위 동기화의 한계를 제기하며 CDC 구조 전환을 제안했고, 2026년 1분기에 설계·구현과 배포 시나리오 리뷰를 마친 뒤 고객사 배포는 기술지원팀에 이관했습니다. 도구 선정 단계에서 Maxwell은 FileSink PoC로 DML·DDL JSON 출력을 확인했지만, 공식 MySQL sink가 없고 MySQL 8.4의 ZSTD 압축 Transaction_payload를 처리하지 못해 제외했습니다. 배포 경계는 Python/FastAPI download server가 암호화된 binlog 파일을 제공하는 기존 HTTPS 방식을 유지했습니다. 기술지원팀은 레거시를 포함해 약 10개 고객 환경의 배포와 일상 운영을 맡고, 저는 운영 중 접수된 이슈를 재현해 구현을 개선하고 기술 지원을 제공했습니다.