이전 글에서는 데이터를 읽고 쓰는 과정을 간단히 설명하였습니다. 또한 아래 그림의 각 부분에 대한 설명은 Commit Log, Memtable, SSTable 글을 참고할 수 있습니다. 본 글에서는 데이터를 저장하는 과정을 조금 더 깊게 들여다보겠습니다.
카산드라가 데이터의 입력이 성공했다고 판단하는 시점은 Commit Log에 기록된 후입니다. 최종 목적지인 SSTable에 입력할 데이터를 차곡차곡 Commit Log에 기록합니다. 그러므로 Commit Log에 입력된 후라면 해당 노드가 다운되더라도 노드가 재가동되면 SSTable에 기록되지 않는 입력데이터를 Commit Log를 통해 순차적으로 기록하게 됩니다. 이것이 Commit Log의 유일한 목적입니다. Commit Log은 크기는 commitlog_total_space_in_mb 속성의 값을 조정하여 설정할 수 있으며 기본값은 8,192MB 입니다.
입력된 데이터가 Memtable에 기록되고 나서 특정 조건이 성립되면 SSTable에 기록을 하게 됩니다. 특정 조건이란 Commit Log가 가득 차거나 Memtable이 가득 찬 경우입니다. 이렇게 Memtable의 내용을 SSTable에 기록하여 Memtable의 내용을 비우는 작업을 Flush라고 합니다. SSTable은 SSTable(Sorted String Table)이라 하였습니다. 명칭에서 알 수 있듯이 SSTable은 데이터의 파티션 키(Partition Key)와 클러스터링 키(Clustering Key)를 기준으로 정렬이 되어야 합니다. Flush 과정을 조금 더 설명해 보겠습니다.
만약 Memtable의 내용을 SSTable에 Flush하면서 정렬한다면 Flush작업은 시간이 매우 많이 소요되는 작업이 될 것입니다. 그래서 카산드라는 이 정렬작업을 Memtable에 데이터가 입력되는 순간 수행합니다. Memtable은 메모리이므로 정렬작업은 메모리에서 매우 빠른 속도로 수행할 수 있습니다. Memtable의 내용을 SSTable에 Flush하는 시점에는 Memtable의 내용은 이미 정렬된 상태이기 때문에 카산드라는 정렬의 고민 없이 Memtable의 내용을 SSTable에 순차적으로 기록하게 되며 빠른 속도로 데이터를 저장할 수 있습니다. 이러한 특징을 log-based(로그기반), append-only(추가방식)라 합니다.
SSTable에서도 append-only의 특징은 동일합니다. 데이터를 변경하는 경우에도 카산드라는 기존의 데이터를 변경하지 않고 추가하는 방식으로 데이터를 저장합니다. 대신 기존의 데이터는 더는 유효하지 않다고 표시합니다. 이렇게 하여 변경된 데이터만 보여지게 됩니다.
'NoSQL > Cassandra DB' 카테고리의 다른 글
카산드라(cassandra), Commit Log, Memtable, SSTable (0) | 2021.08.11 |
---|---|
카산드라(cassandra), 데이터를 읽는 과정(심화) (0) | 2020.11.16 |
카산드라(cassandra), 데이터 저장 구조 - 클러스터링 키(Clustering Key) (0) | 2020.11.02 |
카산드라(cassandra), 데이터 저장 구조 - 키스페이스(Keyspace) (0) | 2020.10.23 |
카산드라(cassandra), Virtual Node(vnode) (0) | 2020.10.21 |