![[DB/Cassandra] Docker Compose로 Cassndra 설정 및 Spring 연](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FWRKUu%2FbtsI6WAxMnI%2FAAAAAAAAAAAAAAAAAAAAACCYlLpNWYWDaNzmj2kCwD0mDD6ek4Nqt3glewp_iuHW%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DZzcDOWIt3U8rGMGePnF3Uj4tD2U%253D)
[DB/Cassandra] Docker Compose로 Cassndra 설정 및 Spring 연Database/Cassandra2024. 8. 19. 01:58
Table of Contents
728x90
1. 환경 변수 설정
.env
CASSANDRA_PORT=9042
CASSANDRA_PORT_OUTPORT=9042
CASSANDRA_CLUSTER_NAME=TestCluster
CASSANDRA_DC=test_datacenter
CASSANDRA_RACK=test_rack
CASSANDRA_SEEDS=test_cassandra
CASSANDRA_START_RPC=true
CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
CASSANDRA_PASSWORD_SEEDER=true
CASSANDRA_USER=test_user
CASSANDRA_PASSWORD=test_password
CASSANDRA_KEYSPACE=test_coin_transaction
변수 설명
- CASSANDRA_PORT:
Cassandra가 사용하는 기본 포트를 지정, 기본적으로 9042번 포트를 사용하며, 클라이언트가 이 포트를 통해 Cassandra에 연결 - CASSANDRA_PORT_OUTPORT:
호스트와 컨테이너 간의 포트 매핑에서 사용 이 포트는 호스트에서 Cassandra에 접근할 때 사용 - CASSANDRA_CLUSTER_NAME:
Cassandra 클러스터의 이름을 지정 클러스터 이름은 동일한 클러스터에 속한 모든 노드에서 동일해야함 - CASSANDRA_DC:
데이터 센터 이름을 지정 Cassandra의 분산 설정에서 노드를 논리적으로 그룹화하는 데 사용됨 - CASSANDRA_RACK:
랙 이름을 지정 데이터 센터 내의 노드를 추가로 그룹화하는 단위로, 장애 도메인에 따라 데이터를 분산할 수 있다 - CASSANDRA_SEEDS:
시드 노드의 호스트 이름 또는 IP 주소를 지정 시드 노드는 클러스터 초기화 시 다른 노드가 클러스터에 조인할 수 있도록 도움을 준다. 여기서는 컨테이너 이름 cassandra를 사용해 시드 노드를 지정한다 - CASSANDRA_START_RPC:
RPC(Remote Procedure Call)를 활성화할지 여부를 지정 Cassandra의 기본 통신 메커니즘은 native protocol이며, RPC는 이전 버전의 Cassandra에서 사용된다 - CASSANDRA_ENDPOINT_SNITCH:
Cassandra의 데이터 배치를 결정하는 Snitch 유형을 지정 GossipingPropertyFileSnitch는 노드 간의 통신을 최적화하기 위해 노드의 위치 정보(데이터 센터, 랙)를 고려함 - CASSANDRA_PASSWORD_SEEDER:
Cassandra가 패스워드 시더를 사용하여 초기 노드를 설정할지 여부를 지정 기본적으로 관리자가 설정한 비밀번호를 사용해 클러스터를 초기화함 - CASSANDRA_USER:
Cassandra에 접속할 때 사용할 사용자 이름을 지정 - CASSANDRA_PASSWORD:
Cassandra에 접속할 때 사용할 비밀번호를 지정 - CASSANDRA_KEYSPACE:
사용할 키스페이스(데이터베이스 스키마와 유사)를 지정. 이 키스페이스는 데이터가 저장될 논리적 공간
더보기
아직 이들이 정확히 어떤 역할을 하는 것까지 완전이해를 하지는 못했다. Cassandra를 사용하면서 천천히 알아가 보려고 한다.
2. Docker Compose
docker-compose.yml
version: '3.8'
services:
cassandra:
image: cassandra:latest
container_name: cassandra
ports:
- "${CASSANDRA_PORT}:${CASSANDRA_PORT_OUTPORT}"
environment:
CASSANDRA_CLUSTER_NAME: "${CASSANDRA_CLUSTER_NAME}"
CASSANDRA_DC: "${CASSANDRA_DC}"
CASSANDRA_RACK: "${CASSANDRA_RACK}"
CASSANDRA_SEEDS: "${CASSANDRA_SEEDS}"
CASSANDRA_START_RPC: "${CASSANDRA_START_RPC}"
CASSANDRA_ENDPOINT_SNITCH: "${CASSANDRA_ENDPOINT_SNITCH}"
CASSANDRA_PASSWORD_SEEDER: "${CASSANDRA_PASSWORD_SEEDER}"
CASSANDRA_USER: "${CASSANDRA_USER}"
CASSANDRA_PASSWORD: "${CASSANDRA_PASSWORD}"
volumes:
- cassandra_data:/var/lib/cassandra
- ../cql/create_keyspace.cql:/docker-entrypoint-initdb.d/create_keyspace.cql
restart: always
volumes:
cassandra_data:
docker yml 파일에 작성해둔 환경변수들을 매핑한다.
create-keyspace.cpl
CREATE KEYSPACE IF NOT EXISTS ${CASSANDRA_KEYSPACE}
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}
AND durable_writes = true;
KEYSPACE를 생성하기 위해서 필요한 cql 파일
- CREATE KEYSPACE : 새로운 키스페이스를 생성
- IF NOT EXISTS : 이미 존재하는 경우 오류 없이 진행
- ${CASSANDRA_KEYSPACE} : 생성할 키스페이스의 이름
- WITH replication : 데이터의 복제 전략과 복제 계수를 설정
- SimpleStrategy : 단일 데이터 센터에서 단순한 복제 전략
- replication_factor = 1 : 데이터를 단일 노드에만 저장
- durable_writes = true : 데이터가 안전하게 디스크에 기록되도록 설정
../cql/create_keyspace.cql:/docker-entrypoint-initdb.d/create_keyspace.cql
위 코드를 사용해서 keyspace를 컨테이너가 생성될때 같이 생성한다. 따라서 컨테이너가 생성될 때 따로 cql문을 통해서 생성할 번거로움을 피한다.
docker-compose up -d
docker 파일을 실행시킨다.
3. Spring 설정
application.yml
spring:
data:
cassandra:
contact-points: ${CASSANDRA_SEEDS}
port: ${CASSANDRA_PORT}
keyspace-name: ${CASSANDRA_KEYSPACE}
username: ${CASSANDRA_USER}
password: ${CASSANDRA_PASSWORD}
schema-action: none
스프링에서 통신할 수 있도록 yml을 작성한다.
build.gradle
/* Cassandra */
implementation 'org.springframework.boot:spring-boot-starter-data-cassandra'
카산드라 의존성을 추가한다.
728x90
@코딩하는 자연대생 :: 자연대생도 코딩을 하고 싶어