Fastly Segmented Caching 완전 이해: 대용량 콘텐츠 전송의 핵심 기술
CDN을 운영하다 보면 1GB가 넘는 대용량 파일이나 게임 패치, 동영상, 설치 이미지처럼 큰 객체(large object)를 캐싱하고 전송해야 하는 상황이 자주 발생합니다. 하지만 이런 대용량 파일은 캐시 저장, 재검증(revalidation), 푸시/퍼지(purge) 등에서 기존의 단일 오브젝트 캐싱 모델로는 한계가 있습니다.
이 문제를 해결하기 위해 Fastly는 Segmented Caching(세그먼트 캐싱)이라는 강력한 기능을 제공합니다. 이번 글에서는 Segmented Caching이 어떤 구조로 동작하는지, 어떤 장점이 있는지, 실제 운영 시 주의할 점은 무엇인지 자세히 살펴보겠습니다.
Segmented Caching이란?
Segmented Caching은 하나의 대용량 파일을 여러 개의 작은 조각(segment)으로 나누어 캐싱하는 Fastly의 기술입니다.
이 덕분에 Fastly는 전체 파일을 한 번에 가져오지 않고, 필요한 구간만 선택적으로 가져올 수 있습니다.
예를 들어, 1GB짜리 파일을 1MB 단위로 분할해 저장한다고 가정해 봅시다. 클라이언트가 Range 요청(Range: bytes=0-1048575)을 보냈을 때, Fastly는 전체 파일을 다시 다운로드하지 않고 해당 세그먼트만 원본(origin)에서 가져오거나 캐시에서 응답할 수 있습니다.
Segmented Caching의 동작 구조
Fastly에서 segmented caching이 활성화되면, 다음과 같은 구조로 요청이 처리됩니다.
1. Outer Request
클라이언트로부터 들어오는 최초의 요청입니다.
예:
| GET /game/patch_v1.3.pkg HTTP/1.1 Range: bytes=0-4194303 |
이 요청은 “이 객체가 segmented caching 대상인가?”를 판단하고, 필요하다면 여러 개의 inner request를 생성합니다.
2. Inner Request
각 세그먼트별로 생성되는 서브 요청(sub-request)입니다.
예를 들어, 4MB 단위로 분할된 경우 다음과 같은 요청이 만들어집니다.
| GET /game/patch_v1.3.pkg.segment0 GET /game/patch_v1.3.pkg.segment1 GET /game/patch_v1.3.pkg.segment2 ... |
각 inner request는 Fastly 내부에서 병렬로 처리되어, 원본에서 데이터를 가져오거나 캐시된 세그먼트를 사용합니다.
3. 조립 및 응답
Fastly는 inner request의 응답을 조합해 하나의 연속된 바이트 스트림으로 클라이언트에 전달합니다.
이는 Fastly 엣지 노드 내부에서 수행되므로, 클라이언트는 단일 객체를 받는 것처럼 보입니다.
설정 방법
Segmented Caching은 VCL설정을 통해 아래와 같이 활성화할 수 있습니다.
예시:
if (req.url.ext == "mp4" || req.url.ext == "pkg") {
set req.enable_segmented_caching = true;
set segmented_caching.block_size = 4194304; # 4MB 세그먼트
}
- req.enable_segmented_caching: segmented caching을 활성화
- segmented_caching.block_size: 세그먼트 크기(기본값 1MB, 최대 4MB)
블록 크기 선택 기준
- 1MB: 많은 파일 조각, 세밀한 캐시 갱신 가능
- 4MB: 세그먼트 수 감소, 메타데이터 부담 적음, 대형 파일에 효율적
실제 운영에서는 트래픽 패턴에 따라 1MB와 4MB 혼합 비율을 조정하기도 합니다.
(예: 인기 콘텐츠 4MB, 일반 콘텐츠 1MB 등)
Segmented Caching 적용 시 고려 사항 (Considerations)
Fastly는 대용량 리소스를 제공하는 서비스에서 Segmented Caching을 활성화할 것을 권장합니다.
이 기능을 사용하지 않는 경우, 계정 생성 시점에 따라 캐시 가능한 최대 객체 크기에 차이가 있습니다.
계정 생성 시기Segmented Caching 미사용 시 최대 캐시 크기
| 2020년 6월 17일 이후 생성 | 20 MB |
| 2020년 6월 17일 이전 생성 | 2 GB (Streaming Miss 미사용 시)5 GB (Streaming Miss 사용 시) |
즉, 20MB 이상의 파일을 캐싱해야 한다면 반드시 Segmented Caching을 활성화해야 합니다.
제한 사항 및 주의점 (Limitations and Considerations)
Segmented Caching은 강력하지만, 몇 가지 제약이 있습니다.
실제 서비스에 적용할 때는 아래 사항을 반드시 고려해야 합니다.
1. 동적 콘텐츠에는 부적합
- 이 기능은 완전히 정적인(static) 콘텐츠용입니다.
- 댓글, 사용자별 데이터 등 동적으로 생성되는 콘텐츠에는 적합하지 않습니다.
- 만약 콘텐츠가 자주 변경된다면, 수동 purge 또는 이벤트 기반 purge를 반드시 설정해야 합니다.
2. 압축(Compression) 및 ESI와 비호환
- Segmented Caching은 Object Compression 및 ESI(Edge Side Includes) 기능과 함께 사용할 수 없습니다.
- 두 기능을 활성화해야 한다면, 반드시 Segmented Caching을 비활성화해야 합니다.
3. Image Optimizer(IO)와 비호환
- Fastly의 Image Optimizer(IO) 기능이 켜져 있으면 Segmented Caching은 자동으로 비활성화됩니다.
- 이미지 최적화 기능과는 동시에 사용할 수 없습니다.
4. Chunked Transfer Encoding 미지원
- Fastly와 Origin 간의 통신에서 HTTP chunked encoding은 지원되지 않습니다.
- Origin 서버는 반드시 Content-Length 헤더를 포함해 정확한 Range 응답을 반환해야 합니다.
5. URL Purge는 인증 필요
- Segmented Caching이 활성화된 경우, URL purge 시 내부적으로 모든 세그먼트 객체를 동시에 제거합니다.
- 이때 URL purge 인증 토큰이 반드시 필요합니다.
6. 리소스 크기로 조건부 활성화 불가
- 세그먼트 캐싱은 “리소스 크기” 기반으로 켜거나 끌 수 없습니다.
- 이유는, 캐시 조회 전에는 객체의 크기를 알 수 없기 때문입니다.
- 대신 URL 패턴이나 확장자 기반으로 조건을 걸 수 있습니다.
if (req.url.path ~ "^/video/" || req.url.ext == "m4v") {
set req.enable_segmented_caching = true;
}
7. 기존 캐시된 리소스는 재사용 불가
- Segmented Caching을 나중에 활성화하더라도, 이미 캐시되어 있던 전체 객체는 사용되지 않습니다.
- Fastly는 원본으로부터 다시 Range 요청을 수행해 새로운 세그먼트 캐시를 구성합니다.
- 따라서 기존 객체는 purge하거나 자연스럽게 TTL 만료를 기다리는 것이 좋습니다.
8. 캐시 히트율(CHR) 지표 왜곡
- Segmented Caching을 사용할 경우, **CHR(캐시 히트율)**이 실제보다 낮게 표시될 수 있습니다.
- Fastly는 “outer request” 기준으로 통계를 집계하기 때문에,
- 예를 들어 100MB 중 99MB가 캐시에 있고 1MB만 오리진에서 가져온 경우에도 “miss”로 계산됩니다.
- 실제 오리진 오프로딩(offload) 비율은 훨씬 높습니다.
9. Streaming Miss 기능과 함께 사용 권장
- 대용량 파일을 전송할 때는 Segmented Caching과 함께 Streaming Miss를 활성화하는 것이 좋습니다.
- Streaming Miss는 오리진에서 데이터를 모두 받기 전에, 먼저 수신한 세그먼트를 즉시 전송할 수 있도록 합니다.
- 이를 통해 사용자는 훨씬 빠르게 다운로드를 시작할 수 있습니다.
모니터링 및 트러블슈팅 포인트
구분주요 확인 포인트
| 로그 | vcl_log에서 req.enable_segmented_caching 여부, inner/outer 요청 식별 |
| 메트릭 | segment_store_bytes, segment_hit_ratio 등 확인 |
마무리: 대용량 콘텐츠 전송의 필수 옵션
Segmented Caching은 단순한 “캐시 최적화 기능”을 넘어,
대용량 콘텐츠를 안정적으로, 빠르게, 효율적으로 제공하기 위한 핵심 기술입니다.
적용 권장 대상:
- 20MB 이상의 정적 파일 (예: 비디오, 게임 패치, ISO, 대형 ZIP 등)
- 업데이트 주기가 길고 변동이 적은 리소스
- 오리진 트래픽을 줄이고 싶은 서비스
적용 시 주의:
- 동적 콘텐츠에는 부적합
- IO, Compression, ESI와 함께 사용 불가
- Purge 인증 필수
참고 자료
https://www.fastly.com/documentation/guides/full-site-delivery/caching/segmented-caching/
'Fastly_CDN > CDN_설정' 카테고리의 다른 글
| 패스틀리(Fastly), 캐시 포이즈닝(Cache Poisoning) 방지에 대해서 (0) | 2025.12.05 |
|---|---|
| 패스틀리(Fastly), Cache Key조작에 대해서 (0) | 2025.11.26 |
| 패스틀리(Fastly), 캐싱 베스트 프랙티스 정리 (0) | 2025.10.28 |
| 패스틀리(Fastly), Image Optimizer 서비스의 유용한 옵션 (0) | 2024.12.30 |
| 패스틀리(Fastly), Image Optimizer 서비스에 대해서 (0) | 2024.12.09 |