본문 바로가기
▶ Back-End/Java

SpringBoot + Cassandra 연동(Multi Node)

by 오늘도 코딩 2023. 8. 18.
728x90
반응형

Docker에 설치한 Cassandra(Multi Node)와 SpringBoot 연동

*spring-boot-starter-parent 2.3.10.RELEASE 기준

*Docker에 Application을 올리는 과정

*자세한 설명 생략

 

 

▷ 이슈 사항 확인

 

!! 이슈 → Local Host에서 Multi Node를 연동할 때 Docker Network 문제 발생

*SpringBoot는 Docker Containerr IP로 노드에 연결 시도

*Single Host Multi Node(Docker Container) 환경에서 발생

 

*Error log

[WARN ] : [s0|/172.19.0.3:9042]  Error while opening new channel (ConnectionInitException: [s0|connecting...] Protocol initialization request, step 1 (STARTUP {CQL_VERSION=3.0.0, DRIVER_NAME=DataStax Java driver for Apache Cassandra(R), DRIVER_VERSION=4.6.1, CLIENT_ID=74c1ebad-2a93-48c7-831c-1a63af4a8770}): failed to send request (java.nio.channels.NotYetConnectedException))

 

!! 해결 → Application을 Docker에 올려 Cassandra Cluster와 같은 대역에서 사용( 아래 관련 글 참고 )

*Single Node로 충분히 Local Host에서 성능을 제외한 Test 가능

*Multi Node로 진행 시Application을 배포

 

*비슷한 사례

 

contact points for a local cassandra instance

I have created 2 cassandra instances by deploying it on docker. One on port 9042 other one on 9043. I have 2 applications, one is to be connected to 9042 other one to 9043. 1st application is con...

stackoverflow.com

 

Getting error connecting to 4-node Cassandra cluster running in Docker from Spring Boot app

I am trying to set up docker-compose with 4 Cassandra nodes. Here is my docker-compose configuration: version: "3.8" services: cass1: image: cassandra:4 container_name: cas...

stackoverflow.com

 

 

▷ Coulmn Family Create

*Cassandra 설치 방법 아래 관련 글 참고

*example을 위한 Table

 

/** KEYSPACE 생성 */
-- CREATE KEYSPACE testDB WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1': 2};
-- → class : 
--	→ SimpleStrategy : 단일 데이터 센터
--	→ NetworkTopologyStrategy : 멀티 데이터 센터
--→ replication_factor : 복제본 수 설정

/** KEYSPACE 접속 */
-- USE testDB;

/** 테이블 생성 */
CREATE TABLE users ( user_id int PRIMARY KEY, fname text, lname text );

/** 데이터 생성 */
INSERT INTO users (user_id,  fname, lname) VALUES (1745, 'john', 'smith');

/** 데이터 조회 */
SELECT * FROM users;

 

 

▷ CassandraConfig.java

*Default DataCenterName : datacenter1

*Default UserNmae/Passworrd : cassandra/cassandra

*Keyspace : 위에서 생성한 name

*Project 관련 내용 아래 관련 글( SpringBoot + Cassandra 연동(Single Node) ) 참고

 

package com.example.test;

import java.net.InetSocketAddress;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.datastax.oss.driver.api.core.CqlSession;

/**
 * Cassandra Test Sample
 * 
 * Cassandra Configuration and CqlSession Create
 */
@Configuration
public class CassandraConfig {

  @Bean
  public CqlSession session() {
    return CqlSession.builder()
        // @JHLee. → host.docker.internal : Docker Container 내부 Host
        .addContactPoint(new InetSocketAddress("host.docker.internal", 9042))
        .addContactPoint(new InetSocketAddress("host.docker.internal", 9043))
        // @JHLee. → Cassandra 인증/권한 설정 후 적용(기본 설정으로 사용 중)
        // .withAuthCredentials("cassandra", "cassandra")
        .withLocalDatacenter("datacenter1")
        .withKeyspace("testdb")
        .build();
  }

}

 

 

Maven Install .jar 파일 생성

 

 

 

▷ Dockerfile 생성

*Docker로 Application을 구동하기 위한 파일

 

#openjdk:11 Image 사용
FROM openjdk:11

#*.jar파일을 JAR_FILE 변수에 저장
ARG JAR_FILE=*.jar

#JAR_FILE의 이름을 app.jar로 변경
COPY ${JAR_FILE} app.jar

#java -jar /app.jar 파일 실행
ENTRYPOINT ["java","-jar","/app.jar"]

 

 

▷ Application 실행

*Dockerfile을 생성한 위치에서 CMD를 통해 진행

*Image 삭제 : docker rmi test:0.1

*Container 삭제(해당 Container 종료 후) : docker rm test

 

*Image 생성

docker build -t test:0.1 ./
💡D:\test\target>docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
cassandra    latest    1e044ca28642   9 days ago   356MB

