단일 장애점

Single Point of Failure

개념

그것 하나가 멈추면 시스템 전체가 멈추는 지점으로, 어디를 두 벌로 만들어야 하는지 찾을 때 씁니다.

등장 배경

서버를 여러 대로 늘려 놓고 안심하던 시절이 있었습니다. 웹 서버가 한 대에서 다섯 대가 되면 한 대가 죽어도 나머지 넷이 받아 주니 멈추지 않는다는 계산입니다. 요청을 여러 서버에 나눠 보내는 로드 밸런서까지 앞에 두면 그림이 완성된 것처럼 보입니다.

그런데 그 다섯 대가 같은 데이터베이스 한 대를 봅니다. 새벽에 그 한 대가 재시작되는 3분 동안 다섯 대 모두가 아무 일도 하지 못합니다. 사후 분석에 적히는 문장은 대개 같습니다. 서버는 이중화했는데 데이터베이스는 한 대였습니다.

같은 일이 서버 밖에서도 일어났습니다. 결제 대행사 계정의 비밀번호를 한 사람만 알고 있는 상태, 배포를 한 사람의 노트북에서만 할 수 있는 상태, 도메인 등록 기관 계정이 퇴사자 메일에 걸려 있는 상태가 모두 같은 성질을 갖습니다. 하나가 사라지면 전체가 멈춥니다. 단일 장애점은 이 성질을 가진 지점을 한 이름으로 불러 찾아내려고 만든 말입니다.

작동 방식

단일 장애점은 요청이 지나는 길에서 대체할 짝이 없는 칸으로 나타납니다. 찾는 방법은 경로를 한 줄로 늘어놓고 칸마다 이것이 지금 없어지면 무슨 일이 생기는지 묻는 것입니다.

협업 문서 제품이라면 경로는 대략 이렇게 놓입니다. 주소를 찾아 주는 이름 서비스, 요청을 나눠 주는 로드 밸런서, 웹 서버, 데이터베이스, 파일 저장소, 그리고 결제 대행사와 메일 발송 업체 같은 외부 창구입니다. 칸마다 셋을 확인합니다.

  1. 짝이 있는지 — 이 칸이 사라졌을 때 대신 받아 줄 것이 있는지 봅니다.
  2. 넘어가는 동작이 자동인지 — 짝이 있어도 사람이 눌러야 넘어가면 새벽 3시에는 짝이 없는 것과 같습니다.
  3. 넘어간 뒤에도 버티는지 — 두 대 중 한 대가 죽으면 남은 한 대가 두 배를 받습니다. 평소 사용률이 60퍼센트였다면 120퍼센트가 되어 곧 같이 죽습니다.

겉보기에 이중화된 것이 실제로는 한 벌인 경우가 가장 흔합니다. 유형이 셋입니다. 두 대가 같은 전원이나 같은 건물에 있는 경우, 두 대가 같은 계정과 같은 결제 수단에 걸려 있어 그 계정이 막히면 둘 다 멈추는 경우, 그리고 두 대가 같은 설정 파일을 읽어 그 파일이 잘못되면 동시에 같은 방식으로 고장 나는 경우입니다.

사람과 지식도 같은 칸으로 셉니다. 특정 작업을 한 사람만 할 수 있으면 그 사람의 휴가가 장애 대응 시간이 됩니다. 이 칸은 서버를 늘려서 해결되지 않고 문서와 권한을 나누는 방식으로만 줄어듭니다.

외부 창구는 우리가 두 벌로 만들 수 없는 칸입니다. 결제 대행사 하나에 걸려 있으면 그쪽이 멈출 때 우리도 멈춥니다. 이런 칸은 없애는 대신 멈춰도 제품의 나머지가 돌아가게 갈라 둡니다. 결제가 안 되는 동안에도 문서 편집은 되어야 합니다.

쓰이는 곳

