NoSQL/Cassandra DB 14

카산드라(cassandra), Commit Log, Memtable, SSTable

카산드라는 테이블의 데이터를 넣는 저장소를 SSTable(Sorted String Table)이라 합니다. SSTable은 파일이기 때문에 데이터가 입력되는 시점에 항상 SSTable로 저장한다면 저장하는 데 많은 시간이 소요될 것입니다. 저장뿐만 아니라 데이터를 읽기 위해 항상 SSTable에서 읽어와야 한다면 읽는 시간도 오래 걸릴 겁니다. 그래서 SSTable에 저장하기 전에 메모리에 먼저 기록합니다. 이 메모리를 Memtable 이라 합니다. 그러나 Memtable의 이름에서 알 수 있듯이 Memtable은 메모리이므로 휘발성입니다. 서버가 다운되면 메모리에 기록된 데이터는 모두 지워집니다. 그러므로 메모리에 기록하기 전에 디스크 파일로 저장할 필요가 생깁니다. 이를 커밋로그(Commit Log)..

NoSQL/Cassandra DB 2021.08.11

카산드라(cassandra), 데이터를 저장하는 과정(심화)

이전 글에서는 데이터를 읽고 쓰는 과정을 간단히 설명하였습니다. 또한 아래 그림의 각 부분에 대한 설명은 Commit Log, Memtable, SSTable 글을 참고할 수 있습니다. 본 글에서는 데이터를 저장하는 과정을 조금 더 깊게 들여다보겠습니다. 카산드라가 데이터의 입력이 성공했다고 판단하는 시점은 Commit Log에 기록된 후입니다. 최종 목적지인 SSTable에 입력할 데이터를 차곡차곡 Commit Log에 기록합니다. 그러므로 Commit Log에 입력된 후라면 해당 노드가 다운되더라도 노드가 재가동되면 SSTable에 기록되지 않는 입력데이터를 Commit Log를 통해 순차적으로 기록하게 됩니다. 이것이 Commit Log의 유일한 목적입니다. Commit Log은 크기는 commit..

NoSQL/Cassandra DB 2020.11.18

카산드라(cassandra), 데이터를 읽는 과정(심화)

카산드라(cassandra), 데이터를 읽고 쓰는 과정에서는 클라이언트에서 카산드라의 데이터를 읽는 절차를 가볍게 설명하였습니다. 이번 글에서는 데이터를 읽는 과정을 좀 더 자세히 설명하겠습니다. 가장 단순한 경로는 요청한 데이터를 디스크(SSTable)에서 읽는 것입니다. 그러나 해당 데이터를 디스크에서 바로 읽는 것은 매우 비용이 큽니다. 즉, 시간이 오래 걸립니다. 그래서 카산드라는 최대한 메모리에서 읽으려고 시도합니다. 위의 그림에서는 이름이 "홍길동"인 데이터를 찾는 과정을 도식화한 것입니다. 이해를 돕기 위해 데이터를 요청한 노드에 데이터가 존재한다고 가정합니다. 데이터 조회 요청 시 ① "홍길동"의 번호 "1"을 조회 조건으로 입력하여 데이터를 요청합니다. 해당 요청을 받는 노드를 코디네이터..

NoSQL/Cassandra DB 2020.11.16

카산드라(cassandra), 데이터 저장 구조 - 클러스터링 키(Clustering Key)

카산드라 테이블 생성 시 아래의 PRIMARY KEY 구문을 유심히 보시기 바랍니다. PRIMARY KEY의 선두에 위치한 (month, day)는 파티션 키(Partition Key)이며, 파티션 키 뒤에 위치한 컬럼이 클러스터링 키(Clustering Key)입니다. 파티션 키로 데이터가 저장될 노드의 위치를 알 수 있다면 클러스터링 키의 역할은 무엇일까요? 아래의 테이블을 예로 들어 설명하겠습니다. 위의 표는 그림 1의 weather_data_by_date 테이블에 데이터를 넣은 모습을 표현한 것입니다. 데이터는 모두 5건이 존재하며 Partition Key인 month와 day가 모두 1월, 1일 이므로 동일한 노드에 저장됩니다. 그러나 동일한 노드에 데이터가 저장되더라도 무작위로 입력되는 것이 ..

NoSQL/Cassandra DB 2020.11.02

카산드라(cassandra), 데이터 저장 구조 - 키스페이스(Keyspace)

카산드라는 데이터를 노드에 저장합니다. 이 노드의 연결 구조를 클러스터(Cluster) 또는 링(Ring)이라 합니다. 그러나 데이터가 노드에 직접 저장되는 것은 아닙니다. 노드에 저장하기 위해서는 테이블이라는 논리적인 저장소가 필요합니다. 이를 도식화하면 다음과 같습니다. 위의 그림에서 노드는 키스페이스(Keyspace)를 포함하며 논리적 저장소인 테이블은 키스페이스에 포함됩니다. 카산드라에서는 테이블을 생성하기 전에 반드시 키스페이스를 생성해야 합니다. 키스페이스 생성 시 데이터를 몇 개의 노드에 복제할지를 결정하는데 이를 Replication Factor(이하 RF)라 합니다. 예를 들어 RF를 3으로 선언한 경우는 저장된 데이터를 인접한 두 개의 노드에 데이터를 복제합니다. 만약, RF를 테이블마..

NoSQL/Cassandra DB 2020.10.23

카산드라(cassandra), Virtual Node(vnode)

