카카오 장애로 생각해보는 서버 이중화
금일 사상 초유의 카카오 서비스 전면 장애가 발생했습니다. 현재 보도된 뉴스에 따르면 판교 데이터센터의 화재로 운영중이던 서버의 전원을 내려서 발생한 장애라고 하는데요, 사실 이건 카카오의 문제라기보단 재난에 가까운 사건이긴 합니다. 이런 재난에 가까운 사건을 막을 수 있는 방법은 없을까요? 사실은 서버 이중화 혹은 고가용성(High Availability) 이란 주제로 다양한 방법이 존재합니다. 간단하게 다음과 같은 몇가지 전략들이 있습니다. 1. Active-Standby 평소에는 특정 서버에서 서비스를 운영하고 해당 서버가 장애가 발생하면 대기중인 서버를 투입하여 대응하는 방법입니다. Active 서버는 변경되는 데이터가 있을때마다 Standby 서버로 전달하여 데이터를 동기화함으로써 장애가 발생할 경우 그 즉시 투입이 가능한 상태가 되어야 합니다. 아키텍쳐가 심플하여 간단한 구성 및 장애대응이 가능하지만 장애가 발생하지 않는다면 사용하지 않는 Standby 서버에 대한 비용이 계속 발생한다는 문제가 있습니다. 2. Active-Active 서로 다른 서버가 모두 서비스를 운영하는 형태입니다. 비용과 장애 대응 측면에서 가장 이상적인 방법이지만 아키텍쳐가 복잡하고 자칫 다른 사이드 이펙트가 발생할 가능성이 큰 형태입니다. 데이터 변경이 발생할 수 있는 요청들이 각 Active 서버에 분산되서 전달할 경우 이 데이터 변경들에 대한 순서를 보장하는게 쉽지 않기 때문입니다. 물론 불가능한건 아니지만 그만큼 많은 고민과 구축하는데 시간이 오래 걸릴 수 있는 형태입니다. 3. Sharding 데이터를 여러곳의 서버에 분산시키고 사용자의 요청을 받았을때 데이터가 있는 서버로 전달하도록 구축하는 방식입니다. 이렇게 하면 특정 서버가 장애가 나더라도 전면 장애가 발생하는걸 피할 수 있습니다. 또한 위에서 언급한 Active-Standy 를 적용하면 특정 서버에 장애 발생시 Standby 쪽을 활성화시켜 빠른 장애 대응이 가능할 수 있습니다. Active-Active 형태처럼 복잡하지 않으면서 간단한 장애 복구가 가능한 구조인데요, 단점을 꼽자면 분산된 데이터가 어디있는지에 대한 메타데이터를 잘 관리해야하고 자칫 잘못하면 이부분이 SPOF 가 될 가능성이 높습니다. 물론 카카오가 위와 같은 이중화 전략을 안해서 이번 장애가 발생했다고 보진 않습니다. 카카오 같은 대규모 서비스의 경우 아키텍쳐가 복잡하고 이를 위한 이중화 대응에 많은 고민과 노력이 필요했을텐데요, 그러다보니 일부 코어 서비스의 이중화 작업상에 이슈가 있었거나 이를 복구할때 예상치 못한 이슈가 발생하여 이번 장애가 발생한게 아닐까 조심스럽게 추측해 봅니다. 주말에 고생하고 계실 카카오 관계자분들 모두 힘내시고 장애 복구가 빨리 되길 기원합니다. 이번 장애를 발판삼아 카카오가 서버 이중화 및 고가용성에 대한 best practice 를 보여주면 좋겠습니다.