Origin Redundancy
HTTP 기반 CDN 또는 Cache 시스템이 고가용성 (High Availability, HA)을 위해 Origin Failover를 지원하는 경우, OvenMediaEngine Enterprise는 Origin Server로서 Main과 Backup Server가 동일한 콘텐츠를 제공할 수 있도록 Redundancy 기능을 제공합니다.

CDN이 Origin Failover를 지원하는 경우 Main Server에 장애가 발생하면 Backup Server로 자동 전환되며, 이를 위해 Main과 Backup Server는 동일한 콘텐츠를 동일한 방식으로 제공해야 합니다. 이 가이드에서는 서로 다른 Server에 설치된 OvenMediaEngine Enterprise가 어떻게 동일한 Low-Latency HLS (LL-HLS) 및 HLS 콘텐츠를 제공할 수 있도록 구성할 수 있는지 설명합니다.
TimestampMode 설정하기 | 0.18.3.0+
TimestampMode
는 Timestamp 정렬을 위한 기능입니다.
OvenMediaEngine Enterprise는 Main과 Backup Server가 동일한 콘텐츠를 생성할 수 있도록 세 가지 Timestamp Mode를 제공합니다:
ZeroBased
* Default
Stream Timestamp를 0부터 시작합니다.
SystemClock
서버의 시스템 시계를 기준으로 Timestamp를 설정합니다.
Original
외부 Encoder가 생성한 원본 Timestamp를 그대로 사용합니다.
TimestampMode
기능은 외부 Encoder가 OvenMediaEngine Enterprise로 Stream을 전송할 때, Timestamp가 wall clock과 관계없이 (대부분 0부터) 시작하여 Stream 생성 시점에 따라 Main과 Backup Server가 서로 다른 Timestamp를 가진 LL-HLS/HLS 콘텐츠를 생성하는 문제를 해결합니다.
처음에는 Main과 Backup Server가 동일한 시점에서 시작하더라도, 한쪽 Server가 재시작되면 재시작한 Server의 Timestamp가 다시 0부터 시작하여 두 Server 간 Timestamp가 불일치하게 됩니다. 이로 인해 CDN에서 Main과 Backup Server가 전환될 때마다 비연속적인 Timestamp 증가가 발생하고, LL-HLS/HLS Player가 콘텐츠를 정상적으로 재생하지 못하는 문제가 발생할 수 있습니다.
따라서, 적절한 Timestamp Mode 설정으로 Main과 Backup Server가 동일한 타임스탬프를 생성하도록 해야 합니다:
인코더가 wall clock 기반 Timestamp를 사용하는 경우 (예: AWS Elemental Live, FFmpeg):
<TimestampMode>
Orignal
</TimestampMode>
인코더가 wall clock과 상관없이 Timestamp를 생성하는 경우 (예: OBS는 0부터 시작):
<TimestampMode>
SystemClock
</TimestampMode>
SystemClock
모드를 사용할 경우, OvenMediaEngine Enterprise은 Server의 시스템 시계를 기준으로 Timestamp를 설정하므로, 두 Server의 시스템 시간이 반드시 동기화되어 있어야 합니다.
Encoder가 사용하는 Timestamp 방식을 알 수 없을 때는 SystemClock
모드를 사용하여 Timestamp를 일치시키는 것을 권장합니다.
TimestampMode 예제
다음과 같이 Server.xml
에서 <Providers><[Protocol Name]><TimestampMode>
를 설정하여 사용하십시오:
<?xml version="1.0" encoding="UTF-8"?>
<Server version="8">
...
<VirtualHosts>
<VirtualHost>
<Applications>
<Application>
<Providers>
<OVT>
<TimestampMode>SystemClock</TimestampMode> <!-- Original, ZeroBased -->
</OVT>
<RTMP>
<TimestampMode>SystemClock</TimestampMode>
</RTMP>
<WebRTC>
<TimestampMode>SystemClock</TimestampMode>
</WebRTC>
<RTSPPull>
<TimestampMode>SystemClock</TimestampMode>
</RTSPPull>
<SRT>
<TimestampMode>SystemClock</TimestampMode>
</SRT>
<Schedule>
<TimestampMode>SystemClock</TimestampMode>
<MediaRootDir>schedule</MediaRootDir>
<ScheduleFilesDir>schedule</ScheduleFilesDir>
</Schedule>
</Providerrs>
</Application>
</Applications>
</VirtualHost>
</VirtualHosts>
...
</Server>
ServerTimeBasedSegmentNumbering 설정하기
ServerTimeBasedSegmentNumbering
은 Segment 번호를 일치시키는 기능입니다.
OvenMediaEngine Enterprise는 HLS/LL-HLS Segment 번호 (Sequence Number)를 서버 시스템 시계 기준으로 생성할 수 있는 ServerTimeBasedSegmentNumbering
기능을 제공합니다. 이를 통해 Main과 Backup Server의 Stream 생성 시점과 무관하게 동일한 Sequence Number를 가진 Segment를 생성하도록 보장할 수 있습니다.
ServerTimeBasedSegmentNumbering
기능을 사용할 때, LL-HLS 또는 HLS의 다음 설정 값들이 반드시 일치해야 합니다:
ChunkDuration
SegmentDuration
SegmentCount
또한, Stream의 FPS와 Keyframe Interval도 동일하게 설정되어야 합니다.
ServerTimeBasedSegmentNumbering 예제
다음과 같이 Server.xml
에서 <Publishers><LLHLS><ServerTimeBasedSegmentNumbering>
( 또는 <Publishers><HLS><ServerTimeBasedSegmentNumbering>
)을 활성화 하십시오:
<?xml version="1.0" encoding="UTF-8"?>
<Server version="8">
...
<VirtualHosts>
<VirtualHost>
<Applications>
<Application>
<Publishers>
...
<LLHLS>
<OriginMode>true</OriginMode>
<ServerTimeBasedSegmentNumbering>true</ServerTimeBasedSegmentNumbering>
<ChunkDuration>1</ChunkDuration>
<PartHoldBack>3</PartHoldBack>
<SegmentDuration>6</SegmentDuration>
<SegmentCount>10</SegmentCount>
<CrossDomains>
<Url>*</Url>
</CrossDomains>
</LLHLS>
<HLS>
<SegmentCount>10</SegmentCount>
<SegmentDuration>4</SegmentDuration>
<ServerTimeBasedSegmentNumbering>true</ServerTimeBasedSegmentNumbering>
<CrossDomains>
<Url>*</Url>
</CrossDomains>
</HLS>
...
</Publishers>
</Application>
</Applications>
</VirtualHost>
</VirtualHosts>
...
</Server>
OriginMode란?
OriginMode
를 활성화하면 OvenMediaEngine Enterprise가 각 Player Session에 고유한 session key를 발급하지 않고, Session별 접근 제어 (Access Control) 기능을 비활성화합니다. 이로 인해 모든 사용자에게 동일한 URL과 구조로 콘텐츠가 제공되어, Cache Server가 LL-HLS 또는 HLS 콘텐츠를 정상적으로 Cache할 수 있게 됩니다.
기본적으로 OvenMediaEngine Enterprise는 Player Session별로 session key를 발급하여 접근 제어를 수행하지만, 이 방식은 Cache Server 입장에서 콘텐츠가 Session 단위로 분리되어 Cache가 불가능합니다. 따라서, OvenMediaEngine Enterprise를 Cache Server의 Origin으로 사용할 때는 Cache Server가 콘텐츠를 Cache할 수 있도록 OriginMode
를 활성화해야 합니다.
단, OriginMode
활성화 시, 접근 제어 책임은 Origin Server가 아닌 Cache Server로 이관됩니다. 즉, 콘텐츠 접근 권한 제한을 위해 Cache Server에서 별도의 인증 및 권한 부여 로직을 구현해야 합니다.
PacketSilenceTimeoutMs 설정하기 | 0.18.3.0+
PacketSilenceTimeoutMs
는 무응답 Stream을 감지하고 종료하는 기능입니다.
일정 시간 동안 Packet이 전송되지 않는 Stream을 감지하고 종료하기 위해 OvenMediaEngine Enterprise는 PacketSilenceTimeoutMs
설정을 제공합니다. 이 설정이 활성화되면, 지정된 시간 이상 Packet이 수신되지 않을 경우 해당 Stream을 종료하고 HTTP 오류 상태 코드 (예: 404)를 반환합니다. 이를 통해 CDN이 Main Server 장애를 인지하고 Backup Server로 전환 (Failover)할 수 있습니다.
일부 Encoder는 연결을 유지하면서도 Packet 전송을 일정 시간 중단할 수 있습니다. 이는 가변 FPS Encoder가 정지된 화면을 보내는 정상적인 경우일 수도 있고, TCP 연결 이상이나 Encoder 오류로 인한 비정상 상태일 수도 있습니다. OvenMediaEngine Enterprise는 이러한 상황에서 Stream을 계속 유지하며 HTTP 오류를 반환하지 않기 때문에 CDN이 문제를 감지하지 못할 수 있습니다.
아래와 같은 Providers
에서 PacketSilenceTimeoutMs
설정을 지원합니다:
RTMP
SRT
WebRTC
Multiplex
PacketSilenceTimeoutMs 예제
다음과 같이 Server.xml
에서 <Providers><Protocol Name><PacketSilenceTimeoutMs>
를 설정하여 사용하십시오:
<?xml version="1.0" encoding="UTF-8"?>
<Server version="8">
...
<VirtualHosts>
<VirtualHost>
<Applications>
<Application>
<Providers>
<RTMP>
<TimestampMode>SystemClock</TimestampMode>
<PacketSilenceTimeoutMs>1000</PacketSilenceTimeoutMs>
</RTMP>
<MPEGTS>
<TimestampMode>SystemClock</TimestampMode>
<PacketSilenceTimeoutMs>1000</PacketSilenceTimeoutMs>
</MPEGTS>
<SRT>
<TimestampMode>SystemClock</TimestampMode>
<PacketSilenceTimeoutMs>1000</PacketSilenceTimeoutMs>
</SRT>
<WebRTC>
<TimestampMode>SystemClock</TimestampMode>
<PacketSilenceTimeoutMs>1000</PacketSilenceTimeoutMs>
</WebRTC>
<Multiplex>
<MuxFilesDir>mux_files</MuxFilesDir>
<PacketSilenceTimeoutMs>1000</PacketSilenceTimeoutMs>
</Multiplex>
</Providerrs>
</Application>
</Applications>
</VirtualHost>
</VirtualHosts>
...
</Server>
RTSP, OVT와 같은 Pull 방식 Provider의 경우에는 이미 noInputFailoverTimeoutMs
라는 구성을 제공하고 있습니다.
Last updated