글
Hadoop 데이터노드 장애와 데이터 손실
하둡을 공부하고 운영해보신 분이라면 데이터를 기본 3개의 64MB 복제본으로 나누어 분산 저장한다는 것을 잘 알고계실 겁니다. 이로인해 호스트나 디스크 장애가 발생할때도 하둡은 나머지 2개의 복제본으로 데이터 가용성을 제공하고 부족한 복제본은 다른 호스트에 복사합니다. 그렇기에 호스트나 디스크 장애 쯤이야 자동으로 극복하고 하둡을 사용할 경우 100% 서비스 가동률을 장담할 것이라 안심합니다.
여기까진 이론적인 얘기고 실제 50대 이상의 클러스터를 구성하고 TB 단위의 데이터를 보관하다보면 아주 사소한 하둡 설정 실수에도 클러스터는 예민하게 반응합니다. 운영을 하다보면 상당히 자주 볼수 있는 장애 유형은 디스크 장애입니다. 아무래도 TB단위의 데이터를 매 시간 처리하다보니 일반적인 애플리케이션 보다는 디스크 및 호스트 장애율이 높습니다. 50대 규모의 하둡 클러스터를 운영하다보니 근래엔 1주일에 한번꼴로 디스크 장애가 발생합니다. 호스트들도 점점 늙어가나 봅니다 -.- 200~300대 이상의 클러스터에선 매일같이 디스크 장애가 난다해도 무난하겠죠? 이때 hdfs-site.xml의 dfs.datanode.failed.volumes.tolerated 설정이 제대로 안되어있으면 디스크 하나가 고장나도 데이터노드가 셧다운됩니다.
본론으로 가서 하둡 운영을 하다보면 디스크 원인 말고도 한두개의 데이터노드가 죽는 경우가 많은데, 과연 이 클러스터는 몇 대의 데이터노드 장애까지 허용할 수 있는지 몇 대의 데이터노드가 디커미션 없이 죽었을때 블록이 손실되는 현상이 발생할까? 라는 호기심이 듭니다. 그래서 간단하게 각 호스트 장애 발생시 3개의 복제본을 손실할 확률을 계산하는 방법을 설명하겠습니다.
37대의 데이터노드가 있고 각 블록은 3대의 복제본을 관리한다고 가정합시다. 이중 5대의 데이터노드 장애 발생시 특정 블록이 모든 복제본을 손실할 확률은 무엇일까요?
바꿔 말하면, 50개의 구슬이 있고 그 안엔 3개의 파란구슬과 47개의 빨간구슬이 있습니다. 이중 5개의 구슬을 무작위로 뽑았을때 3개의 파란구슬이 뽑힐 확률은 무엇일까요? 확률 수업이 새록새록할 겁니다.
P(A|B) = P(5개의 장애노드가 3개의 복제본을 포함 | 37대의 노드중 3대의 복제본 노드 선택)
= (5C3)/(37C3) = 10 * (3/37 * 2/36 * 1/35) = 10 / 7770 = 0.0013
즉 0.13 % 의 확률을 가집니다.
10대의 노드가 장애가 발생한다하면 1.5%가 되고, 37대 장애가 생기면 100%겠죠?
데이터노드 장애가 늘어날 수록 확률이 높아지는걸 볼 수 있습니다. 눈으로 보기엔 블록 손실 확률이 매우 적어보입니다. 하지만 우리는 블록 한개를 운영하려고 하둡을 도입하지 않습니다. 다음 문제를 풀어봅시다.
위의 질문에서 클러스터에 100TB의 데이터가 64MB의 블록으로 쪼개어 저장되어 있었다면 모든 복제본을 손실한 블록(missing block)의 수는 몇개일까요?
100TB를 64MB블록으로 나누면 1562500개의 블록이 존재합니다. 위에서 계산한 확률을 곱하면 0.0013 * 1562500 = 2031
2031개의 블록이 손실됩니다. 손실된 블록과 연관된 파일은 접근이 불가능해진단 말이며 금융 시스템 같은 경우 매우 치명적인 현상입니다.
이러한 계산을 통해 본인의 클러스터가 몇대의 데이터노드 장애를 허용할 수 있는지 알 수 있고 미리 데이터 장애에 대비할 수 있습니다.