Skip to content

Commit

Permalink
cassandra
Browse files Browse the repository at this point in the history
  • Loading branch information
WonYong-Jang committed Dec 14, 2024
1 parent 55ca885 commit 9e2da1b
Show file tree
Hide file tree
Showing 2 changed files with 240 additions and 0 deletions.
106 changes: 106 additions & 0 deletions _posts/database/2024-12-14-DB-Cassandra.md
Original file line number Diff line number Diff line change
@@ -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)으로
이루어진 컬럼들로 구성된다.

<img width="774" alt="스크린샷 2024-12-14 오후 5 29 15" src="https://github.com/user-attachments/assets/d2ec4cfc-11db-4988-8d51-3298017db33f" />

`카산드라는 기본적으로 링(Ring) 구조를 가지며,
링을 구성하는 각 노드에 데이터를 분산하여 저장한다.`
파티션 키라고 불리는 데이터의 해시(hash)값을 기준으로
데이터를 분산하게 된다.





<img width="816" alt="스크린샷 2024-12-14 오후 5 32 03" src="https://github.com/user-attachments/assets/2ec56765-c3a2-4ce3-baa5-c31d7bf120e2" />




- - -
Referrence

<https://meetup.nhncloud.com/posts/58>

{% highlight ruby linenos %}
{% endhighlight %}

{%- if site.disqus.shortname -%}
{%- include disqus.html -%}
{%- endif -%}

134 changes: 134 additions & 0 deletions _posts/database/2024-12-15-DB-Cassandra-Query-Language.md
Original file line number Diff line number Diff line change
@@ -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

<https://www.datastax.com/ko/blog/deep-look-cql-where-clause>

{% highlight ruby linenos %}
{% endhighlight %}

{%- if site.disqus.shortname -%}
{%- include disqus.html -%}
{%- endif -%}

0 comments on commit 9e2da1b

Please sign in to comment.