Data Engineering/Hadoop

Hadoop RAID, Eraser Coding

cstory-bo 2024. 1. 8. 23:25

Data Fault Tolerance

하둡은 fault tolerance를 위해 
SW로 복제본을 만들고 다른 머신, 다른 렉, 다른 데이터 센터로 분산 시킨다.
HW로는 RAID 구성을 두어 fault tolerance를 더욱 높인다.

RAID

RAID는 Redundant Array of Inexpensive Disks를 말한다.

하드 디스크를 여러 개 독립적인 드라이브의 배열로 가상화하는 방식이다.
이를 통해 performance 뿐만 아니라 capacity, reliability를 개선할 수 있다.

RAID 0

https://www.dataplugs.com/wp-content/uploads/2018/08/raid0-1.jpg.webp

RAID 0은 데이터를 블럭단위로 나누고 전체 데이터 영역에 array로 분포하도록 나누는 방식이다.
Drive 개수 만큼 동시에 read, write가 가능하여 속도가 빠르다. storage 용량도 모두 사용하고 오버헤드도 없지만,
dedundant 하지 않다. 즉 드라이브 하나가 고장하면 해당 드라이브의 모든 블럭 데이터가 유실된다.

RAID 1

https://www.dataplugs.com/wp-content/uploads/2018/08/raid1-1.jpg.webp

같은 데이터에 대해 최소한 2개의 드라이브를 사용하는 방식이다.
그래서 0의 단점을 고쳐 하나의 드라이브가 고장나도 데이터가 유실되지 않는다.
그리고 2개 중 어디서든 read가 가능하여 read 성능이 좋아진다.

그렇지만 write는 2번 이상 해야하기 때문에 write 속도는 반대로 느려지고
실제 저장된 데이터는 RAID0에 비해 반만 들어가기 때문에 capacity가 전체 디스크 대비 50%로 줄어든다.

RAID 5

https://www.dataplugs.com/wp-content/uploads/2018/08/raid5-1.jpg.webp

여기서 Parity bit를 사용하여 데이터를 복구해 유실을 방지한다.
Parity bit로 장애가 나지 않은 디스크의 모든 블럭들을 xor 연산을 하면 유실된 데이터를 복구할 수 있다.

RAID 5는 최소한 3개 이상의 드라이브로 구성된다.
하나의 데이터 블럭이 여러 드라이브에 걸쳐 저장되도록 나누고 복제본이 아니라 parity 블럭을 만들어 다른 드라이브에 저장한다.

이렇게 되면 장애로 인한 데이터 유실을 방지할 수 있으며, read 속도도 빠르다.
그리고 전체를 모두 복제하는 것이 아니기 때문에 capacity도 높다.

하지마 여전히 write 속도는 느리다. 그 이유는 parity 블럭을 계산해야하기 때문이다.
그리고 2개 이상 드라이브에 장애가 나면 복구할 수 없다.

그래서 RAID 6이 나왔다.

RAID 6

https://www.dataplugs.com/wp-content/uploads/2018/08/raid6-1.jpg.webp

RAID 5와 유사하지만 parity 블럭 2개를 만들어 최소한 4개의 드라이브로 구성한다. 그리고 parity 연산을 XOR이 아닌 Reed-Solomon 부호로 생성한다.

이렇게 하면 2개의 디스크 장애에도 복구할 수 있다. read는 RAID 5와 비슷하게 빠르지만

parity 블럭을 하나 더 만들어야하기 때문에 write는 더 느려진다.

RAID 10

https://www.dataplugs.com/wp-content/uploads/2018/08/raid10-1.jpg.webp

RAID 0과 RAID 1의 장점을 합친 시스템이다.
RAID 1처럼 복제본을 유지하면서도 RAID 0처럼 서로 다른 드라이브에 나누어 분배한다. 
그래서 최소한 4개의 드라이브가 필요하다.

RAID 0 정도의 속도와 RAID 1 수준의 dedundancy를 보장한다.
하나의 드라이브에 장애가 생겨돈 복제본이 있어서 데이터 유실 방지할 수 있다.

하지만 capacity가 50%이기에 RAID 5,6보다 비싼 방식이다.

Summary

Features RAID 0 RAID 1 RAID 5 RAID 6 RAID 10
Minimum number of drives 2 2 3 4 4
Fault tolerance None Single-drive failure Single-drive failure Two-drive failure Up to one disk failure in each sub-array
Read performance High Medium Low Low High
Write Performance High Medium Low Low Medium
Capacity utilization 100% 50% 67% – 94% 50% – 88% 50%
           
Typical applications High end workstations, data logging, real-time rendering, very transitory data Operating systems, transaction databases Data warehousing, web serving, archiving Data archive, backup to disk, high availability solutions, servers with large capacity requirements Fast databases, file servers, application servers

Eraser Coding

hadoop의 Eraser Coding은 RAID 방식을 소프트웨어로 구현한 것이다.
그 중에서도 RAID 5, 6과 같이 Parity를 이용하여 복구한다.

N : 몇 개의 chunk로 나눌 지
K : 몇 개의 parity로 구성할 지
RS(N,K)로 표시

N개의 블럭 조각을 연산을 통해 K개의 패리티 블럭을 생성한다.
최대 K개의 데이터가 손샐되어도 원본 데이터 복구가 가능하다.

http://db-blog-multimedia.web.cern.ch/db-blog-multimedia/ekleszcz/erasure-coding-hdp3/2.png

 

추가로 Stripping도 하여 논리적인 블럭을 더 작은 단위인 cell로 나눈다.

https://clouderablog.wpenginepowered.com/wp-content/uploads/2019/08/hdfs-erasure-f31.png

그냥 parity block을 만드는 것과 stripping을 진행한 후에 만드는 것과 성능에 차이가 있다.
write 할 때는 블럭을 round robin으로 돌면서 여러 개로 나뉜 셀들을 저장한다.
이 방법을 통해서 논리적인 블럭 1개에 대해서 병렬 처리가 가능해진다.

그리고 무엇보다 데이터 복구 가능성을 높이면서 동시에 storage의 capacity loss를 줄일 수 있다.

그리고 stripped 블럭으로 병렬성이 더 좋아지기에 read 성능은 더 좋아진다.

그렇지만 encoding 과정이 추가되기에 write 성능이 떨어진다.