다음을 통해 공유


CLFS 안정적인 스토리지

CLFS(Common Log File System) 스트림에 레코드를 쓰면 레코드가 휘발성 메모리의 로그 I/O 블록(마샬링 영역)에 배치됩니다. CLFS는 주기적으로 마샬링 영역에서 디스크와 같은 안정적인 스토리지로 로그 I/O 블록을 플러시합니다. 안정적인 스토리지 디바이스에서 로그는 컨테이너 집합으로 구성되며, 각 컨테이너는 실제 매체의 연속 범위입니다. 스트림에 대한 안정적인 스토리지를 형성하는 컨테이너의 컬렉션을 로그 또는 실제 로그라고 합니다.

다음 그림에서는 컨테이너를 보여 줍니다.

컨테이너, 블록 및 레코드를 보여 주는 다이어그램

앞의 그림은 세 개의 로그 I/O 블록을 포함하는 컨테이너를 보여 줍니다. 첫 번째 로그 I/O 블록에는 3개의 레코드가 포함되고, 두 번째 로그에는 5개의 레코드가 포함되고, 세 번째 로그에는 두 개의 레코드가 포함됩니다. 그림에서 알 수 있듯이 각 로그 I/O 블록의 시작은 항상 안정적인 스토리지 매체의 섹터 시작 부분과 일치합니다. 안정적인 스토리지의 로그 I/O 블록은 크기가 다릅니다.

CLFS는 3개의 숫자 집합을 사용하여 로그에서 레코드를 찾습니다.

  • 컨테이너 식별자는 레코드를 보유하는 컨테이너를 식별합니다.

  • 블록 오프셋은 레코드를 보유하는 로그 I/O 블록의 시작 부분의 바이트 오프셋(컨테이너 내)을 제공합니다.

  • 레코드 시퀀스 번호는 로그 I/O 블록 내의 레코드를 식별합니다.

CLFS 로그 레코드의 LSN(로그 시퀀스 번호)에는 실제로 컨테이너 식별자, 블록 오프셋 및 레코드 시퀀스 번호의 세 가지 정보가 포함됩니다. 그러나 로그 클라이언트에 지정된 LSN에는 CLFS가 안정적인 스토리지의 레코드에 액세스하기 전에 물리적 컨테이너 식별자에 매핑해야 하는 논리적 컨테이너 식별 자가 포함되어 있습니다.

CLFS는 논리 컨테이너 식별자를 사용하여 실제 컨테이너가 재활용될 때 로그 레코드가 컨테이너의 지속적인 시퀀스에 기록되고 있다는 보기를 클라이언트에 제공합니다.

로그에 3개의 컨테이너가 있고 단일 클라이언트가 CLFS 레코드를 로그에 쓰고 있다고 가정해 보겠습니다. 다음 시나리오에서는 컨테이너를 재활용하는 방법을 보여줍니다.

  1. 클라이언트는 세 개의 컨테이너를 모두 채울 수 있는 충분한 로그 레코드를 작성합니다.

  2. 클라이언트는 ClfsAdvanceLogBase 또는 ClfsWriteRestartArea를 호출하여 로그 베이스를 컨테이너 2의 레코드 중 하나로 설정합니다. 이렇게 하면 클라이언트는 컨테이너 1의 레코드가 더 이상 필요하지 않습니다.

  3. 클라이언트는 로그에 다른 레코드를 쓰고 새로 작성된 레코드의 LSN을 다시 가져옵니다. LSN의 논리 컨테이너 식별자는 4입니다. 레코드가 안정적인 스토리지로 플러시되면 클라이언트가 논리 컨테이너 4에서 볼 수 있는 레코드는 실제 컨테이너 1로 이동합니다.

다음 그림에서는 시나리오를 보여 줍니다. 논리 컨테이너의 클라이언트 시퀀스가 안정적인 스토리지의 실제 컨테이너에 매핑되는 방법을 보여 줍니다.

논리적 컨테이너와 물리적 컨테이너를 보여 주는 다이어그램

논리 컨테이너 식별자, 블록 오프셋 및 레코드 시퀀스 번호는 특정 스트림의 LSN이 항상 엄격하게 증가하는 시퀀스를 형성하는 방식으로 LSN에 저장됩니다. 즉, 스트림에 기록된 로그 레코드의 LSN(논리 컨테이너 식별자 포함)은 항상 동일한 스트림에 이전에 기록된 로그 레코드의 LSN보다 큽니다. 그런 다음 LSN은 이중 용도로 사용됩니다. 1) 스트림의 클라이언트에 정렬된 레코드 식별자 시퀀스를 제공하고 2) 안정적인 스토리지의 레코드 위치를 CLFS에 제공합니다.

레코드의 LSN이 제공되면 다음 함수를 호출하여 논리 컨테이너 식별자, 블록 오프셋 및 레코드 시퀀스 번호를 추출할 수 있습니다.

ClfsLsnContainer

ClfsLsnBlockOffset

ClfsLsnRecordSequence

논리 컨테이너 식별자는 32비트 숫자이므로 2^32개 가능한 논리 컨테이너 식별자가 있으며 0xFFFFFFFF 0x0 범위에 있습니다. 스트림에는 최대 2^32개의 논리 컨테이너가 있을 수 있습니다.

블록 오프셋은 LSN의 23비트로 저장되지만 ClfsLsnBlockOffset 은 안정적인 스토리지 매체의 섹터 크기와 일치하는 32비트 숫자를 반환합니다. 블록 오프셋은 항상 512의 배수입니다. 또한 블록 오프셋은 안정적인 스토리지 매체의 섹터 크기와 정렬됩니다. 예를 들어 섹터 크기가 1024바이트인 경우 블록 오프셋은 1024의 배수가 됩니다.

레코드 시퀀스 번호는 9비트 숫자이므로 2^9(512) 가능한 레코드 시퀀스 번호가 있으며 0x1FF 0x0 범위에 있습니다. 로그 I/O 블록에는 최대 512개 레코드가 있을 수 있습니다.