운영체제에서도 정리했지만, 조금씩 설명이 다른 부분이 있어서 DB에서도 추가로 정리한다.
RAID
여러 개의 디스크를 사용하여 장애에 대비하는 기법
Redundant Array of Independent Disks 의 약자로, 여러 디스크의 배열을 두고, 데이터를 저장하는 방법이다.
RAID는 논리적으로는 1개의 디스크로 보이지만, 실제 내부적으로는 여러 개의 디스크를 구성하는 것이다.
RAID는 크게 2가지 개념이 있다.
1. 데이터 스트라이핑
2. 중복 (redundant)
1번은 데이터를 여러 곳에 나누어 저장한다는 의미로 성능 향상에 효과적이다.
2번은 데이터를 중복해서 저장한다는 의미로 장애에 강해져서 신뢰성 향상에 효과적이다.
RAID는 데이터 스트라이핑과 중복을 구현한 디스크 배열이다.
사용자가 디스크 I/O 요청을 보내면, 물리적인 디스크 블록 집합을 식별해야 한다.
이 블록은 하나의 디스크에 존재할 수도 있고, 여러 디스크에 분산 저장되어있을 수도 있다.
분산 형태에 따라서 입출력 요청에 관여하는 디스크의 수가 결정되고, 데이터는 스트라이프(strip) 단위로 쪼개서 여러 디스크 상에 분배된다.
분배할 때는 라운드 로빈 알고리즘에 따라, D개의 디스크가 있을 때 i 번째 조각 조각은 i % D 디스크에 저장한다.
(사실 그림으로 보면 이해가 확 된다. 운영체제 정리글을 참고해보자.)
데이터 스트라이핑을 통해 분산 저장하면, D개 디스크로부터 동시에 블록을 읽어올 수 있으므로 대용량의 연속된 데이터를 가져올 때 읽기 성능이 매우 빨라진다.
(이때 스트라이핑 단위가 비트인 경우 모든 디스크에서 헤드가 동시에 움직여야 하기 때문에 경우에 따라서는 단일 디스크와 성능차이가 크게 안날 수도 있다.)
다음으로 중복에 대해서 이야기를 하려면 먼저 장애 발생 평균 시간 (MTTF, Mean Time-To-Failure) 에 대해 정리해야 한다.
만약 단일 디스크의 MTTF 가 5만 시간이라고 한다면, RAID는 분단 디스크를 사용하기 때문에 100개 디스크로 구성된 경우 MTTF가 50000 / 100 = 500 시간 = 21일로 크게 감소한다.
따라서 이 문제를 피하기 위해 데이터를 디스크에 중복해서 저장하거나, 장애에 대응하기 위핸 체크 디스크를 두는 방법을 고민할 수 있다.
특히, 장애를 확인하고 복구하기 위해 패리티 기법을 사용할 수 있다.
패리티 기법은 어느 한 디스크에서 발생한 장애를 복구하는데 사용될 정보(패리티 비트/스트라이프)를 별도 디스크에 함께 저장하는 기법을 말한다.
예를 들어 D개의 디스크에 들어있는 데이터 첫 비트를 확인했을 때, 1의 개수를 센 뒤, 이 개수가 홀수인지 짝수인지를 체크 디스크에 패리티 비트로 저장할 수 있다. (홀수 = 1, 짝수 = 0)
그리고 손상된 디스크의 첫 비트를 복구할 때는 손상되지 않은 D-1개 디스크의 1의 개수를 센 뒤 패러티 비트와 비교해서 손상된 디스크의 첫 비트가 0인지 1인지를 결정하면 된다.
중복 레벨
설명을 위해 4개 디스크가 있다고 가정한다.
RAID를 사용하지 않으면 이 시스템은 정확히 4개의 데이터 디스크로 구성되어있다.
RAID를 사용하면 중복 레벨에 따라 0~4개의 디스크가 추가된다.
레벨 0 (중복 없음)
RAID를 쓰나, 종복하지 않고 데이터를 스트라이핑 단위로 디스크에 분산해서 저장한다.
따라서 데이터 조회 대역폭을 최대화 할 수 있다.
그러나 MTTF가 대폭 감소하므로 신뢰도가 하락한다.
공간은 100% 활용한다.
장애가 일어나서 데이터를 조금 유실해도 괜찮다 하면 이 정도로 둘 수도 있다.
레벨 1 (미러)
4개의 디스크를 추가하여 데이터를 중복해서 저장한다.
데이터를 수정/추가/삭제 할 때는 양쪽 디스크에 모두 반영해주어야 하므로 비용이 매우 많이 든다.
또한 데이터 수정은 동시에 하지 않는데, 동시에 수정하다가 정전이 나서 동시에 장애가 발생하면 무엇이 맞는 값인지 기준을 정할 수 없게 되기 때문이다. 따라서 보통 한쪽에 데이터 변경사항을 반영하고 다른 쪽에 이를 복제해서 넣는 방법을 사용한다.
장점은 데이터를 읽는 성능이 대폭 증가하고, 장애에도 강해지는 장점이 있다.
4개의 디스크를 추가로 활용해야 하기 때문에 공간 활용도는 50%로 감소한다.
레벨 0 + 1 (레벨 10)
레벨0과 레벨1을 조합한 것
GPT는 데이터를 먼저 미러링하고, 이를 스트라이핑 한 것이라고 말한다.
이렇게 먼저 미러링해서 RAID 1을 구성해둔 (Disk 0, 1) (Disk 2, 3) 을 스트라이핑해서 분산저장한 것이다.
공간 활용도는 똑같이 50% 이고, 디스크 조회시 병행 조회가 되므로 대역폭이 늘어나는 효과도 그대로 있다.
레벨 2
비트 단위의 스트라이핑을 사용한다.
중복 기법으로는 해밍코드를 사용하며, 4개 디스크 사용시 점검 디스크로 3개의 디스크가 필요하다.
하나의 디스크에 대한 수정이 발생할 때마다 매번 7개 디스크에 대해 수정 + 쓰기 작업이 발생하므로 비용이 많이 든다.
(디비 수업에서 해밍코드와 패러티 체크 기법을 자세히 설명하지는 않았다.)
레벨 3
레벨2는 패리티 비트를 통해 장애가 발생한 디스크를 특정해서 식별할 수 있다.
그런데 디스크 컨트롤러도 장애가 발생한 디스크를 식별할 수 있기 때문에 굳이 패리티 비트를 사용해서 식별할 필요가 없다.
그래서 레벨 2는 자주 사용하지 않고,
장애가 발생한 디스크 식별은 디스크 컨트롤러에게 맡기고 패러티 정보만 '단일 디스크에 두자' 라는 아이디어에서 등장했다.
역시 비트 단위의 스트라이핑을 사용하며, 장애 발생시 대응을 위해 점검 디스크 1개를 추가로 두어 5개 디스크를 사용한다.
신뢰도를 얻는데 생기는 부하가 제일 적은 레벨이다.
레벨 4
블록 단위의 스트라이핑을 사용한다.
하나의 디스크에 대한 조회 요청시, 그 디스크 단독으로 요청을 처리할 수 있다.
또한 데이터 변경 시 하나의 데이터 디스크와 하나의 점검 디스크만 사용해서 패러티를 업데이트할 수 있다.
(물론 여전히 점검 디스크는 병목이다)
레벨 5
모든 패러티 블록을 균등하게 분산해서 저장하여 레벨 3, 4의 점검 디스크 병목 문제를 해소한다.
더 높은 수준의 병렬성을 제공하지만, 소규모 데이터 수정 요청에 대해서는 패러티 업데이트 문제로 인데 레벨 1보다 효율이 떨어진다.
구체적인 예시를 보면, 위와 같이 4개의 디스크를 두었을 때, 스트라이프 단위는 블록이라고 해보자.
첫번째 디스크에는 블록에 110, 두번째 디스크의 블록에 101, 세번째 디스크 블록에 001을 저장했다면 4번째 디스크 블록에는 패러티 정보가 들어간다.
이때 패리터정보는 3개 디스크에 저장한 데이터를 xor 연산한 값을 저장한다.
그래서 이렇게 xor을 계산한 값을 패리티로 넣어준다.
이를 이용하면 디스크 블록 하나의 값이 완전히 유실되더라도, 패리티와 나머지 디스크 값을 통해 유실된 블록의 값을 온전히 복구할 수 있다.
이때 패리티 비트는 하나의 디스크 블록에 몰아서 저장하는 것이 아니라 여러 디스크가 돌아가면서 저장한다.
마지막으로 디스크 스트라이프에 2개 블록에만 데이터가 있는 상황이라고 해보자.
그러면 2개 블록을 XOR 연산하여 패리티 비트를 계산하여 저장한다.
이후에 비어있는 스트라이프에 신규 데이터를 삽입하면 이 데이터를 그대로 추가하고, 패리티 비트는 기존의 패리티비트 값과 신규 추가된 데이터를 xor 하면 업데이트 할 수 있다.
(이것이 레벨 2 와의 차이점이다. 해밍코드에서는 모든 디스크의 비트를 확인해야 하기 때문이다.)
레벨 6 : P + Q
매우 큰 규모 시스템에서 사용하기 좋은 방식으로, 여러 군데 디스크에서 동시에 장애가 발생하는 상황을 대비하여 점검 디스크를 2개 사용하여 점검 디스크까지 중복을 적용한다.
(장애가 발생한 디스크를 대체하기 전에 장애가 또 발생할 수 있다.)
RAID 레벨을 선택하는 기준은 다음과 같다.
레벨 0 : 데이터 손실이 중요하지 않은 경우
레벨 0 + 1 : 미러링 비용이 과다하지 않은 소규모 시스템, 데이터 기록 연산 (조회 위주 시스템) 위주의 시스템에 적합하다.
레벨2 < 레벨3 : 디스크 컨트롤러가 장애 디스크를 식별할 수 있기에 레벨 3이 더 낫다. 비트 단위 스트라이핑이 특징이다.
레벨4 < 레벨5 : 레벨4는 블록단위 스트라이핑을 하므로, 소규모 데이터 요청에는 비효율적일 수 있다. 레벨5는 점검 디스크를 분산하여 병목을 해소한 방법이므로 더 낫다.
레벨5 가 소규모, 대규모에 범용적으로 좋은 시스템이다.
만약 레벨5보다 더 높은 수준의 신뢰도가 필요하다면 점검 디스크까지 중복해서 관리하는 레벨6을 고려할 수 있다.
'CS > 기초데이터베이스' 카테고리의 다른 글
[데이터베이스] 28. 보안 응용 (0) | 2024.12.09 |
---|---|
[데이터베이스] 27. 보안 기초 (0) | 2024.12.09 |
[데이터베이스] 26. 정규화 (1NF ~ 5NF) (0) | 2024.12.08 |
[데이터베이스] 25. 동시성 제어 & 장애 복구 (0) | 2024.12.07 |
[데이터베이스] 24. 트랜잭션 & 직렬 가능성 (0) | 2024.12.07 |