카산드라의 노드에는 토큰 범위(token range)가 할당돼 있습니다. 그리고 파티션 키를 통해 얻은 토큰 값으로 해당 노드를 찾게 됩니다. 그런데 토큰의 범위는 -2^63 부터 (2^63)-1 사이의 한정된 값을 가지는데 노드마다 일부를 부여합니다. 토큰의 범위를 단순화하여 예를 들면 아래의 그림과 같습니다. 카산드라의 초기 버전(ver. 1.1 이하) 에서는 위의 그림처럼 노드마다 오직 하나의 토큰 범위를 수작업으로 할당했습니다. 그러므로 노드가 추가되거나 제거된다면 기존의 토큰 범위를 조정해야 했습니다. 토큰 범위를 조정한다는 것은 해당 데이터의 이동이 발생한다는 의미입니다. 그러므로 토큰 범위를 재할당하는 작업은 비용이 큰 작업입니다. 카산드라는 이러한 문제를 개선하기 위해 카산드라 ver. 1..

NoSQL/Cassandra DB 2020.10.21

카산드라(cassandra), 토큰(token)

카산드라에서는 토큰(token) 값을 사용하여 데이터가 저장될 위치를 찾습니다. 토큰 값을 얻기 위해 파티션 키(Partition Key)를 파라미터로 전달합니다. 토큰 값으로 데이터가 저장될 위치(클러스터의 노드 위치)를 알 수 있는 이유는 무엇일까요? 위의 그림은 쉽게 설명하기 위해 4개의 노드로 구성된 클러스터를 예시로 들었습니다. 그림의 예에서 클러스터 전체에 할당된 토큰의 범위는 1부터 12까지입니다. 그리고 각 노드마다 1~12 사이의 토큰 값을 할당하였습니다. 즉, 노드 1은 1~3의 토큰 범위를 가지며 노드 2는 4~6의 토큰 범위를 가집니다. 노드 3은 7~9의 토큰 범위를 가지고 노드 4는 10~12의 토큰 범위를 가집니다. 서두의 질문으로 돌아가서 토큰 값으로 데이터가 저장될 노드의 ..

NoSQL/Cassandra DB 2020.10.12

카산드라(cassandra), 데이터 저장 구조 - 파티션 키(Partition Key)

아래 그림에서 '홍길동' 데이터를 입력할 때 저장될 노드를 찾는 역할을 파티셔너(Partitioners)라고 설명했습니다. 파티셔너가 데이터가 저장될 위치를 찾을 때는 해시(hash) 함수를 사용하는데 이 해시 함수의 파라미터(parameter)가 파티션 키(Partition Key)입니다. 즉, 아래의 그림처럼 해시 함수의 파라미터로 입력된 값 "1" 이 파티션 키입니다. 카산드라는 테이블을 생성할 때 파티션 키를 지정해야 하는데 아래의 예에서는 "번호"를 파티션 키로 지정하였습니다. 파티션 키가 해시 함수를 통과하면 토큰(token) 값을 받습니다. 토큰 값은 클러스터에 존재하는 여러 노드 중 하나에 속합니다. 토큰 값이 속하는 노드에 데이터를 저장합니다. 아래는 테이블 생성 시 파티션 키를 지정하는..

NoSQL/Cassandra DB 2020.09.23

카산드라(cassandra), 데이터가 저장되는 노드 찾기 - 파티셔너(Partitioners)

카산드라가 여러 개의 노드(클러스터)로 구성되었다면 모든 노드에 동일한 데이터 세트가 저장될까요? 만약 모든 노드에 동일한 데이터 세트를 저장한다면 아래의 그림처럼 모든 노드가 '홍길동', '이순신', '김유신' 데이터를 가진 모습일 것입니다. 물론 Availability는 매우 증가합니다만, 노드가 증가할수록 모든 노드에 동일 데이터를 복제하기 위해 카산드라는 매우 바쁘게 일해야 할 것입니다. 그리고 대용량의 데이터를 모든 노드에 저장하는 것은 그만큼의 디스크를 확보해야 하므로 비용적인 측면에서는 매우 비효율입니다. 카산드라는 데이터를 모든 노드에 복제하기보다는 아래의 그림처럼 특정 노드에 할당합니다. 그러면 데이터를 모든 노드에 복제하기 위해 바쁠 필요가 없습니다. 그리고 이웃한 한 두 개의 노드에 ..

NoSQL/Cassandra DB 2020.09.15

카산드라(cassandra), 데이터를 읽고 쓰는 과정

카산드라는 데이터를 여러 노드에 분산하여 저장합니다. 즉, 노드마다 할당된 데이터가 다릅니다. 클라이언트는 카산드라에 접근하기 위해 특정 노드에 접속합니다. 아래 그림의 ①번에 해당합니다. 이처럼 클라이언트가 접속한 노드를 코디네이터라 합니다. 데이터 읽기 코디네이터는 클라이언트가 요청한 데이터가 클러스터의 어느 노드에 있는지 확인 후 해당 노드에 데이터를 요청합니다. 아래 그림의 ②번에 해당합니다. 해당 노드는 요청받은 데이터를 코디네이터로 전달합니다. 아래 그림의 ③번에 해당합니다. 끝으로 코디네이터는 전달받은 데이터를 클라이언트로 전달합니다. 아래 그림의 ④번에 해당합니다. 데이터 쓰기 코디네이터는 클라이언트가 저장하려는 데이터가 클러스터의 어느 노드에 저장되어야 하는지 확인 후 해당 노드에 데이터..

NoSQL/Cassandra DB 2020.09.08