최신 컴퓨터의 기본 대용량 저장장치 시스템은 보조저장장치이며 일반적으로 하드 디스크 드라이브(HDD) 및 비휘발성 메모리(NVM) 장치를 사용하여 제공됩니다.
일부 시스템에는 일반적으로 자기 테이프, 광디스크 또는 클라우드 저장장치로 구성된 느리고 더 큰 3차 저장장치가 있습니다.
많은 유형의 대용량 저장장치가 있으며, 모든 유형에 해당하는 내용일 경우 NVS(nonvolatile storage)라는 용어를 사용하거나 저장창치 '드라이브'에 대해 이야기합니다.
최신 컴퓨터를 위한 대량의 보조저장장치는 하드 디스크 드라이브(HDD) 및 비휘발성 메모리(NVM) 장치에 의해 제공됩니다.
HDD의 중요한 특징은 자기적으로 기록하여 저장하고 플래터의 자기 패턴을 감지하여 정보를 읽는다는 것입니다.
전체적인 구조는 위의 그림과 같은데, 여기서 기억해둬야 하는 부분은 다음과 같습니다.
드라이브는 회전하면서 정보를 읽기 때문에 회전 속도가 곧, 전송 속도라는 것을 알 수 있습니다.
또한 원하는 섹터를 읽기 위해서 디스크 암을 원하는 실린더로 이동하는데 필요한 시간이 요구되는데, 이것을 탐색 시간이라고 합니다.
즉, HDD에서 성능에 영향을 크게 주는 요소는 아래와 같습니다.
디스크 플래터는 얇은 층으로 보호 층으로 코팅되어 있지만 헤드는 때때로 자기 표면을 손상합니다.
이 사고를 헤드 충돌이라고 합니다.
NVM 장치는 기계식이 아니라 '전기식'입니다.
가장 일반적으로, 이러한 장티는 컨트롤러 장치 데이터를 저장하는 데 사용되는 플래시 NAND 다이 반도체 칩으로 구성됩니다.
플래시 메모리 기반 NVM은 디스크 드라이브와 유사한 컨테이터에서 자주 사용되며 이 경우 SSD(solid-state disk)라고 합니다.
다른 경우에는 USB 드라이브 또는 DRAM 스틱의 형태를 취합니다.
NVM 장치는 움직이는 부품이 없으므로 HDD보다 다음과 같은 이점을 가지고 있습니다.
단점은 아래와 같습니다.
물론, 이러한 단점들은 시간이 지나면서 기술의 진화를 통해 커버가 되고 있습니다.
NVM 장치는 하드 디스크 드라이브보다 훨씬 빠를 수 있으므로 표준 버스 인터페이스가 처리량을 크게 제한할 수 있습니다.
일부 NVM 장치는 시스템 버스(에, PCIe)에 직접 연결되도록 설계되었습니다.
이러한 특징으로 인해 NVM은 아래와 같은 두 가지 용도로 사용될 수 있습니다.
NAND 반도체는 쓰기
와 관련하여 큰 문제를 가지고 있습니다.
'페이지' 단위로 읽고 쓸 수 있지만 데이터를 덮어쓸 수 없기 때문에, 먼저 NAND 셀을 지워야 합니다.
삭제는 여러 페이지로 구성된 '블록' 단위로 이루어지며 읽기 또는 쓰기보다 시간이 더 걸립니다.
이것은 병렬로 수행될 수 있으므로 이러한 문제는 해결할 수 있지만, 더 큰 문제는 '쓰기 마모'의 특징을 가지고 있다는 것입니다.
쓰기 마모란 해당 셀에 데이터를 쓸 때마다 수명이 줄어드는 특징을 의미합니다.
이러한 문제를 위해 여러 가지 개선 알고리즘을 사용할 수 있습니다.
NAND 반도체에는 유효하지 않은 데이터와 유효한 데이터가 있을 수 있습니다. '덮어쓰기' 연산을 제공하지 않기 때문에 유효하지 않은 데이터가 담겨있는 셀을 사용하려면 먼저 삭제 연산이 이루어져야 합니다.
유효한 데이터를 포함하는 논리 블록을 추적하기 위해 컨트롤러는 플래시 변환 계층(FTL)을 유지합니다.
이 테이블은 현재 유효한 논리 블록을 포함하는 '물리 페이지'를 매핑합니다. 또한 물리 블록 상태, 즉 유효하지 않은 페이지만 포함하고 있고, 따라서 삭제할 수 있는 블록을 추적합니다.
유효하지 않는 데이터를 지우는 작업을 하는 가비지 수집이 발생할 수 있는데, 만약 이러한 데이터가 없을 경우에는 어떻게 해야할까?
유효한 데이터를 다른 위치로 복사하여 지울 수 있는 블록을 비운 다음 쓰기를 받아들일 수 있습니다.
그러나 가비지 수집은 유효한 데이터를 어디에 저장해야 할까? 이 문제를 해결하고 쓰기 성능을 향상하기 위해 NVM 장치는 과잉 공급(over-provisioning)을 사용합니다.
장치는 언제나 쓸 수 있도록 다수의 페이지(종종 전체 용량의 20%)를 따로 준비해 놓습니다.
가비지 수집 혹은 이전 버전의 데이터를 무효화시키는 쓰기 연산에 의해 '무효화된 블록'은 장치가 꽉 찼을 경우에는 삭제되어 과입 공급 공간에 배치되고 그렇지 않은 경우에는 삭제되어 가용 풀로 되돌아갑니다.
이러한 과잉 공급 공간은 앞서 말했던 '쓰기 마모' 문제에도 도움이 됩니다.
컨트롤러가 다양한 알고리즘을 사용하여 삭제 횟수가 적은 블록에 데이터를 배치하여 후혹 삭제가 일어나도록 하여 마모 평준화(wear leveling)를 시킵니다.
마지막으로 HDD와 마찬가지로 데이터 보호 측면에서 NVM 장치는 오류 수정 코드를 제공합니다.
이 코드는 기록될 때 계산되어 '데이터와 함께 저장'되고 읽을 때 '데이터와 함께 읽어' 오류를 감지하고 가능한 오류를 수정합니다.
DRAM의 경우 대용량 저장장치로 자주 사용됩니다.
특히, RAM 드라이브는 보조저장장치처럼 작동하지만 시스템 DRAM의 한 영역을 할당하여 저장장치인 것처럼 나머지 시스템에 제공하는 장치 드라이버에 의해 생성됩니다.
이러한 '드라이브'는 raw 블록 장치로 사용될 수 있지만, 일반적으로 표준 파일 연산을 위해 파일 시스템이 생성됩니다.
컴퓨터에는 이미 버퍼링 및 캐싱을 하는데, 임시 데이터 저장장치로 DRAM을 사용하는 목적은 무엇일까요?
캐시와 버퍼는 프로그래머나 운영체제에 의해 할당되는 반면, RAM 드라이브를 사용하면 사용자와 프로그래머가 표준 파일 연산을 사용하여 데이터를 메모리에 임시로 보관할 수 있습니다.
RAM 드라이브는 고속 임시 저장 공간으로 유용합니다.
NVM 장치는 빠르지만 DRAM은 훨씬 빠르며 RAM 드라이브에 대한 I/O 작업은 파일과 내용을 생성, 읽기, 쓰기 및 삭제하는 가장 빠른 방법입니다.
보조저장장치는 시스템 버스 또는 I/O 버스에 의해 컴퓨터에 연결됩니다.
버스는 대표적으로 다음과 같은 것들이 있습니다.
가장 일반적인 연결 방법은 SATA입니다.
NVMe(NVM express)은 장치를 시스템 PCI 버스에 직접 연결하여 다른 연결 방법과 비교해 처리량을 높이고 지연시간을 줄입니다.
버스에서 데이터 전송은 컨트롤러[또는 호스트 버스 어댑터(HBA)]라고 하는 특수 전자 프로세서에 의해 수행됩니다.
호스트 컨트롤러는 버스의 컴퓨터 쪽에 있는 컨트롤러입니다.
각 저장장치에는 장치 컨트롤러가 내장되어 있습니다.
간단한 동작 예시로 대용량 저장장치 I/O 작업을 봐보자.
장치 컨트롤러에는 일반적으로 내장 캐시가 있습니다.
드라이브에서의 데이터 전송은 캐시와 저장 매체 사이에서 발생하며 호스트로의 데이터 전송은 DMA를 통해 캐시와 호스트 DRAM 사이에서 빠른 전자 속도로 발생합니다.
저장장치는 논리 블록의 커다란 1차원 배열처럼 주소가 매겨집니다.
논리 블록은 '가장 작은 전송 단위'입니다.
각 논리 블록은 물리 섹터 또는 반도체 페이지로 매핑됩니다.
HDD의 경우에는 특정 위치의 섹터를 탐색하게 될 것이고, NVM의 경우에는 블록 및 페이지의 튜플에서 논리 블록의 배열로 매핑될 것입니다.
HDD에서 논리 블록 주소를 사용하기가 쉽지 않은데 그 이유가 무엇일까요?
HDD에서 이 매핑을 사용하면 적어도 이론적으로 논리 블록 번호(LBA)를 '실린더 번호', '해당 실린더 내의 트랙 번호' 및 '해당 트랙 내의 섹터 번호'로 구성된 구식 디스크 주소로 변환할 수 있을 것입니다.
하지만 이것은 세 가지 이유로 힘듭니다.
특히, 두 번째 이유를 살펴보면 트랙이 바깥쪽으로 갈수록 더 넓은 면적을 차지하기 때문에 트랙당 비트의 밀도가 '일정'하다는 고정 선형 속도(contant linear velocity, CLV)를 사용하는 장치에서는 섹터의 수가 달라질 수 밖에 없습니다.
드라이브는 헤드가 바깥쪽에서 안쪽 트랙으로 이동하면서 헤드 아래를 통과하는 데이터의 비율을 동일하게 유지하기 위해 회전 속도를 늘이는데, 이러한 방법을 고정각 속도(constant angular velocity, CAV)라고 합니다.
HDD 또는 플래터를 사용하는 기계식 저장장치의 경우, 성능에 두 가지 요소가 영향을 준다고 했습니다.
이러한 요소의 시간들을 줄이는 것이 대역폭을 높이게 될 것이고, 성능 최적화를 위해 우리는 디스크의 스케줄링을 살펴볼 필요가 있습니다.
디스크 스케줄링의 가장 간단한 형태는 물론 선입 선처리(first-come-first-served)입니다.
이 알고리즘은 본질적으로 공평해 보이지만 빠른 서비스를 제공하지는 못합니다.
이것은 아래의 그림을 보고 이해할 수 있습니다.
보시다싶히 중간에 처리할 수 있는 작업이 있음에도 불구하고 순서대로 처리하는 해당 방식은 비효율적입니다.
SCAN 알고리즘에서는 디스크 암(disk arm)이 디스크의 한끝에서 시작하여 다른 끝으로 이동하며, 가는 길에 있는 요청을 모두 처리합니다.
다른 한쪽 끝에 도달하면 역방향으로 이동하면서 오는 길에 있는 요청을 모두 처리합니다.
따라서 헤드는 디스크 양쪽을 계속해서 가로지르며 왕복합니다.
해당 방식은 엘레베이터 알고리즘(elevator algorithm)이라고도 부릅니다.
C-SCAN(circular-SCAN) 스케줄링은 각 요청에 걸리는 시간을 좀 더 균등하게 하기 위한 SCAN의 변형입니다.
SCAN과 같이 C-SCAN은 한쪽으로 헤드를 이동해 가면서 요청을 처리하지만, 한쪽 끝에 다다르면 반대 방향으로 헤드를 이동하며 서비스하는 것이 아니라 처음 시작했던 자리로 다시 돌아가서 서비스를 시작합니다.
SCAN 및 C-SCAN은 기아 문제를 일으킬 가능성이 작기 때문에 디스크에 많은 부하를 주는 시스템의 성능을 향상합니다.
그래도 기아가 계속될 수 있으며, 이로 인해 Linux가 마감시간(deadline) 스케줄러를 만들었습니다.
이 스케줄러는 읽기와 쓰기별로 큐를 유지 관리하며 프로세스가 쓸 때보다 읽을 때 봉쇄될 가능성이 높으므로 읽기 연산에 높은 우선순위를 줍니다.
여기서 읽기 연산의 경우에 봉쇄될 가능성이 높다고 하는 것은, 보통 읽기 연산을 수행하는 목적이 호스트가 바로 사용하려고 경우가 많기 때문입니다.
대기열은 LBA 순서로 정렬되어 기본적으로 C-SCAN을 구현합니다.
모든 I/O 요청은 이 LBA 순서로 묶어서 전송됩니다.
마감시간 스케줄러는 2개의 읽기 및 2개의 쓰기를 위한 총 4개의 큐를 유지하는데, 하나는 LBA로 정렬되고 다른 하나는 FCFS로 정렬됩니다.
한 번의 배치 처리가 끝나면 설정된 기간보다 오래된 요청이 FCFS에 있는지 검사합니다. 그렇다면 해당 I/O 요청을 포함하고 있는 LBA가 다음 입출력 배치 대상으로 선택됩니다.
이후에 Linux의 버전이 올라가면서 다른 두 가지가 포함되었습니다.
- NOOP
- CFQ(completely fair queuing) 스케줄러
NVM 장치에는 이동 디스크 헤드가 없으며 일반적으로 간단한 FCFS 정책을 사용합니다.
예를 들어 Linux NOOP 스케줄러는 FCFS 정책을 사용하지만 인접한 요청을 병합하도록 수정합니다.
NVM 작동은 읽기 서비스에 필요한 시간은 일정하지만 플래시 메모리 속성 때문에 쓰기 시간은 일정하지 않습니다.
일부 SSD 스케줄러는 이 속성을 이용하여 '인접한 쓰기 요청만 병합'하고 읽기 요청은 FCFS 순서로 처리합니다.
HDD 헤드 탐색을 최소화하고 미디어에 대한 데이터 읽기 및 쓰기가 강조되는 raw 순차 처리량 측면에서는 NVM이 더 적은 이득을 제공합니다.
읽기의 경우 NVM이 더 좋지만, NVM에 쓰는 것이 읽는 것보다 느리기 때문입니다.
시간이 지남에 따라 NVM 장치의 수명과 성능을 향상하는 한 가지 방법은 파일이 삭제될 때 파일 시스템이 장치에 알리도록 하여 장치가 해당 파일이 저장된 블록을 지울 수 있도록 하는 것입니다.
이것이 어떻게 '쓰기 마모' 특성을 커버하고 성능을 향상시키는가?
파일이 삭제될 때 즉시 블록을 지운다면, 해당 블록은 '사용 가능한 상태'로 마킹되어 새로운 데이터를 저장하는 공간으로 활용될 수 있습니다.
이러한 특징으로 인해 불필요한 공간을 빠르게 처리해주고, 쓰기 요청이 들어왔을 때 유효하지 않은 데이터를 적재하는 과정을 생략하고 블록을 할당해줄 수 있습니다.
또한, NVM 장치는 '쓰기 마모 균등화' 기술을 사용하여 데이터를 저장하는 물리적 위치를 재분배할 수 있습니다.
메모리 시스템은 패리티 비트를 사용하여 특정 오류를 오랫동안 감지했습니다.
해당 기법은 모든 단일 비트 오류를 감지할 수 있습니다. 하지만 이중 비트 오류는 감지되지 않을 수 있습니다.
패리티는 비트의 XOR("eXculsive OR")을 수행하여 쉽게 계산됩니다.
또한 모든 바이트 메모리에 대해 패리티를 저장하기 위한 여분의 메모리가 필요합니다.
오류 수정 코드(error-correction code, ECC)는 문제를 감지할 뿐만 아니라 보정합니다.
보정은 알고리즘과 저장장치를 추가로 사용하여 수행합니다. 코드는 필요한 추가 저장장치의 양과 보정할 수 있는 오류 개수에 따라 다릅니다.
컨트롤러가 일반 I/O 동안 데이터의 섹터/페이지를 쓰면 ECC는 기록 중인 데이터의 모든 바이트에서 계산된 값으로 기록됩니다.
섹터/페이지를 읽을 때 ECC가 다시 계산되고 저장된 값과 비교됩니다.
ECC는 몇 비트의 데이터만 손상된 경우 '컨트롤러'가 변경된 비트를 식별하고 올바른 값을 계산할 수 있도록 충분한 정보를 제공하고 있기 때문에 오류 보정 방식입니다.
여기서는 복구 가능 여부에 따라 두 가지 오류로 나뉩니다.
여기서는 드라이브의 초기화, 드라이브로부터의 부팅 및 손상된 블록의 복구에 관해 기술합니다.
새로운 저장장치는 아무런 정보도 없는 비어있는 판 또는 초기화되지 않은 반도체 저장셀의 집합입니다.
저장장치는 자료를 저장하기 전에 컨트롤러가 읽고 쓸 수 있도록 섹터들로 나누어져 있어야 합니다.
NVM 페이지는 초기화되어야 하고 FTL(Flash Translation Layer)이 생성되어야 합니다.
이 과정을 저수준 포맷팅(low-level formatting) 또는 물리적 포맷팅이라고 부릅니다.
저수준 포매팅은 각 저장장치 위치마다 특별한 자료구조로 장치를 채웁니다.
섹터 또는 페이지를 위한 자료구조는 보통 헤더(header), 자료 구역(data area)과 트레일러(trailer)로 구성됩니다.
헤더와 트레일러는 섹터/페이지 번호와 오류 탐지 또는 오류 수정 코드와 같은 컨트롤러가 사용하는 정보를 가지고 있습니다.
드라이브를 사용하여 파일을 보유하려면 운영체제가 여전히 자체 데이터 구조를 장치에 기록해야 합니다.
운영체제는 이 작업을 세 단계로 수행합니다.
파티션 정보는 부팅 가능한 파일 시스템(운영체제 포함)이 포함되어 있는지도 나타냅니다.
부팅 가능으로 표시된 파티션은 파일 시스템의 루트를 설정하는 데 사용됩니다.
마운트 되면 모든 다른 장치 링크와 해당 파티션이 생성될 수 있습니다. 일반적으로 컴퓨터의 '파일 시스템'은 마운트 된 모든 볼륨으로 구성됩니다.
Windows에서는 문자(C:, D:, E:)를 사용, Linux와 같은 다른 시스템은 부트 할 때 부트 파일 시스템이 마운트되고 다른 파일 시스템은 해당 트리 구조 내에 마운트 될 수 있습니다.
효율성을 높이기 위해 대부분의 파일 시스템은 블록을 종종 클러스터라고 하는 더 큰 청크로 묶습니다.
장치 I/O는 블록
을 통해 수행되지만 파일 시스템 I/O는 클러스터를 통해 수행되므로, 효과적으로 I/O가 순차 접근을 더 많이 하고 랜덤 액세스 특성을 줄이는 것을 보장합니다.
일부 운영체제는 특정 프로그램이 파일 시스템 자료구조 없이도 파티션을 논리 블록으의 대용량 순차 배열처럼 사용할 수 있게 합니다.
이 배열을 raw 디스크라고 하며 이 배열에 대한 I/O를 raw I/O라고 합니다.
Raw I/O는 버퍼 캐시, 파일 잠금, 선반입, 공간 할당, 파일 이름 및 이렉터리와 같은 모든 파일 시스템 서비스를 우회합니다.
따라서, 이러한 방식은 각 레코드가 저장되는 정학환 위치를 제어할 수 있기 때문에 일부 데이터베이스에서 선호합니다.
대부분의 컴퓨터에서 부트스트랩은 시스템 마더보드의 NVM 플래시 메모리 펌웨어에 저장되며 알려진 메모리 위치에 매핑됩니다.
작은 부트스트랩 로더 프로그램이 장치의 고정된 위치에 있는 "부트 블록"에서 완전한 부트스트랩 프로그램을 가져옵니다.
부트 파티션에 있는 장치를 부트 디스크 또는 시스템 디스크라고 합니다.
부트스트랩 NVM의 코드는 다음과 같이 동작을 합니다.
여기서 부트 코드는 부트 파티션의 약속된 위치에 저장되어 있고 부트 코드를 실행하여 커널의 위치를 알아냅니다.
구형 IDE 컨트롤러를 가진 디스크 손상된 블록들을 '수동'으로 처리합니다.
한 가지 전략은 검사를 하는 것입니다.
검사를 통해 손상된 블록을 발견하면 '사용 불가'라고 표시하고 할당하지 않도록 합니다.
더욱 정교한 디스크의 컨트롤러는 손상 블록의 리스트를 유지합니다.
저수준 포매팅은 운영체제가 볼 수 없는 예비 섹터를 남겨 놓습니다.
컨트롤러는 이러한 예비 섹터 중 하나를 손상된 섹터와 교체시킬 수 있습니다.
이 기법을 섹터 예비(sector sparing) 또는 섹터 포워딩(sector forwarding)이라고 합니다.
손상된 섹터를 대체할 때 디스크 스케줄링 알고리즘에 의한 최적화가 깨질 수 있기 때문에 '섹터 밀어내기(sector slipping)' 같은 기법을 고려할 수 있습니다.
스왑 공간 관리는 운영체제가 수행해야 하는 또 다른 하위 수준의 작업입니다.
가상 메모리는 보조저장장치를 메인 메모리의 '확장된 공간'으로 사용합니다.
그러나 드라이브는 메모리보다 훨씬 더 느리므로 스왑 공간을 어떻게 사용하고, 저장장치상의 어디에 위치시켜야 하며, 어떻게 관리해야하는지는 중요합니다.
스왑 공간의 사용은 이전에 많이 다뤘기 때문에 넘어가도록 하겠습니다. 통상 좀 크게 잡는 것이 좋다는 것만 인지하면 될 것 같습니다.
스왑 공간은 두 군데에 있을 수 있습니다.
스왑 공간이 만일 하나의 커다란 파일이라면, 통상의 파일 시스템 루틴을 사용하여 스왑 공간을 생성/삭제하고, 스왑 공간을 관리할 수 있습니다.
그 대신에, 스왑 공간은 별도의 raw 파티션에 만들어질 수 있습니다. 그리고 일반 파일이나 디렉터리는 이 공간에 저장되지 않습니다.
이 파티션은 별도의 스왑 관리루틴에 의해 스와핑을 하는 데에만 사용됩니다.
스왑 관리 루틴은 공간 효율성보다는 속도 효율성
을 최적화하기 위한 알고리즘을 사용합니다.
왜냐하면 스왑 공간은 사용될 때 파일 시스템보다 훨씬 자주 접근되기 떄문입니다.
스왑 공간에서의 내부 단편화 문제는 크게 신경쓸 필요가 없는데, 이것은 단편들이 그렇게 오랫동안 남아있지 않기 때문입니다.
여러 운영체제에서 스왑 공간은 익명 메모리 페이지의 백업 저장소로만 사용합니다. 그 이유는 파일 시스템으로부터 읽어올 수 있는 페이지들은 스왑 공간을 사용하는 것보다 파일 시스템에서 한번 더 읽는 것이 효율적이기 때문입니다.
컴퓨터는 3가지 방법으로 보조저장장치에 접근합니다.
호스트 연결 장치는 로컬 I/O 포트를 통해 액세스 되는 저장장치입니다.
통상적인 시스템은 하나 또는 몇 개의 SATA 포트를 가집니다.
고성능 워크 스테이션과 서버는 일반적으로 더 많은 저장장치가 필요하거나 저장장치를 공유해야 하므로 광섬유 채널(fire channel, FC)와 같은 더 정교한 I/O 아키텍처를 사용합니다.
넓은 주소 공간과 스위치 기능이 있는 특성 때문에 다수의 호스트와 저장장치가 기본 망에 연결되어 I/O 통신에 큰 유통선을 제공합니다.
호스트 연결 저장장치로 테이터를 내리는 I/O 명령은 버스 ID 또는 대상 논리 장치와 같이 구체적으로 식별된 저장장치에 논리적 데이터 블록을 읽고 씁니다.
NAS(network-attached storage)는 네트워크를 통해 저장장치에 대한 액세스를 제공합니다.
NAS 장치는 특수 목적 저장장치 시스템이거나 네트워크의 다른 호스트에 저장장치를 제공하는 일반 컴퓨터 시스템일 수 있습니다.
RPC(remote procedure call)을 통해 네트워크 연결 저장장치에 액세스할 수 있습니다.
RPC는 보통 클라이언트에 모든 데이터 트래픽을 전달하는 같은 LAN상에서 수행됩니다.
최근의 iSCSI는 네트워크로 연결된 저장장치 프로토콜입니다.
NFS 및 CIFS는 파일 시스템을 제공하고 네트워크를 통해 파일의 일부를 전송하는 반면에, iSCSI는 '네트워크'를 통해 논리 블록을 전송하고 블록을 직접 사용하거나 파일 시스템을 생성하여 사용하는 것을 클라이언트에 맡깁니다.
이것은 네트워크 연결 저장장치와 유사하게 '네트워크'를 통해 저장장치에 액세스 할 수 있습니다.
NAS와 달리 이 저장장치는 유료(또는 무료)로 저장장치를 제공하는 원격 데이터 센터에 인터넷 또는 다르 WAN을 통해 접속하여 액세스 됩니다.
또 다른 차이점은 저장장치가 접근되는 방식과 사용자에게 제공되는 방식입니다.
클라우드 저장장치는 파일 시스템 혹은 raw 블록 장치로 접근하는 방식이 아닌 API 기반이며 프로그램은 API를 사용하여 저장장치에 접근합니다.
기존 프로토콜 대신 API를 사용하는 한 가지 이유는 WAN의 지연시간 및 장애 시나리오입니다.
LAN과 다르게 WAN은 지연시간이 길고 연결이 끊어질 가능성이 높으므로 장애 발생시 연결이 복원될 때까지 응용은 액세스를 일시 중지하도록 합니다.
SAN(storage-area network)은 서버들과 저장장치 유닛들을 연결하는 사유 네트워크입니다(네트워크 프로토콜을 사용하지 않고 저장장치 프로토콜을 사용).
SAN의 장점은 '유연성'에 있습니다. 여러 호스트와 저장장치가 같은 SAN에 부착될 수 있고, 저장장치는 동적으로 호스트에 할당될 수 있습니다.
SAN 스위치는 호스트와 저장장치 간의 액세스를 허용하거나 금지할 수 있습니다.
SAN은 일반적으로 저장장치 배열보다 더 많은 포트를 가지고 비용이 더 많이 듭니다.
SAN 연결은 근거리에 있으며 일반적으로 라우팅이 없으므로 NAS는 SAN보다 더 많은 호스트를 연결할 수 있습니다.
시스템이 많은 수의 드라이브를 가지고 있고, 그 시스템이 병렬적으로 운영된다면 데이터 읽기, 쓰기 비율을 향상할 수 있습니다.
더욱이 중복 정보가 여러 드라이브에 저장되기 때문에 데이터 저장의 신뢰성을 높일 수 있습니다.
RAID(redundant array of inexpensive disk)라 불리는 다양한 디스크 구성 기술은 일반적으로 성능과 신뢰성 이슈를 해결하는 데 역점을 둑 ㅗ있습니다.
과거에는 RAID는 크고 가격이 비싼 디스크들의 값싼 대안으로 간주했지만, 현재는 경제적인 이유보다는 높은 신뢰성과 높은 데이터 전송률 때문에 사용됩니다.
그러므로 RAID의 약자 I는 한때 의미했던 'inexpensive'가 아닌 'independent'를 나타낸는 것이 현재의 추세입니다.
만약 저장 장치에서 오류가 발생하여 손상을 입었다면, 복구를 해야할 것이고 그것은 엄청난 시간이 소모될 수 있으며 심한 경우에는 높은 비율의 데이터 손실이 발생할 수 있습니다.
따라서 신뢰성의 문제 해결 방안은 중복을 허용하는 것입니다.
분실된 정보를 리빌드하기 위하여 오류의 경우마다 사용되는 별도의 정보를 저장하기 때문에, 디스크가 고장 나더라도 데이터가 손실되지 않습니다.
중복을 도입하는 가장 간단한 접근 방법은 모든 드라이브의 복사본을 만드는 것입니다.
이 기술을 미러링(mirroring)이라고 합니다.
미러링을 사용하는 경우 하나의 논리 디스크는 두 개의 물리 드라이브로 구성되고 모든 쓰기 작업은 '두 드라이브'에 모두 실행됩니다.
이러한 결가를 미러드 볼륨이라고 부릅니다.
물론, 이러한 방식은 신뢰성을 보장해주기는 하지만 많은 비용이 들게 됩니다.
여러 드라이브를 사용할 경우 여러 드라이브에 걸쳐 데이터 스트라이핑(data striping)을 사용하여 전송 비율을 향상할 수 있습니다.
가장 간단한 형식으로, 데이터 스트라이핑은 여러 드라이브에 각 바이트의 비트를 '나누어' 저장함으로써 구성됩니다.
이러한 스트라이핑을 비트 레벨 스트라이핑(bit-level striping)이라고 합니다.
이것은 블록 단위로도 수행할 수 있으며 블록 단위 스트라이핑이라고 부릅니다.
즉, 디스크 시스템에서 병렬성의 두 가지 목적은 다음과 같습니다.
미러링과 스트라이핑을 비교해 봅시다.
미러링
스트라이핑
이들의 단점을 보완하기 위해 패리티 비트와 디스크 스트라이핑을 결합하여 적은 비용으로 중복을 허용하는 많은 기법이 제안되었습니다.
이러한 기법은 각기 다른 가격 대 성능 비를 가지고 있으며, RAID 레벨로 분류될 수 있습니다.
여기서부터는 필요한 시점에 나중에 별도로 정리하도록 하겠습니다.