Host attached via an I/O port
: io 포트를 활용하여 시스템에 바로 들러 붙는 것
: 호스트에 직렬로 붙이는 것
→ PCI, SATA, IDE(PC에서 사용하는 인터페이스), SCSI(서버같은 장치)
Network attached via a network connection
→ NAS, SAN
스토리지를 연결한 네트워크
NAS보다 훨씬 큰 것
네트워크 자체가 하나의 스토리지
SAN을 구성한 네트워크는 일반 네트워크가 아니라 전용의 인터 커넥션 네트워크를 사용한다. 빠르게 동작하도록
대량의 데이터를 빠르게 처리해야 하는 곳 → 백엔드, 서버 사이드, 데이터 센터
NAS와는 다르게 블락 레벨로 접근할 수 있게 되어 있다
샌은 엄청나게 큰 하드디스크라고 생각하면 된다. 전체가 하나의 파일 시스템
File systems for SAN is another story (e.g. GFS)
넷플리스에서 샌을 이용하여 영상데이터를 잘 정리해두고 스트리밍 서비스를 한다.
서버의 스토리지 시스템
NAS와는 다른 점이 나누어져 있는 스토리지 어레이들이 하나로 논리적으로 묶인다
Block-level access → Block 단위로 잘라서 넣는다
Disks and the OS
운영체제가 디스크를 관리할 때 피지컬과 로지컬 영역을 나누어서 관리를 한다.
로지컬 영역에
로지컬 영역이 하이 레벨
Disk logical block (disk block #)
피지컬 영역이 로우 레벨
Physical disk block (surface, cylinder, sector
Interacting with disks
Disk performance
이렇게 하면 640 실린더를 움직여야 함
Disk-Scheduling 은 어떤 상황에서 가장 효과가 좋을가?
-> 디스크 엑세스가 많은 경우 Disk-Scheduling이 유효하다
과거에는 운체가 하던일을 디스크 컨트롤러가 하드웨어적으로 처리를 하기 때문에 더 빠르게 처리가 가능하다
Intelligent features
Request retry on hardware failure
: Virtual memory쓸 때 필요
언제 얼만큼 만들어 쓸 것인가 중요
여러개의 디스크를 어떻게 하면 효과적(신뢰성+ 성능)으로 쓸 수 있는지
깨진 데이터를 복구하는 code
Parity 는 error-correcting codes 보다 복구할 수 있는 범위가 적다.
Mirroring은 완전히 복사본을 만드는 것이라면 이건 기존의 원본 데이터를 복구 가능한 형태로 줄여두는 것.
error-correcting codes는 조금 긴 대신에 복구할 수 있는 확률이 높다. 반면 Mirroring 코드는 짧은데 복구할 확률이 낮아진다.
하드 디스크 중복 작성에 Mirroring 보다 용량을 줄일 수 있다는 장점
Mirroring 은 있는 그대로 복사를 했으니까 안되면 바로 접근했을 때 data가 튀어 나오는데 이건 복구하기 위해서 연산이 필요하기 때문에 오버헤드가 크다.
⇒ 1,2 번 다 안 사용, 1번만 사용, 2번만 사용, 12번 다 사용 총 4가지 경우의 수
Data striping: bit-level vs. block-level
bit-level
: 써야할 하나의 disk block이 있다block-level
💁♀️ 어떨 때 가장 효과가 좋을까?
넷플릭스에서 운영하는 데이터 센터에 디스크가 3개가 있다. Data striping을 사용하지 않는다고 가정. 사람들이 많이 보는 영화를 1, 적당히 보는 영화를 2, 고전영화를 3이라고 한다. 각각의 디스크에 1, 2, 3을 저장. 데이터 서버에 연결이 되어 있다. 수많은 클라이언트들이 1번만 보면 1번만 고생하고 나머지 둘은 고생을 하게 된다.
그런데 만약 각각의 디스크에 1-1, 1-2, 1-3 컨텐츠를 삼등분해서 나누어 저장을 하면 병렬적으로 노는 디스크가 없도록 분산되어 동작한다.
✔ bit level이 좋을까 block level이 좋을까?
spatial locality 때문에 block레벨로 읽고 저장하는 것이 좋다
⇒ striping을 안하는 방식 하나, bit level쓰는 방식 하나, block level하나 총 3가지
⇒ 3x4 =12 r가지 중 유의미한 것이 10개
Multiple Disks vs. RAID
- Disck Controller : 각각의 디스크를 별개의 디스크로 바라본다
- RAID : 디스들을 하나의 디스크로 보게 된다.
- 무조건 성능, 신뢰성을 제로
- block level에 data striping
- 성능보다 신뢰성
- 미러링만 한다. no data striping
- 신뢰성은 확보할 수 있지만 비싸다
- 성능도 신리성도 둘 다
- error-correcting codes (ECC)를 사용해서 3개의 레코드로 구성된 에러 코렉팅 코드를 4-6에 유지, 원래 데이터를 0-3에 유지
- 연산을 통해 복구가 가능
- 연산이 많이 필요하고 striping을 bit level로 했기 때문에 더 안쓰이는 기법이다.
- bit 레벨
- error-correcting codes를 썼더니 디스크가 미러링하는 것과 별차잉가 없네? 더 줄여보자
- parity 적용
- bit level striping 을 수행하기 때문에 성능이 좋진 않음! 안씀
- RAID2와 비교했을 때 용량을 적게 사용
- 앞에 있는 데이터가 문제가 생겼을 때 복구가 가능하도록
- RAID3의 단점인 bit level striping 을 block level로 바꾼 것
- 신뢰성을 높이기 위해 parity bit 사용
- 성능이 좀더 향상
- 비트를 써서 스패셜 로켈리티 확보가 안되서 성능이 안나오니
- 3를 block level로 바꾼 것
- block level로 data striping을 쓰고 신뢰성을 위해 parity를 사용하는데 이 parity도 striping 하는 것이다
- 한 디스크의 복구 코드를 몰아서 저장하면 A0가 변경이 되면 4에 있는 Parity도 바꾸어주어야 한다. 그러다보면 acsess 나 write되는 횟수가 4번 디스크에 몰리게 된다.
- 예를 들어 a0, a5, a10, a3이 변경되면 0-3 디스크는 각각 한 번씩만 접근이 되는데 4번 디스크는 4번이 접금이 된다 →
bottle neck
- parity bit를 2개를 사용 (RAID 5가 신뢰성이 좀 부족한뎅? 해서 나옴)
- error correcting code 사용
- disk의 오버헤드가 커진다.
그런데 디스크가 어처피 저렴하니까 하나 더 붙이는것 쯤이야 그렇게 비싸진 않다.
- RAID 0 : 신뢰성은 개나 줘버려 난 오직 성능만을 볼거야 → block striping 을 한덩어리 두고
- 신뢰성을 보장하기 위에 위에서 만든 한 덩어리를 복사 떠두면 되겠다.
- RAID 1 으로 미러링 되어 있는 것들을 RAID0로 묶어버리자
- RAID 0+1 보다 성능이 좋다
→ 예를 들어 2번 디스크의 a6이 망가졌다. 그러면 6의 a6에 접근하면 되겠다. RAID1로 묶는 단위가 RAID0로 묶여있는 단위가 통째로 미러링이 된 것이다. RAID는 묶여 있는 디스크가 별개로 있다고 하더라도 하나의 디스크로 인식을 해서 0,1,3이 문제없이 동작할 수 있음에도 다 사용하지 않는다.
→ 반면 RAID10에서는 4번 디스크의 a6이 손상이 갔을 때, RAID1에서 보면 4번 디스크의 문제가 생겼을 때 복사본이 5번 디스크의 a6이다. 그러면 4번 디스크만 안 쓰면 된다.
→ 문제가 생겼을 때 사용불가능한 디스크의 비율이 차이가 난다.