💡D:\test\target>docker build -t test:0.1 ./
[+] Building 2.1s (8/8) FINISHED                                                                                                                                   docker:default
 => [internal] load .dockerignore                                                                                                                                            0.0s
 => => transferring context: 2B                                                                                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                                                                                         0.0s
 => => transferring dockerfile: 291B                                                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/openjdk:11                                                                                                                1.7s
 => [auth] library/openjdk:pull token for registry-1.docker.io                                                                                                               0.0s
 => [internal] load build context                                                                                                                                            0.2s
 => => transferring context: 46.60MB                                                                                                                                         0.2s
 => CACHED [1/2] FROM docker.io/library/openjdk:11@sha256:99bac5bf83633e3c7399aed725c8415e7b569b54e03e4599e580fc9cdb7c21ab                                                   0.0s
 => [2/2] COPY *.jar app.jar                                                                                                                                                 0.1s
 => exporting to image                                                                                                                                                       0.1s
 => => exporting layers                                                                                                                                                      0.1s
 => => writing image sha256:cb86b1d1983ed5e712dfc419a24eb7056be5b91663c2f2b2f40154d60b775e3c                                                                                 0.0s
 => => naming to docker.io/library/test:0.1                                                                                                                                  0.0s

What's Next?
  View summary of image vulnerabilities and recommendations → docker scout quickview

💡D:\test\target>docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         0.1       cb86b1d1983e   16 seconds ago   701MB
cassandra    latest    1e044ca28642   9 days ago       356MB

 

*Container 생성

docker run -d --name test --net=cassandra_network -p 8080:8080 test:0.1
💡D:\test\target>docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED        STATUS       PORTS                                                       NAMES
5330810a4490   cassandra:latest   "docker-entrypoint.s…"   17 hours ago   Up 2 hours   7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9043->9042/tcp   cassandra-node2
a057ba397edf   cassandra:latest   "docker-entrypoint.s…"   17 hours ago   Up 2 hours   7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp   cassandra-node1

💡D:\test\target>docker run -d --name test --net=cassandra_network -p 8080:8080 test:0.1
9cf4d1d6baeacb8a4f77ad60d6131a93700367e748a62b63438083307f45e6ad

💡D:\test\target>docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED         STATUS         PORTS                                                       NAMES
9cf4d1d6baea   test:0.1           "java -jar /app.jar"      6 seconds ago   Up 6 seconds   0.0.0.0:8080->8080/tcp                                      test
5330810a4490   cassandra:latest   "docker-entrypoint.s…"   17 hours ago    Up 2 hours     7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9043->9042/tcp   cassandra-node2
a057ba397edf   cassandra:latest   "docker-entrypoint.s…"   17 hours ago    Up 2 hours     7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp   cassandra-node1

 

 

▷ 결과 확인

*Application Log 확인 : docker logs -f test

 

*Node 분산 확인 ( 실행, 종료 시 약간의 시간 필요 )

*cassandra-node1 O, cassandra-node2 O : 정상 확인

*cassandra-node1 O, cassandra-node2 X : 정상 확인

*cassandra-node1 X, cassandra-node2 O : 정상 확인

요청 결과

 

 

▷ 관련 글

 

Cassandra 기본 개념

Apache Cassandra의 기본 개념을 간단히 소개 *자세한 설명 생략 ▷ Cassandra 란? *현재 Facebook과 twitter 등 에서 사용 - Apache Cassandra는 대용량 데이터를 관리하기 위해 설계된 시스템으로 분산형 오픈소

coding-today.tistory.com

 

Cassandra 설치 방법과 간단한 Node 분산 Test

Docker를 이용해 Cassandra를 간단하게 설치할 수 있다. *단일 노드 / 다중 노드 설치방법 중 선택 *단일 노드 설치방법을 진행했다면 모든 과정을 초기화하고 진행 *다중 노드 설치는 단일 호스트에

coding-today.tistory.com

 

SpringBoot + Cassandra 연동(Single Node)

Docker에 설치한 Cassandra(Single Node)와 SpringBoot 연동 *spring-boot-starter-parent 2.3.10.RELEASE 기준 *자세한 설명 생략 ▷ 이슈 사항 확인 !! 이슈 → Local Host에서 Multi Node를 연동할 때 Docker Network 문제 발생 *Spr

coding-today.tistory.com

 

Dockerfile을 이용한 Application 배포

Dockerfile을 작성하여 Image 생성 후 Container 실행 *자세한 설명 생략 ▷ Dockerfile *Dockerfile: Docker에서 Image를 생성하기 위한 파일 # Docker Create Image # base Image(ubuntu 20.04) FROM adoptopenjdk/openjdk11 # application st

coding-today.tistory.com

 

 

728x90
728x90

'▶ Back-End > Java' 카테고리의 다른 글

Ramdom LocalTime 생성  (0) 2023.09.21
Random LocalDate 생성  (0) 2023.09.21
SpringBoot + Cassandra 연동(Single Node)  (0) 2023.08.09
Cassandra 설치 방법과 간단한 Node 분산 Test  (0) 2023.08.08
SLF4J 기본 사용 방법  (0) 2023.08.07

댓글