diff --git a/_posts/database/2024-12-14-DB-Cassandra.md b/_posts/database/2024-12-14-DB-Cassandra.md new file mode 100644 index 0000000..94b1bd4 --- /dev/null +++ b/_posts/database/2024-12-14-DB-Cassandra.md @@ -0,0 +1,106 @@ +--- +layout: post +title: "[DB] 카산드라(cassandra) " +subtitle: "" +comments: true +categories : Database +date: 2024-12-14 +background: '/img/posts/mac.png' +--- + +## 1. 카산드라(Cassandra) 개요 + +아파치 카산드라(Apache Cassandra)는 비정형 데이터를 여러 노드에 분산 +저장하여 대량의 트래픽을 신속히 처리하는 분산 저장형 데이터베이스이다. +클러스터 중단 없이 노드 수를 손쉽게 증가할 수 있어 확장성과 +고가용성이 필요한 대용량 데이터 관리에 최적화되어 있다. + + + +- - - + +## 2. 카산드라 특징 + +카산드라는 SQL과 비슷한 Cassandra Query Language(CQL)을 이용한다. + +- Keyspace: 데이터세트를 어떻게 구성할 것인지에 대한 정의를 한다. +- Table: 데이터 스키마를 정의한다. +- Partition: 모든 행에 이 +- Row: +- Column: 해당 테이블에서 행에 속하는 열을 말한다. + +- - - + +## 3. 카산드라 장점 + +### 3-1) 고성능 분산처리 + +카산드라는 여러 노드에 클러스터를 분산하여 저장할 수 있다. +링 구조로 된 노드들은 마스터 노드가 따로 존재하지 않고 모든 노드가 +각자 들어온 요청을 처리하는 구조이므로 대용량 데이터를 신속하게 병렬 +처리 가능하다. + + +### 3-2) 탄력적인 확장성 + +하드웨어 용량을 늘리는 수직 확장 대신 노드를 추가하여 요청을 분산해서 +처리하는 수평 확장으로 간편하게 클러스터 처리 용량을 확대할 수 있다. +노드는 클러스터 재구성 없이 손쉽게 증가, 감소 시킬수 있으며 +트랜잭션 처리 성능은 노드를 추가한 만큼 선형적으로 증가한다. + + + + +- - - + +## 4. 카산드라 단점 + +### 4-1) 높은 진입장벽 + +컬럼형 데이터베이스로 로우형 데이터베이스인 관계형 데이터베이스와는 +다른 생소한 개념이라 진입장벽이 높다. + +### 4-2) 복잡한 조건의 검색 불가 + +`복잡한 조건의 검색이 불가능하며, 대량이지만 검색 조건은 단순한 +서비스에 적합하다.` + +- - - + +## 5. 카산드라 데이터 구조 + +카산드라의 데이터 구조는 비교적 간단하다. +`최상위에 논리적 데이터(Data) 저장소인 키 스페이스(keyspace)가 있고, + 키 스페이스 아래에는 테이블이 존재한다.` + +테이블은 다수의 row 들로 구성되어 있으며 각 row는 키 값(key value)으로 +이루어진 컬럼들로 구성된다. + +스크린샷 2024-12-14 오후 5 29 15 + +`카산드라는 기본적으로 링(Ring) 구조를 가지며, + 링을 구성하는 각 노드에 데이터를 분산하여 저장한다.` +파티션 키라고 불리는 데이터의 해시(hash)값을 기준으로 +데이터를 분산하게 된다. + + + + + +스크린샷 2024-12-14 오후 5 32 03 + + + + +- - - +Referrence + + + +{% highlight ruby linenos %} +{% endhighlight %} + +{%- if site.disqus.shortname -%} + {%- include disqus.html -%} +{%- endif -%} + diff --git a/_posts/database/2024-12-15-DB-Cassandra-Query-Language.md b/_posts/database/2024-12-15-DB-Cassandra-Query-Language.md new file mode 100644 index 0000000..72307e0 --- /dev/null +++ b/_posts/database/2024-12-15-DB-Cassandra-Query-Language.md @@ -0,0 +1,134 @@ +--- +layout: post +title: "[DB] 카산드라 CQL(Cassandra Query Language)" +subtitle: "데이터 타입(Data Type) 및 쿼리 사용법 / Partition key, Primary key, Clustering key" +comments: true +categories : Database +date: 2024-12-15 +background: '/img/posts/mac.png' +--- + +Cassandra Query Language는 테이블에 저장된 데이터를 +찾기 위한 Query로 사용된다. + +관계형 데이터베이스에서는 다른 테이블의 데이터와 연관짓기 위해 +FK를 테이블에 지정하고 조인을 통해 데이터를 조회한다. +`하지만 카산드라에서는 단일 테이블에 접근하는 것이 최고의 설계이며, + 쿼리에 포함된 모든 엔티티는 하나의 테이블에 포함되어 있어야 + 가장 빠른 접근이 가능하다.` + +관계형 데이터베이스에서 여러개의 테이블 데이터를 불러오기 위하여 +조인이 사용되었던 것과는 다르게 `카산드라는 조인을 지원하지 않는다.` +따라서 필요한 모든 필드는 하나의 테이블에 모여있어야 한다. + +이처럼 CQL과 SQL은 사용방법에 차이가 발생하며, 차이가 발생하는 주요 원인은 +카산드라는 분산 데이터를 다루며 비효율적인 쿼리를 방지하는 것을 목표로 삼기 때문이다. +특히 CQL where 절에서 CQL과 SQL의 차이가 두드러지며 +이번글에서는 이러한 부분에 대해서 자세히 살펴보자. + + +- - - + +## 1. Cassandra Query Language + +SQL과 유사한 방식으로 CQL 를 사용하며 CRUD 연산을 수행한다. +다양한 데이터 타입을 지원하는데, 그 중에서 가장 일반적인 +Built-in type, Collection, 그리고 User-definded 타입 이렇게 세가지 타입을 +먼저 살펴보자. + +> CQL의 keyspace는 SQL의 database와 비슷한 개념이다. + + +### 1-1) Data type + +먼저 Built-in data type을 아래와 같다. + + +### 1-2) CQL key + +Primary key와 Partiton key의 선택은 클러스터에 데이터를 +분배하기 위하여 중요하다. + + +카산드라는 클러스터의 노드에 분산해서 데이터를 저장하는 +분산 시스템이다. +`partition key가 노드에 데이터를 분산하는데 사용`된다. +카산드라는 데이터 분배를 위해 일관된 해싱을 사용하여 데이터를 분배한다. +`Partition key는 Primary key의 첫번째 필드로 결정되며, + 적은 Partition은 Query에 대한 응답을 빠르게 한다.` + +아래 예제에서 테이블 t 는 Primary key인 id를 가지고 있다. + +```sql +CREATE TABLE t ( + id int, + k int, + v text, + PRIMARY KEY (id) +); +``` + +`클러스터에 데이터 분배를 위한 Partition key는 첫번째 Primary Key 인 +id로 생성된다.` + +테이블 t 가 Primary key로 복합키인 2개 이상의 key를 갖는다고 가정해보자. + +```sql +CREATE TABLE t ( + id int, + c text, + k int, + v text, + PRIMARY KEY (id,c) +); +``` + +`클러스터에 데이터 분배를 위한 Partition key는 첫번째 Primary key 인 +id로 생성되고 두번째 필드인 c 는 Clustering key가 되어 +Partition 안에서 Sorting 을 위해 사용된다.` + +> Clustering key를 사용하여 데이터를 정렬하게 되면 데이터 검색에 더 효과적이다. + +일반적으로 Primary key 의 첫번째 필드는 Partition key를 생성하기 위하여 +Hasing되고 남은 필드는 Partition 안에서 정렬을 하기 위한 Clustering key로 +사용된다. + +Partition 된 데이터는 Read 와 Write 의 효율성을 향상시킨다. +Primary key 외에 다른 필드들은 개별적으로 Indexing 되어 쿼리 성능 향상에 +사용될 수 있다. + +`Partition key는 그룹핑된다면 여러개의 필드로 사용될 수 있다.` +t 테이블의 다른 버전을 보면 첫번째 Primary key가 +그룹핑되어 2개의 id를 갖는걸 볼 수 있다. + +```sql +CREATE TABLE t ( + id1 int, + id2 int, + c1 text, + c2 text + k int, + v text, + PRIMARY KEY ((id1,id2),c1,c2) +); +``` + +`id1, id2가 Partition key를 생성하는데 사용되고 +나머지 필드인 c1, c2가 Clustering key로서 사용된다.` + +- - - + + + +- - - +Referrence + + + +{% highlight ruby linenos %} +{% endhighlight %} + +{%- if site.disqus.shortname -%} + {%- include disqus.html -%} +{%- endif -%} +