Database/NoSQL

[cassandra] 카산드라 살펴보기 👁️

도토리즈 2023. 5. 24. 21:34

와 포스팅 진짜 오랜만이다... 반성해라

1일 1포스팅 하겠다던 다짐 다 사라졌냐고..

 

 

카산드라(Cassandra)

분산형, 고성능, 확장 가능한 NoSQL 데이터 베이스 . 대량의 데이터를 처리하고 빠른 읽기 및 쓰기 성능 제공

 

카산드라 특징

① 분산 아키텍처

여러 대의 서버에 데이터를 분산하여 저장하고 처리, 고 가용성과 확장성 제공, 서버 간 데이터를 자동으로 복제하여 장애 복구 및 데이터 손실 방지 기능을 갖춤

② 고성능

높은 처리량, 낮은 지연시간을 제공하기 위해 설계. 데이터는 여러 노드에 분산되어 저장, 데이터 병렬 처리 가능 , 분산된 데이터를 읽고 쓰는 기능을 통해 뛰어난 성능 발휘

③ 행-열 구조 데이터 모델

테이블은 행과 열로 구성되며 테이블 간의 관계가 없음. 유연한 스키마를 지원하므로 데이터 모델을 동적으로 변경 가능

④ 분산 데이터 저장

데이터를 여러 노드에 분산하여 저장. 데이터는 파티션 키에 따라 여러 노드에 분할, 각 노드는 여러개의 컬럼으로 저장됨. 데이터 규모를 수평으로 확장할 수 있는 장점 제공

⑤ 고가용성 

여러 노드에 데이터를 자동으로 복제하여 고가용성 보장. 복제 노드는 원본 데이터와 동기화되며 한 노드가 장애가 발생하더라도 다른 복제 노드에서 데이터를 제공하여 연속적인 서비스 유지 

 

- ex ) student 테이블 생성

CREATE TABLE key.student 
(name TEXT,
hakbun INT, 
major TEXT, 
age int,
reg_date TEXT,
PRIMARY KEY ((name, hakbun), reg_date );

해당 문법에서 partition key 는 primary key의 제일 첫번째 (name, hakbun) 가 해당되며 reg_date 컬럼은 pk가 됨

 

 

 

- ex) python(django) 에서 cassandra 세션 연결 및 종료 메소드 생성

from cassandra.cluster import Cluster

#세션 연결
def connect_to_cass():
    cluster = Cluster(['localhost']) #setting.py에 연동하거나 다른 방법으로 db 정보 가져옴  
    session = cluster.connect()  
    session.set_keyspace('key') 
    return session

#세션 종료
def close_cass_connection(session):
    session.cluster.shutdown()

 

- ex) python(django) 에서 cassandra 데이터 insert

#데이터 삽입
def insert_data_to_cassandra(students):
    session = connect_to_cass() #세션 연결
    
    # set query
    query = """INSERT INTO student 
    (name, hakbun, major, age, reg_date) 
    VALUES (?, ?, ?, ?, ?)"""
    
    prepared_query = session.prepare(query)
    
    #students 데이터는 list안의 여러개의 dict 형태로 전달받은 데이터라고 가정
    #[{'name' : 'dotorizz' , 'hakbun' : '20140000' , 'major' : 'statistics', 
    # 'age' : '29', 'reg_date' : '2014-03-02'}, {.....}, .... , {.....}]
    # student 정보 삽입 
    for student in students:
        #동기 방식
        session.execute(prepared_query, 
        (student['name'], student['hakbun'], student['major'],
         student['age'],  student['reg_date']))
         
        #비동기 방식
        #session.execute_async(prepared_query, 
        #(student['name'], student['hakbun'], student['major'],
        #student['age'],  student['reg_date']))
    
    close_cass_connection(session)  # 연결 종료

 

- ex) python(django)에서 cassandra 데이터 select

@api_view(['POST'])
def select_data_to_cassandra(request):
    name = request.data.get('name')
    hakbun = request.data.get('hakbun')

    session = connect_to_cass()  # 세션 연결
    query = f"SELECT * FROM key.student WHERE name = '{name}' AND hakbun = '{hakbun}'"
    result = session.execute(query)

    close_cass_connection(session)  # 연결 종료

    # 결과 처리
    student_data = []
    for row in result:
        student_info = {
            'name': row.name,
            'hakbun': row.hakbun,
            'major': row.major,
            'age': row.age,
            'reg_date': row.reg_date,
        }
        data.append(student_info)

    return Response(student_data)
    
    # return Response(list(result)) 형태로 간결하게 작성도 가능

 

 

 

[위키백과] 카산드라

 

아파치 카산드라 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 헬레노스(Helenos)는 카산드라를 위한 그래픽 사용자 인터페이스이다. 아파치 카산드라(Apache Cassandra)는 자유-오픈 소스 분산형 NoSQL 데이터베이스 관리 시스템의

ko.wikipedia.org

 

기타 유튜브 보면서 카산드라 자료 좀 더 공부해야겠다