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
'▶ 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 |
댓글