지능형 스토리지 시스템의 컴포넌트
- 프론트엔드
- 캐시
- 백엔드
- 물리 디스크
지능형 스토리지에서 호스트의 I/O 요청은 프론트엔드 포트에 도착해 캐시와 백엔드를 통해 처리돼 물리 디스크로부터 데이터를 추출하거나 저장한다.
요청된 데이터가 캐시에 있으면 바로 캐시에서 읽기 요청을 처리한다.
프론트엔드
프론트엔드 포트와 프론트엔드 컨트롤러 컴포넌트로 구성된다.
스토리지 시스템과 호스트 사이 인터페이스를 제공한다.
고가영성을 위해 여분의 컨트롤러를 갖고 있으며 각 컨트롤러당 여러 포트를 갖고 있어 여러 호스트가 지능형 스토리지 시스템에 연결한다.
각 프론트엔드 컨트롤러에서 파이버 채널, iSCSI, FICON, FCoE 등 전송 프로토콜을 처리한다.
프론트엔드 컨트롤러는 내부 데이터 버스를 통해 캐시와 데이터를 주고받는다. 캐시가 쓰기 데이터를 받으면 컨트롤러는 호스트에게 수신 ack 메시지를 보낸다.
캐시
호스트의 I/O 요청 처리 시간을 줄이기 위해 데이터를 임시 저장하는 메모리다.
호스트에서 가장 느린 컴포넌트인 디스크 드라이브의 물리적 지연 시간을 줄여 성능을 향상시킨다.
지능형 어레이에서 쓰기 데이터는 먼저 캐시에 기록된 후 디스크에 옮겨 기록된다.
- 캐시의 구조캐시는 data store, tag RAM으로 구성된다. 데이터 스토어는 데이터를 저장하고, 태그 RAM은 데이터 스토어와 디스크에서 데이터 위치를 추적한다.태그 RAM의 더티 비트 플래그는 캐시의 데이터가 디스크에 커밋됐는지, 최근 접근은 언제인지 알려준다.
- 태그 RAM의 엔트리는 데이터의 캐시 위치와 디스크 위치를 알려준다.
- 캐시 할당의 가장 작은 단위는 페이지다. 캐시 페이지의 크기는 애플리케이션 I/O 크기에 따라 결정된다.
- 캐시를 사용한 읽기 연산요청한 데이터가 있으면 cache hit, 혹은 read hit라고 한며 호스트에서 매우 빠른 응답 속도로 데이터를 제공한다.시퀀셜 리드(순차 읽기)의 경우 prefetch나 read-ahead 알고리즘을 사용한다. 시퀀셜 리드는 연속된 블록을 가져오므로 호스트가 아직 요청하지 않은 블록도 미리 읽어 캐시에 저장한다. fixed prefethc에서는 호스트 I/O 크기가 일정한 경우 사용하며, variable prefetch는 스토리지 시스템이 호스트가 요청한 크기의 배수만큼 데이터를 prefetch한다. prefetch에 보통 limit을 정해 너무 많은 I/O가 발생하지 않도록 한다.
- 읽기 성능은 read hit ratio로 측정된다. 전체 읽기에서 히트가 발생한 비율이다.
- 요청한 데이터가 없으면 cache miss 라고 하며 백엔드가 디스크에 접근해 요청 데이터를 가져온다. 이는 캐시에 저장되고 프론트엔드를 거쳐 호스트에게 전송한다.
- 호스트 읽기 연산 → 스토리지 컨트롤러에서 태그 RAM을 읽어 요청한 데이터가 캐시에 있는지 확인한다.
- 캐시를 사용한 쓰기 연산sequential write도 작은 쓰기 연산을 합쳐 디스크에 전달하여 최적화된다.
- write-back cache응답 시간이 빨라지지만, 데이터가 커밋되기 전 캐시에 장애가 발생하면 데이터가 사라질 수 있다.
- 데이터를 캐시에 저장하고 바로 호스트에게 ack을 보낸다. 그리고 여러 쓰기 데이터가 한꺼번에 디스크에 커밋된다.
- write-through cache
- 데이터를 캐시에 저장하고 바로 디스크에 저장하며 호스트에게 ack을 보낸다. 디스크 연산으로 인해 쓰기 응답속도가 길어진다.
- 디스크에 직접 쓸 때보다 성능이 향상된다. I/O가 캐시에 기록되고 ack을 보내면, 디스크에 직접 기록할 때보다 훨씬 적은 시간이 걸린다.
데이터 I/O가 많은 특정 상황에서는 캐시를 우회한다. write aside size라는 지정한 크기를 넘어서면 바로 디스크에 기록해 쓰기 연산이 캐시 공간을 많이 사용하지 못하게 한다. 이는 캐시 크기가 제한되고 캐시가 주로 작은 랜덤 I/O에 사용되는 경우 사용한다.
- 캐시 구현전용 캐시는 별도의 메모리 공간을 read, write에 할당하는 것을 말한다.글로벌 캐시는 읽기와 쓰기에 사용하는 캐시 비율을 정할 수 있다. 보통 읽기 캐시는 작게 설정하는데, 애플리케이션의 연산 비율에 따라 조절해야 한다. 또 워크로드에 따라 동적으로 변할 수 있다.
- 글로벌 캐시는 모든 메모리 주소를 사용한다. 글로벌 캐시에서는 글로벌 주소 집합만을 관리하면 되기 때문에 캐시를 효율적으로 관리 할 수 있다.
- 전용 캐시와 글로벌 캐시로 구현할 수 있다.
- 캐시 관리LRU(Least Recently Used), MRU(Most Recently Used) 알고리즘이 가장 많이 사용된다.
- idle flushing
- 캐시 활용도가 하이 워터마크와 로우 워터마크 사이이면 지속적으로 적당히 플러시한다.
- high watermark flushing
- 캐시 활용도가 하이 워터마크를 넘으면 발생한다. 스토리지 시스템이 플러시를 위한 전용 리소스를 할당한다. 이 플러시는 I/O에 영향을 준다.
- force flushing
- 갑자기 많은 I/O가 발생해 캐시를 100% 사용한 경우 실행한다. 좀 더 많은 리소스를 할당해 먼저 처리한다.
- 캐시에 빈 공간이 없으면 dirty page(캐시에 기록된 후 디스크에 기록되지 않은 데이터)를 플러시해 사용 가능한 공간을 관리해야 한다. I/O 액세스 속도나 패턴에 기반해 watermark라 불리는 상하한 레벨을 캐시에 설정해 플러시를 관리한다. hight watermark는 스토리지 시스템이 캐시 데이터를 빨리 플러시해야 하는 한도, low watermark는 플러시를 멈추는 지점이다.
- 캐시는 한정되고 비싼 리소스임으로 잘 관리해야 한다.
- 캐시 데이터 보호
- 캐시 미러링(cache mirroring)읽기는 디스크에서 다시 캐시로 읽어오면 되기 때문에 캐시 장애가 발생해도 디스크에서 데이터를 읽을 수 있다.cache coherency(캐시 일관성)을 유지해야 한다. 두 캐시가 항상 같아야 한다.
- 쓰기 캐시만 미러링하기 때문에 캐시의 활용도를 높일 수 있다.
- 캐시 기록을 독립적인 2개의 메모리 주소에 저장한다. 캐시 장애가 발생하더라도 쓰기 데이터는 미러에 보존돼 있어 커밋할 수 있다.
- 캐시 볼팅(cache vaulting)
- 전력 장애로부터 데이터를 보호하는 방법 중, 전력 장애 시 캐시 컨텐츠를 덤프하기 위해 물리적 디스크를 사용하는 방법이 있다. 이를 캐시 볼팅이라 하며, 이를 위해 사용되는 디스크를 볼트 드라이브라고 한다. 전력이 복구되면 디스크의 데이터를 다시 캐시에 기록한다.
- 캐시는 휘발성 메모리이기 때문에 장애가 발생하면 디스크에 커밋하지 않은 데이터는 모두 사라진다.
백엔드
캐시와 물리 디스크 사이 인터페이스를 제공한다. 백엔드 포트와 백엔드 컨트롤러로 구성된다.
캐시 → 백엔드로 데이터가 전송되면 목적지 디스크로 보내진다. 물리적 디스크는 백엔드의 포트에 연결되어있다.
백엔드 컨트롤러는 디스크와 통신하며 제한된 임시 데이터 저장소를 제공한다. 백엔드 컨트롤러의 알고리즘은 RAID 기능과 오류 탐지 및 수정을 수행한다.
데이터 보호와 고가용성을 위해 스토리지 시스템은 여러 포트를 가진 듀얼 컨트롤러를 사용한다. 이는 컨트롤러나 포트에 장애가 발생해도 물리적 디스크로 향하는 다른 경로를 제공 할 수 있다. 각 디스크 포트는 다른 컨트롤러에 연결된다. 듀얼 컨트롤러는 로드 밸런싱에도 도움이 된다.
물리적 디스크
파이버 채널, SATA, SAS, flash drvie 등 여러 디스크 드라이브가 사용된다. 서로 다른 디스크 드라이브를 같은 어레이에 섞어 사용할 수도 있다.
'OS & Container > Storage' 카테고리의 다른 글
DAS, SAN (0) | 2022.03.31 |
---|---|
스토리지 프로비저닝 (0) | 2022.03.22 |
RAID 정리, 핫 스페어 (0) | 2022.03.18 |
RAID와 디스크 성능 (0) | 2022.03.16 |
RAID 레벨 (0) | 2022.03.15 |