IL-0319 Oregon State University Open Source Lab · 2015-07-30database
mysql2 를 다시 적재하려고 데이터베이스를 지우는 동안 mysql1 의 데이터베이스도 함께 지워졌다
Oregon State University Open Source Lab 의 mysql1 과 mysql2 는 MySQL 5.5 를 쓰는 서버 한 쌍이다. 7월 15일과 16일 mysql2 의 세션 테이블에서 복제 오류가 이어졌고, 팀은 7월 20일 주간에 mysql2 를 통째로 다시 적재하고 행 기반 복제 같은 다른 복제 방식을 살펴보기로 했다. 문서와 팀 안의 지식으로는 두 서버가 마스터-슬레이브 복제였지만 실제로는 마스터-마스터 복제로 설정돼 있었다.
7월 30일 오후 4시 PDT 에 팀은 mysql2 의 슬레이브 복제를 멈추고 데이터베이스를 하나 지울 때마다 잠깐씩 쉬면서 지웠다. mysql2 는 여전히 mysql1 로 명령을 보내고 있었으므로 두 서버 모두에서 데이터베이스가 지워졌다. 스크립트가 중간중간 쉬었기 때문에 몇 분 뒤 mysql1 에서도 데이터베이스가 지워지는 것을 알아챘다. 팀은 스크립트를 멈추고 곧바로 복원을 시작했다.
복원은 세 가지 이유로 예상보다 훨씬 느리고 손이 많이 갔다. 자원 가운데 디스크 공간이 가장 큰 병목이었기 때문에 mysql-zrm 으로 강하게 압축해 백업해 왔다. 그래서 복원할 때 IO 가 아니라 CPU 가 병목이 됐다. 인덱스와 외래 키 문제로 복원이 실패하는 데이터베이스가 몇 개 있었다. 그때마다 약 200GB 백업 파일 전체를 훑어 문제가 난 데이터베이스와 아직 복원하지 못한 나머지를 따로 꺼내야 했다. 백업은 mysql2 에서 떴는데, mysql2 는 처음 동기화가 실패한 탓에 mysql1 보다 뒤처져 있었다. 17일부터 30일까지의 바이너리 로그가 남아 있어 대부분의 데이터는 되살렸지만 15일과 17일 사이의 데이터 일부는 잃었다. 시험용 데이터베이스와 100GB 넘게 불어난 데이터베이스 여러 개도 복원을 크게 늦췄다.
- 심각도
- –
- 영향 범위
- Databases on the mysql1 and mysql2 MySQL cluster were dropped and unavailable until restored; some data written between July 15th and 17th was lost
- 영향 사용자
- –
- 지역
- –
- 감지까지
- –
- 복구까지
- –
증상
복제 오류를 고치려고 mysql2 의 데이터베이스를 하나씩 지우던 중, 몇 분 뒤 mysql1 에서도 데이터베이스가 지워지고 있는 것을 알아챘다. 지워진 데이터베이스들은 복원될 때까지 쓸 수 없었다.
그 전부터 mysql2 의 복제가 흔들리고 있었다. 7월 15일 세션 테이블 두어 개에서 복제 문제가 나 복제가 멈췄고, 많은 구문을 건너뛴 뒤에야 복제를 다시 시작했다. 7월 16일에는 같은 테이블에서 훨씬 많은 문제가 났고 복제를 여러 번 다시 시작했다. 결국 7월 20일 주간에 mysql2 를 통째로 다시 적재하기로 했다.
문서와 팀 안에서 전해지던 지식으로는 두 서버가 마스터-슬레이브 복제였지만 실제 설정은 마스터-마스터 복제였다. 그래서 mysql2 의 슬레이브 복제를 일부러 멈췄는데도 mysql2 는 여전히 mysql1 로 명령을 보내고 있었다. 이 때문에 mysql2 에서 지운 데이터베이스가 mysql1 에서도 지워졌다.
복원은 예상보다 훨씬 느리고 손이 많이 갔다. mysql-zrm 으로 강하게 압축한 백업이라 복원할 때 CPU 가 병목이 됐다. 인덱스와 외래 키 문제로 복원이 실패하는 데이터베이스가 나올 때마다 약 200GB 짜리 백업 파일 전체를 다시 훑어야 했다. 백업은 mysql1 보다 뒤처진 mysql2 에서 뜨고 있었기 때문에 15일과 17일 사이의 데이터 일부는 되살리지 못했다.
원인
- 촉발
- 7월 30일 오후 4시 PDT 에 팀은 복제 오류를 고치려고 mysql2 를 다시 적재하기로 했다. 슬레이브 복제를 멈춘 뒤 mysql2 의 데이터베이스를 하나 지울 때마다 잠깐씩 쉬면서 지웠다.
감지
데이터베이스를 지우는 스크립트가 하나를 지울 때마다 짧게 쉬었기 때문에, 시작하고 몇 분 뒤 mysql1 에서도 데이터베이스가 지워지고 있는 것을 알아챘다.
조치
- mysql1 에서도 데이터베이스가 지워지는 것을 보고 스크립트를 멈췄다.
- 곧바로 지워진 데이터베이스의 복원을 시작했다.
- 인덱스와 외래 키 문제로 복원이 실패한 데이터베이스는 약 200GB 백업 파일에서 따로 꺼내 복원했고, 아직 복원하지 못한 나머지 데이터베이스도 다시 꺼내 복원했다.
- 백업은 mysql1 보다 뒤처진 mysql2 에서 뜬 것이어서, 17일부터 30일까지의 바이너리 로그로 대부분의 데이터를 되살렸다. 15일과 17일 사이의 데이터 일부는 되살리지 못했다.
후속 조치
- 처음 문제였던 복제 오류를 줄이려고 행 기반 복제를 포함해 더 나은 복제 방식을 검토한다.
- 바이너리 로그를 별도 서버에 백업으로 보관한다.
- 전체 복원이 훨씬 빨라지도록 Percona XtraBackup 으로 백업한다.
- 논리 백업 속도를 높이려고 mysql-zrm 대신 mydumper 를 쓴다.
- 복잡한 시스템의 문서와 교육을 손본다.
- 백업 절차의 하나로 예비 서버에서 전체 복원을 정기적으로 시험한다.
- 복원에 걸리는 예상 시간을 더 정확하게 잡는다.
- 호스팅하는 데이터베이스를 정기적으로 점검한다. 시험용 데이터베이스와 100GB 넘게 불어난 데이터베이스 여러 개가 이번 복원을 크게 늦췄다.
- 더 크고 성능이 좋은 MySQL 클러스터로 옮긴다. 이 이전은 장애 전부터 계획돼 있었다.
- 장애와 유지보수, 자원 사용량과 경고 신호를 대시보드로 커뮤니티에 더 잘 알리는 정책과 수단을 만든다.
- 핵심 서비스의 용량 한계를 정하고 감시한다.
- 핵심 서비스에 이중화와 복원 절차를 갖추고 직원 훈련을 한다.
- 핵심 서비스를 더 많이 Chef 로 옮긴다.
- 문서, 정책, 성능 지표를 주기적으로 검토한다.
- 커뮤니티의 전문 지식으로 연구소의 역량을 보완할 더 나은 방법을 찾는다.
- 가장 낡은 인프라를 교체하고 가장 심한 기술 부채를 해소할 기금을 모은다.
교훈
Open Source Lab 은 이번 장애에서 MySQL 클러스터를 운영하는 방식과 연구소 전체가 자원을 계획하고 관리하는 방식 모두에서 교훈을 얻었다고 적었다. 디스크 공간을 아끼려고 백업을 강하게 압축한 선택은 전체 복원이 드물었던 그동안에는 괜찮았지만 이번 복원을 크게 늦췄다. 더 많은 프로젝트를 받으려고 자원을 빠듯하게 나눠 써 왔고, 그 대가로 백업을 압축하고 바라던 것보다 이중화를 덜 갖췄다. 장애가 길었던 것과 진행 상황을 알리지 못한 것은 받아들일 수 없는 일이었다고 밝혔다.
출처
관련 사례
IL-0242primary 와 secondary PostgreSQL 데이터베이스를 모두 잃어 matrix.org homeserver 가 약 24시간 동안 멈췄다Matrix.org Foundation · 2025같은 원인 · 공통 데이터베이스, 데이터베이스 백업과 스냅숏, 데이터베이스 복제
IL-0218복제를 다시 맞추다 PostgreSQL 프라이머리의 데이터 디렉터리가 지워지고 백업이 작동하지 않아 GitLab.com 이 약 18시간 멈추고 데이터를 잃었다GitLab · 2017같은 원인 · 공통 데이터베이스, 데이터베이스 백업과 스냅숏, 데이터베이스 복제
같은 원인 · 공통 데이터베이스, 데이터베이스 복제
같은 원인 · 공통 데이터베이스, 데이터베이스 백업과 스냅숏
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0531West US 의 Azure Database for MySQL Single Server 와 MariaDB 일부 서버로 가는 새 연결이 모두 거부됐다Microsoft Azure · 2024같은 원인 · 공통 데이터베이스
IL-0565쿠키런: 킹덤의 CockroachDB 클러스터가 노드 24대 중 16대의 파일 시스템을 잃고 멈춰 게임이 36시간 넘게 점검에 들어갔다Devsisters · 2022같은 원인 · 공통 데이터베이스
IL-0207로컬 개발 환경에서 돌린 작업이 운영 컨텍스트로 넘어가 Kubernetes 클러스터의 Consul 릴리스를 통째로 지웠고, Patroni 가 무너져 GitLab.com 전체가 5XX 오류를 냈다.GitLab · 2022같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0506UC Berkeley DataHub 의 JupyterHub sqlite 데이터베이스가 빈 데이터베이스로 덮어써져 로그인이 실패하고 홈 디렉터리가 비어 보이고 다른 사용자로 로그인되는 문제가 났다UC Berkeley · 2017같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스 백업과 스냅숏
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0319
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0319/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.