k3s 클러스터에 카산드라 DB 올려서 파이썬과 연동하기
개인적으로 만들어보고 싶은 웹사이트가 있었는데,
익숙한 MongoDB를 사용하게되면 라이센스 문제가 있었기에
그 대용으로 NoSQL DB인 카산드라를 사용해보기로 했다.
일단 대략 클러스터에 도커 이미지로 디비 설치하고 NodePort를 뚫어준다면
내부망에서 접근할 수 있으니까 로컬pc에서도 접속할 생각으로 진행하게 되었다.
라즈베리파이 하나에 연결된 외장 SSD를 활용할 생각이었기 때문에 hostPath 타입의 PV를 사용했다.
chown: Operation not permitted
스토리지는 처음 설정해보다보니 해당 에러가 발생했는데, 외장SSD의 포맷이 exfat이었기에 리눅스에서 마운트가 되지 않는 것이었다.
sudo mkfs.ext4 [디스크_경로]
sudo mkdir -p /mnt/ssd/[프로젝트_데이터_경로]/data
sudo chown -R 999:999 /mnt/ssd/[프로젝트_데이터_경로]
그래서 ext4으로 포맷해준 후에 다시 폴더를 만들어줬다.
이후 성공적으로 Pod가 뜬 것을 확인할 수 있었다.
이제 파이썬과 연결해야하는데,
cqlsh와 cassandra-driver 를 설치해줘야한다.
cqlsh는 cql 쿼리문을 터미널에서 작성해서 실행할 수 있는 command line interface이고,
cassandra-driver는 파이썬에서 카산드라 DB를 연결할 수 있도록 해주는 드라이버다.
pip install cqlsh cassandra-driver
하지만 임포트할 때 DependencyException: Unable to load a default connection class와 함께 Unable to import asyncore module 메시지가 발생했다.
이는 asyncore 모듈이 Python 3.12부터 제거된 것이 원인이었다.
그래서 conda로 3.11 버전의 가상환경을 만들어준 후에 진행했다.
cqlsh [데이터베이스 주소] [데이터베이스 포트] -u [유저이름] -p [비밀번호]
위 명령을 입력해서 데이터베이스에 접속할 수 있는데,
나는 데이터베이스가 설치된 노드의 아이피 주소를 입력했다.
유저이름은 기본적으로 cassandra로 설정되는것 같다.
CREATE KEYSPACE IF NOT EXISTS [프로젝트_네임스페이스_이름] WITH replication = {
'class': 'SimpleStrategy', 'replication_factor': 1
};
이후 접속된 데이터베이스 셸에서 해당 쿼리문으로 keyspace를 만들어준 후에,
CREATE TABLE IF NOT EXISTS test (
id UUID PRIMARY KEY,
message text,
created_at timestamp
);
이렇게 테스트 테이블을 만들어줄 수 있다.
INSERT INTO test (id, message, created_at) VALUES (
uuid(),
'첫 테스트 메시지',
toTimestamp(now())
);
위와 같은 INSERT문으로 데이터 하나를 추가할 수 있다.
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
auth_provider = PlainTextAuthProvider(username='cassandra', password='비밀번호')
cluster = Cluster(['데이터베이스 주소'], port=데이터베이스포트, auth_provider=auth_provider)
session = cluster.connect() # 세션 생성
rows = session.execute("SELECT * FROM 키스페이스이름.test") # 쿼리 실행
for row in rows:
print(row)
이렇게 파이썬을 실행해주면,
Row(id=UUID('8f104352-47fb-4532-8621-8debcbaaba89'), created_at=datetime.datetime(2025, 6, 19, 20, 50, 55, 786000), message='첫 테스트 메시지')
이렇게 출력되는걸 보아 잘 저장되고 있는걸 확인할 수 있었다.