가장 많이 쓰이는 자리는 새 구조를 그리는 설계 검토입니다. 쓰이는 방식은 넷으로 갈립니다.

  1. 설계 검토 — 경로를 그려 놓고 칸마다 짝을 묻습니다. 전부를 한 덩어리에 담는 모놀리스를 여러 조각으로 쪼개도 장애점이 저절로 사라지지는 않습니다. 조각 다섯 개가 같은 데이터베이스를 보고 있으면 그 데이터베이스가 그대로 단일 장애점입니다.
  2. 사후 분석 — 장애가 끝난 뒤 무엇 하나가 전체를 멈췄는지 묻습니다. 여기서 나온 칸이 다음 분기 작업 목록으로 올라갑니다.
  3. 약속을 정할 때 — 서비스가 정상 동작한 시간의 비율인 가동률을 계약서에 적으려면 장애점이 먼저 정리돼 있어야 합니다. 한 칸이 한 해에 세 시간 멈추는 구조에서 99.99퍼센트를 약속하면 그 약속은 지켜지지 않습니다.
  4. 사업 쪽 대비 — 기술로 없앨 수 없는 칸은 사고가 나도 사업이 이어지게 준비하는 사업 연속성 계획으로 넘깁니다. 데이터센터 한 곳이 통째로 멈추는 경우처럼 복구에 몇 시간이 드는 상황의 절차를 미리 적어 둡니다.

찾은 칸을 모두 없애지는 않습니다. 두 벌로 만드는 값과 멈췄을 때의 손실을 견줍니다. 한 시간 멈추면 계약 위반금이 나가는 칸은 바로 고치고, 하루 멈춰도 사과 메일로 끝나는 칸은 목록에 남겨 둡니다.

실무 용례

"웹 서버는 다섯 대인데 데이터베이스는 한 대예요. 여기가 단일 장애점입니다."

이중화가 경로의 일부에만 걸려 있다는 지적입니다.

"짝은 있는데 절체가 수동이에요. 새벽에 누가 누릅니까."

자동으로 넘어가지 않으면 짝이 없는 것과 같다는 판단입니다.

"이 배포는 태오 노트북에서만 돌아요. 이것도 장애점입니다."

서버가 아니라 사람과 지식에 걸린 칸을 짚은 말입니다.

페이지덱에서는 태오가 요청 경로를 일곱 칸으로 그려 두고 칸마다 짝과 절체 방식을 적어 둡니다. 지난 분기에는 데이터베이스를 복제본이 있는 구조로 바꿨고, 자동 절체까지 붙이는 데 3주가 걸렸습니다. 메일 발송 업체는 짝을 두지 않고, 대신 발송이 막히면 알림 메일만 늦어지고 문서 편집은 그대로 돌아가게 갈라 두었습니다. 규원은 기업 계약에 가동률 조항이 들어갈 때 이 표를 함께 봅니다.

흔한 오해

서버 대수를 늘리면 단일 장애점이 없어진다고 읽는 경우가 가장 많습니다. 대수가 늘면 한 대가 죽어도 남는다는 계산이 맞기 때문에 자연스럽습니다. 하지만 늘린 서버들이 공유하는 것이 그대로 남습니다. 같은 데이터베이스, 같은 설정 저장소, 같은 계정, 같은 건물의 전원이 그렇습니다. 웹 서버를 다섯 대로 늘려 놓고도 한 해에 두 번 전체가 멈추는 회사가 흔한 이유입니다. 확인은 대수가 아니라 경로로 합니다. 요청이 지나는 칸을 늘어놓고 짝이 없는 칸을 세는 쪽이 훨씬 빠르게 답을 줍니다.

모든 장애점을 없애야 한다고 읽는 것도 흔합니다. 위험이라는 이름이 붙어 있으니 전부 제거해야 할 것처럼 보입니다. 그런데 칸마다 두 벌로 만드는 값이 다르고, 외부 창구처럼 우리가 손댈 수 없는 칸도 있습니다. 전부 없애려 하면 한 해 예산을 다 쓰고도 목록이 줄지 않습니다. 실무에서는 두 갈래로 다룹니다. 손실이 큰 칸은 짝을 만들고, 나머지는 멈췄을 때 제품의 다른 부분이 계속 돌아가도록 갈라 둡니다. 멈춤을 없애는 것이 아니라 멈춤의 범위를 줄이는 쪽이 대개 값이 싸게 듭니다.

같이 보면 좋은 페이지

마지막 업데이트 2026-09-26