본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

LiteFS 이벤트 스트림 읽기

원문 보기 위키 갱신

LiteFS는 FUSE 파일시스템 마운트를 통해 복제 위치와 현재 프라이머리 상태를 읽을 수 있는 메커니즘을 제공해요. 하지만 이는 파일시스템을 폴링하는 방식이라 오버헤드와 약간의 지연이 있어요. 복제나 프라이머리 변경의 실시간 업데이트가 필요하다면 LiteFS 이벤트 스트림을 사용할 수 있어요. 이 문서에서는 이벤트 스트림의 사용법과 각 이벤트 유형을 설명해 드릴게요.

출처: 문서

본문

LiteFS는 FUSE 파일시스템 마운트를 통해 복제 위치와 현재 프라이머리 상태를 읽는 메커니즘을 제공해요. 하지만 이는 파일시스템을 폴링하는 것이라 오버헤드와 약간의 지연이 있어요.

복제나 프라이머리 변경의 실시간 업데이트가 필요하다면 LiteFS 이벤트 스트림을 사용할 수도 있어요. 이벤트 스트림은 클라이언트에게 줄바꿈으로 구분된 JSON 이벤트 스트림을 보내는 HTTP 엔드포인트예요.

사용법

이벤트 스트림은 LiteFS 노드의 GET /events에서 접근할 수 있어요:

$ curl localhost:20202/events
{"type":"init","data":{"isPrimary":true}}
{"type":"tx","db":"db","data":{"txID":"0000000000000027","postApplyChecksum":"83b05248774ce767","pageSize":4096,"commit":2,"timestamp":"2023-09-06T19:12:34.985Z"}}
{"type":"tx","db":"db","data":{"txID":"0000000000000028","postApplyChecksum":"8467267f644a1b66","pageSize":4096,"commit":2,"timestamp":"2023-09-06T19:12:39.586Z"}}

이벤트 유형

init

init 이벤트는 항상 이벤트 스트림에 게시되는 첫 번째 이벤트예요. 로컬 노드가 프라이머리인지 여부와, 아니라면 현재 프라이머리의 호스트네임에 대한 기본 정보를 포함해요. 이 이벤트에는 향후 더 많은 필드가 추가될 수 있어요.

{
    "type": "init",
    "data": {
        "isPrimary": false,
        "hostname": "myPrimaryHost:20202"
    }
}

tx

이 이벤트는 새 트랜잭션이 LiteFS에 기록될 때마다 게시돼요. 이 이벤트는 트랜잭션이 프라이머리로서 로컬로 수행되든, 레플리카가 수신했든 관계없이 발생해요.

txID 필드는 16진수 형식의 트랜잭션 ID예요. postApplyChecksum은 트랜잭션이 적용된 후 전체 데이터베이스의 체크섬이에요. 이 두 필드가 복제 위치를 구성해요.

commit 필드는 페이지 단위의 데이터베이스 크기이며, pageSize 필드와 곱하면 데이터베이스 파일의 총 크기를 바이트 단위로 알 수 있어요.

timestamp 필드는 트랜잭션이 원래 프라이머리 노드에 기록된 시각이에요. 서버 간 시계가 어긋날 수 있어 항상 신뢰할 수는 없어요.

{
    "type": "tx",
    "db": "db",
    "data": {
        "txID": "0000000000000027",
        "postApplyChecksum": "83b05248774ce767",
        "pageSize": 4096,
        "commit": 2,
        "timestamp": "2023-09-06T19:12:34.985Z"
    }
}

primaryChange

이 이벤트는 현재 프라이머리 상태에 대한 정보를 보여줘요. 노드가 프라이머리가 되거나, 프라이머리 상태를 잃거나, 프라이머리에 연결하거나, 프라이머리에 대한 연결을 잃는 등 상태가 변경될 때마다 전달돼요.

{
    "type": "primaryChange",
    "data": {
        "isPrimary": false,
        "hostname": "myPrimaryHost:20202"
    }
}

더 알아보기 (Learn more)