
데이터센터의 각종 하드웨어들을 최대한 고장나지 않도록 유지하고, 고장난 것을 교체하는 작업은 IT 서비스에서 매우 중요한 작업이다. 그 어떤 좋은 코드도 하드웨어 없이 실행될 수는 없기 때문이다.
AWS와 같은 클라우드는 엔지니어들을 인프라 관리에서 해방시켜주겠다고 약속하고 돈을 받는 서비스이다. 이들이 내미는 청구서를 받기 싫다면 직접 데이터센터를 건설하거나 임대하고 관련 인력을 채용해서 유지보수해야 한다. AWS 수준의 가용성과 내구성을 유지하면서 운영 비용도 더 저렴하게 할 수 있을 정도로 규모의 경제를 실현한 기업은 많지 않다. 결국 대부분의 IT 서비스 회사는 클라우드를 쓰게 된다. 4조원의 매출, 6400억의 영업이익을 기록한 우아한 형제들(배달의 민족)도 AWS를 쓰고 있는 것을 보면 돈을 아끼겠다고 클라우드 서비스를 벗어나는 일이 얼마나 어려운 일인지를 짐작할 수 있다.
그러나 클라우드 서비스는 마법이 아니다. AWS, GCP, Azure 등의 주요 CSP가 제공하는 인프라의 안정성이 경이로운 수준인 것은 맞지만 100%는 아니다.
자나깨나 불조심 같은 진부한 메시지를 전하려는 것이 아니다. 다른 하드웨어는 몰라도 디스크는 100%를 보장하지 못한다는 점이 매우 중요하다. CPU가 고장 났다면 다른 CPU로 교체하면 된다. 그러나 디스크는 고장 나는 순간 저장한 데이터에도 접근할 수 없어진다. 만약 디스크에 데이터베이스라도 저장해놨다면 사업을 접어야 되는 수준의 타격을 입게 될 것이다.
이 글의 목표는 클라우드 서비스의 하드웨어 중, AWS EBS와 같은 관리형 디스크의 안정성을 얼마나 믿을 수 있는지 숫자로 밝히는 것이다.
디스크에 적용할 수 있는 안정성 지표로 가용성(Availability), 신뢰성(Reliability), 내구성(Durability)이 있다. 가용성은 디스크에 정상적으로 접속이 가능함을 보장한다. 신뢰성은 데이터가 의도와 다르게 변조되지 않을 것을 보장한다. 내구성은 디스크 장치에 치명적인 고장이 발생해 데이터를 잃지 않는 것을 보장한다. 가용성과 내구성이 다소 헷갈릴 수 있는데 가용성은 데이터는 남아 있지만 잠시 접속이 불가능 했어도 떨어지는 좀 더 예민한 지표이다. 반면 내구성 지표는 완전한 데이터의 손실이 발생해야 떨어진다. 디스크 장애로 발생하는 가장 무서운 사건은 영구적인 데이터 손실이므로 이 글에선 내구성을 중심으로 안정성을 측정할 것이다. 시간 한계상 분석 대상은 가장 흔하게 사용되는 AWS의 gp3로만 한정한다.
연간 고장률(AFR)이란 1년동안 어떤 장비에 영구적인 고장이 발생할 확률을 의미한다. gp3의 내구성은 99.8% ~ 99.9%이다. gp3 1000개를 임대했을 때 딱 한 대가 고장날 확률이다. 그런 일은 복권 당첨만큼 일어나기 힘들어보이니 신경을 꺼도 될거 같이 보인다. 그러나 실제로는 문제가 훨씬 복잡할 수 있다.
예를 들어 관계형 DB를 디스크 1000개에 샤딩해놓았는데 한 개가 손상되었다면 어떨까? 이 경우 서비스의 내구성을 유지하려면 디스크 중 한 개라도 고장나선 안 된다. 즉 실제적인 내구성이 99.9%가 아니라, 99.9%를 1000번 곱한 36.76%가 된다. (곱의 법칙) 1년 이내에 데이터 전체를 잃어버릴 확률이 63%라는 것이다.
gp3는 논리적으로는 디스크 한 개로 보이지만 물리적으로는 여러 개의 디스크에 백업되어 있어 데이터센터의 디스크보다 훨씬 내구성이 높다. 그런데도 서비스가 도저히 불가능 할 정도의 내구성이 나오는 것이다.
만약 1000개의 디스크를 모두 샤딩에 사용하지 않고, 미러링을 했다면 어떨까? 500개의 샤드를 각각 두 개의 디스크로 미러링했다고 가정해보자. 개별 샤드가 고장나려면 두 개의 디스크가 모두 고장나야 한다. 따라서 샤드의 고장 확률은 0.1%가 아니라 0.0001%()가 된다.
서비스 전체 내구성은 99.95%가 된다.
앞서 소개한 두 시스템은 완전히 똑같은 장비를 똑같은 개수만큼 사용한다. 그러나 시스템 붕괴 확률은 비교하는게 무의미할 정도의 차이가 난다. 장비 자체의 신뢰성보다 데이터의 저장 구조가 훨씬 중요한 요소임을 알 수 있다. 내구성이 99.999%인 io2를 gp3 대신 사용하더라도 저장 구조가 취약하다면 효과가 제한된다.
디스크 하나의 손실이 곧 전체 데이터의 손실이 되는 구조를 만들어선 안 된다. 아무리 gp3의 내구성이 높은 편이라 해도 RAID0은 파멸이 예정된 구조라고 보면 된다. 이는 앞서 소개한 1000개 샤드와 같은 극단적으로 큰 클러스터의 얘기만이 아니다. 작은 시스템을 여러개 운영하더라도 똑같이 문제가 발생한다. 예를 들어 5개의 디스크를 RAID0으로 구성한 서버가 50대 있다 가정하자. 1년 이내에 한 대의 서버라도 영구적인 데이터 손실이 발생한 것을 내구성 손상으로 가정했을 때, 전체 데이터 내구성은 77.87% 밖에 안 된다.
물론 RAID를 적용하면 추가적인 디스크 비용이 무조건 발생하게 되어 있다. 그러나 가용성도 아니고 데이터 내구성이 90%가 안 되는 서비스는 정말 사용하기 어렵다. 이 비용을 추가하는 것이 사업성에 치명적인 영향을 준다면 차라리 접는게 나을수도 있다.
데이터의 영구적 손실을 유발하는 원인은 디스크의 기계적 고장만이 있는 것이 아니다. 서버가 랜섬웨어에 감염되거나 작업자가 실수로 데이터를 삭제할수도 있다. 디스크의 기계적 성능에는 이상이 없지만 저장된 데이터가 의도치 않은 방향으로 변질된 것이다.
변조 시점 이전의 데이터를 백업해놓았다면 피해를 줄일 수 있다. 백업 저장소에서 메인 서버로 데이터를 복사하느라 가용성에 손상이 올 수는 있지만 적어도 데이터만큼은 지킬 수 있을 것이다.
마찬가지로 백업도 비용이 발생한다. 비용을 줄이려면 복구 속도를 타협해야 하는 경우가 대부분이다. s3 같은 느리지만 저렴한 저장소를 백업 용도로 사용하는 것이 대표적인 예이다.
주의할 점은 백업을 RAID와 같은 디스크 복제로 대신할 수 없다는 것이다. 앞서 말했듯이 데이터의 변조는 디스크의 기계적 이상에서 오는 것이 아니기 때문이다.
클라우드의 관리형 서비스들은 절대로 고장나지 않는 마법을 행하는 것처럼 보인다. 실제로 그들이 제공하는 내구성과 가용성은 만족스러운 수준이다. 그러나 개별 하드웨어의 고장률이 곱의 법칙으로 중첩되면 서비스 내구성을 급격히 떨어트린다. 특히 고장도 자주 나고 새 자원으로 대체하기도 어려운 디스크는 클라우드의 마법을 깨트리는 주범이다. 디스크 개별 손상이 전체 데이터 손상으로 퍼지지 않도록 RAID를 도입하고, 기계적 손상 이외의 원인에 의한 데이터 손실을 방지하기 위해 백업을 하자. 여기서 나오는 비용이 사업성을 심각하게 해친다면, 다른 면이 아무리 매력적이라도 사실상 유지할 수 없는 서비스라고 보면 된다.