- 비휘발성 저장장치는 테이프에서 HDD, SSD, 클라우드 네트워크 스토리지로 발전했지만, 데이터 위치와 배치는 여전히 IO 지연을 좌우함
- 테이프 저장장치는 순차 읽기·쓰기에 강한 반면, 멀리 떨어진 데이터를 읽을 때 수십 초까지 걸릴 수 있어 고트래픽 트랜잭션 데이터베이스에는 맞지 않음
- HDD는 테이프보다 지연을 크게 낮췄지만, 회전 플래터와 헤드 이동 때문에 무작위 읽기가 보통 1~3ms 수준이고 요청 순서에 따라 성능 차이가 커짐
- SSD는 기계 부품 없이 NAND flash로 동작해 무작위 읽기가 16μs까지 빨라질 수 있으나, 병렬성 활용과 garbage collection 때문에 데이터 배치가 계속 중요함
- 클라우드의 스토리지·컴퓨트 분리는 확장성과 장애 대응을 쉽게 만들지만 네트워크 왕복과 IOPS 제한을 추가하며, PlanetScale Metal은 직접 연결된 NVMe SSD와 복제로 이 비용을 줄이려 함
저장장치 지연을 좌우하는 기본 요소
- 비휘발성 저장장치는 전원이 꺼져도 데이터를 보존하며, 사진, 이메일, 은행 잔고, 의료 기록 같은 데이터를 저장하는 기반임
- CPU 레지스터, CPU 캐시, RAM 같은 휘발성 저장장치는 더 빠르지만 지속적인 전원이 필요함
- 저장장치 성능은 용량만의 문제가 아니라, 데이터에 도달하는 방식, 읽기·쓰기 단위, 큐잉, 병렬성, 네트워크 왕복 여부에 따라 달라짐
- PlanetScale은 PlanetScale Metal 출시와 함께, Metal이 네트워크 연결 스토리지 대신 로컬 NVMe 드라이브로 클라우드 데이터베이스를 실행한다고 밝힘
테이프 저장장치: 순차 접근에는 강하지만 무작위 접근에는 약함
- 컴퓨터는 1950년대부터 테이프 드라이브를 비휘발성 디지털 저장장치로 사용함
- 테이프 카트리지는 여러 트랙과 많은 셀로 구성되며, 각 셀의 자기 분극 상태가 이진 데이터를 표현함
- 카트리지를 리더에 넣고 모터로 감아가면 IO head가 지나가는 데이터를 읽음
- 읽기·쓰기 위치가 헤드에 가까우면 빠르지만, 멀리 있으면 지연이 커짐
- 현대 테이프 시스템에서도 멀리 있는 데이터를 읽으려면 수백 미터를 감아야 할 수 있음
- 이런 경우 읽기에 수십 초가 걸릴 수 있음
- 같은 수의 읽기·쓰기라도 데이터가 흩어져 있으면 순차 배치보다 훨씬 오래 걸림
- 글의 예시는 흩어진 읽기·쓰기가 같은 작업량에서 약 7배 더 오래 걸리는 상황을 보여줌
- 테이프는 무작위 읽기·쓰기 지연이 나쁘지만, 긴 순차 읽기·쓰기에는 여전히 적합함
- SSD와 HDD보다 GB당 비용이 낮고 보관 수명이 김
- CERN은 400PB 이상의 데이터를 테이프 스토리지 데이터 웨어하우스에서 관리함
- AWS도 테이프 아카이빙 서비스를 제공함
- 고트래픽 트랜잭션 데이터베이스에는 테이프가 적합하지 않음
HDD: 회전 디스크와 명령 큐잉의 절충
- HDD는 테이프 대신 원형 금속 디스크인 플래터에 데이터를 저장함
- 플래터는 인클로저 안에서 빠르게 회전하며, 예시로 7200 RPM이 흔한 속도로 제시됨
- HDD의 트랙은 원형이고, 하나의 디스크에 100,000개 이상의 트랙이 있을 수 있음
- 각 트랙은 수십만 개 페이지를 포함하며, 각 페이지는 대략 4KB 데이터를 담음
- HDD는 헤드 이동과 플래터 회전으로 읽기·쓰기 위치를 맞춤
- 테이프와 달리 전체 표면의 비트가 항상 접근 가능함
- 원하는 데이터가 드러날 때까지 테이프를 감을 필요는 없음
- 일반적인 무작위 읽기는 1~3ms에 수행될 수 있음
- 요청 순서가 성능에 큰 영향을 줌
- 순차성이 높은 읽기·쓰기는 빠르게 끝남
- 같은 6개의 읽기·쓰기라도 순서가 뒤섞이면 플래터가 올바른 위치로 올 때까지 기다리는 시간이 늘어남
- 자기 디스크는 오래전부터 명령 큐잉을 지원함
- SCSI는 1980년대부터, SATA는 2000년대부터 관련 기능을 제공함
- OS는 여러 명령을 병렬 또는 순서와 다르게 실행되도록 보낼 수 있음
- 디스크 컨트롤러는 작업 큐를 활용해 디스크 구조에 맞게 읽기·쓰기를 스케줄링할 수 있음
- HDD는 테이프보다 개선됐지만, 특히 무작위 읽기·쓰기에서는 여전히 느린 경우가 있음
SSD: 기계 부품이 사라져도 남는 성능 변수
- SSD 또는 flash 저장장치는 1980년대에 발명됐지만, 소비자 저장장치로 주류가 된 시기는 2000년대임
- SSD는 데이터를 읽기 위해 기계 부품에 의존하지 않음
- NAND flash라는 비휘발성 트랜지스터를 사용함
- 1과 0은 물리 부품 이동 없이 전기 신호로 읽고, 쓰고, 지움
- SSD는 하나 이상의 target으로 구성되고, 각 target은 여러 block을 포함하며, block은 여러 page를 포함함
- SSD는 page 단위로 읽고 씀
- 일부 데이터만 필요해도 드라이브 요청 단위는 page임
- 예시 구성에서 page가 4096비트, block이 16K page, target이 16K block, 장치가 8 target이면 총
4k * 16k * 16k * 8 = 8,796,093,022,208비트, 즉 8TB가 됨 - SSD 무작위 읽기는 모델에 따라 다르지만 16μs까지 빠를 수 있음
- 기계 부품이 없어도 데이터 배치는 중요함
- SSD 성능 요인에는 병렬성과 garbage collection이 포함됨
SSD 병렬성: target 분산이 처리량을 바꿈
- 일반적으로 각 target에는 컨트롤 유닛과 연결되는 전용 line이 있음
- 각 line은 읽기·쓰기를 처리하지만 한 번에 한 page만 전달할 수 있음
- page 전달은 매우 빠르지만, 여전히 작은 시간이 걸림
- 8개 write가 4개 target에 분산되면 4개 line을 병렬로 사용해 두 번의 시간 조각으로 쓸 수 있음
- 8개 write가 모두 같은 target에 몰리면 한 line만 사용되고 나머지 line은 놀게 됨
- 읽기·쓰기 순서와 데이터 배치는 SSD에서도 성능에 영향을 줌
- MySQL 같은 소프트웨어를 설계할 때는 데이터가 어떤 구조에 저장되고 디스크에 어떻게 배치되는지 주의해야 함
SSD garbage collection: 쓰기 전 지우기의 비용
- SSD page는 여러 번 읽을 수 있지만, 한 번 쓴 page는 기존 데이터를 명시적으로 지우기 전까지 새 데이터로 덮어쓸 수 없음
- 개별 page는 지울 수 없고, block 전체를 지워야 함
- SSD는 empty, in-use, dirty page를 관리하는 내부 알고리듬이 필요함
- dirty page는 쓰였지만 더 이상 데이터가 필요 없고 지울 준비가 된 page임
- 새 write를 받기 위해 데이터를 재배치해야 하는 경우가 있으며, 이를 관리하는 알고리듬이 garbage collector임
- 충분한 unused page가 있으면 새 데이터를 바로 쓸 수 있음
- unused page가 부족하고 dirty page가 많으면 garbage collection을 먼저 수행해야 함
- 예시에서는 새 5 page를 쓰기 위해 non-dirty page 2개를 다른 위치로 옮김
- 그 뒤 해당 target의 page를 모두 dirty 상태로 만들어 지울 수 있게 함
- 이런 추가 단계가 write 성능을 크게 늦춤
- 읽기, 쓰기, 삭제가 많은 바쁜 SSD에서는 garbage collection 때문에 다른 작업이 느려질 수 있음
클라우드가 추가한 변화: 스토리지와 컴퓨트 분리
- 테이프에서 HDD, SSD로의 변화는 내구성 있는 IO 성능을 크게 높였음
- 클라우드로의 이동은 IO 성능에 또 다른 변화를 만들었음
- AWS는 2006년 출시 이후 클라우드 이동을 크게 확산시킨 서비스로 제시됨
- 클라우드 환경에서는 사용자가 대형 데이터센터의 임의 하드웨어 위에서 가상화된 서버를 빌림
- 서버는 하드웨어 고장, 교체, 네트워크 단절 등 여러 이유로 언제든 종료될 수 있음
- 임대 클라우드 인프라 위에서 시스템을 만들 때는 더 잦은 장애를 견딜 수 있어야 함
- 이런 조건과 동적으로 확장 가능한 스토리지 볼륨 요구가 storage와 compute 분리로 이어짐
네트워크 연결 스토리지의 장점과 비용
- 전통적으로 서버, 데스크톱, 노트북, 휴대폰은 비휘발성 저장장치를 직접 연결함
- SATA 케이블, PCIe 인터페이스, 또는 같은 SoC 내장 형태가 사용됨
- 직접 연결 스토리지는 빠르지만 두 가지 제약이 있음
- 서버가 내려가면 데이터도 함께 사용할 수 없게 됨
- 스토리지 크기가 고정됨
- 애플리케이션 서버는 보통 임시(ephemeral) 환경에 잘 맞고, 많은 작업이 메모리에서 일어나므로 이 문제가 크지 않음
- 데이터베이스는 서버가 내려가도 데이터를 잃으면 안 되고, 데이터 크기가 빠르게 증가해 스토리지 한계에 도달할 수 있음
- 많은 클라우드 제공자는 컴퓨트 인스턴스에 별도 구성 가능한 네트워크 연결 스토리지를 붙일 수 있게 함
- EC2의 기본 구성은 보통 EBS 네트워크 스토리지 볼륨을 붙이는 방식임
- Amazon RDS, Amazon Aurora, Google Cloud SQL, PlanetScale 같은 데이터베이스 서비스도 compute와 storage가 네트워크로 분리된 시스템에 의존함
- 이 방식은 스토리지 볼륨을 데이터 증감에 따라 동적으로 조정할 수 있게 함
- 서버가 내려가도 데이터는 안전하게 남아 다른 서버에 다시 붙일 수 있음
- 대신 네트워크 왕복과 IOPS 제한이라는 성능 비용이 생김
로컬 NVMe와 네트워크 스토리지의 지연 차이
- 직접 연결된 NVMe SSD는 비휘발성 메모리 호스트 컨트롤러 인터페이스 명세를 사용해 빠른 IO 속도와 대역폭을 제공하는 SSD임
- CPU에서 RAM까지의 왕복은 약 100ns로 제시됨
- CPU에서 로컬 연결 NVMe SSD까지의 왕복은 약 50,000ns, 즉 50μs임
- 네트워크 연결 스토리지 볼륨은 데이터센터 내부의 짧은 네트워크 왕복이 필요함
- EBS 같은 네트워크 연결 스토리지는 왕복 시간이 약 250,000ns, 즉 250μs 또는 0.25ms로 제시됨
- 같은 최신 SSD를 사용하더라도 네트워크 연결은 개별 읽기·쓰기 요청 처리 시간이 한 자릿수 규모로 더 길어짐
- 대량 순차 IO에서는 부정적 영향을 줄일 수 있지만 제거할 수는 없음
- 네트워크 연결 스토리지는 매번 스토리지 시스템에 접근할 때 추가 지연을 만든음
IOPS 제한과 직접 연결 스토리지의 차이
- AWS와 Google Cloud를 포함한 많은 클라우드 제공자는 네트워크 연결 스토리지 모델에서 wire를 통해 보낼 수 있는 IO 작업 수를 제한함
- Amazon의 GP3 EBS 인스턴스는 기본적으로 초당 3000 IOPS를 허용함
- 더 높게 설정할 수 있지만 추가 비용이 듦
- 이전 GP2 EBS 볼륨은 가끔 burst를 허용하기 위해 IOPS pool을 쌓는 방식으로 동작함
- 스토리지를 컴퓨트 인스턴스에 직접 연결하면 인위적인 IO 작업 제한이 없음
- 직접 연결에서는 하드웨어가 허용하는 만큼 읽고 쓸 수 있음
내구성과 확장성을 유지하는 방식
- 직접 연결 SSD에서 문제 1인 데이터 내구성은 복제로 해결할 수 있음
- 일반적인 방식은 한 서버를 primary로 두어 모든 write 요청을 받고, 2개 이상의 추가 서버가 데이터를 복제받는 구조임
- 데이터가 세 곳에 있으면 데이터 손실 가능성이 작아짐
- 예시 수치로 월간 서버 장애 확률이 1%라고 가정하면:
- 단일 서버에서는 매달 데이터 손실 확률이 1% 임
- 세 서버에서는
1% × 1% × 1% = 0.0001%, 즉 100만 분의 1 확률로 낮아짐
- PlanetScale은 실패한 노드를 자동 감지하고 교체하며, 데이터베이스 데이터를 자주 안정적으로 백업함
- 문제 2인 드라이브 확장성은 더 많은 수동 개입이 필요함
- 디스크가 용량 한계에 가까워질 때 모니터링과 알림이 필요함
- 필요할 때 용량을 쉽게 늘릴 도구가 필요함
PlanetScale Metal의 접근
- Metal은 직접 연결 NVMe SSD를 사용하는 데이터베이스 클러스터를 제공함
- 각 데이터베이스 인스턴스는 direct-attached NVMe SSD로 실행됨
- Metal 클러스터는 기본적으로 primary 1개와 replica 2개로 구성됨
- 지원 데이터베이스 클러스터는 Vitess 또는 Postgres임
- 스토리지 한계에 도달하면 몇 번의 클릭으로 더 큰 드라이브가 있는 서버로 크기를 조정할 수 있음
- 내부적으로 새 노드를 띄우고 기존 인스턴스에서 새 인스턴스로 데이터를 마이그레이션하며, 이 과정은 zero downtime으로 처리됨
- Metal 데이터베이스에는 인위적인 IOPS cap이 없음
- 사용자는 낮은 지연으로 IO 작업을 수행할 수 있고, 클라우드 제공자의 비싼 IOPS 클래스 비용이나 throttle 없이 하드웨어가 허용하는 만큼 사용할 수 있음