728x90

Backend 150

Kubernetes 클러스터에 MongoDB 구성하기

kubernetes 에 MongoDB 를 replica set 으로 구성해서 사용해본다. MongoExpress 도 함께 설치할 예정인데 MongoExpress는 MongoDB 관리를 위한 GUI 웹어드민 툴이다. 우선 replica set 구성을 위해서는 각 노드가 통신할 수 있는 인증 key 가 필요하고 kubernetes 환경에서는 특정 key 파일을 secret 로 만들어서 각 노드에서 활용한다. 즉, 아래와 같다. openssl rand -base64 741 > ./replica-sets-key.txt kubectl create secret generic shared-bootstrap-data --from-file=internal-auth-mongodb-keyfile=./replica-sets-..

Backend/Database 2022.08.31

StatefulSet

상태를 유지하는 데이타베이스와 같은 애플리케이션을 관리하기 위한 컨트롤러가 StatefulSet 컨트롤러이다. (StatefulSet은 쿠버네티스 1.9 버전 부터 정식 적용 되었다. ) Pod 이름에 대한 규칙성 부여 StatefulSet에 의해서 생성되는 Pod들의 이름은 규칙성을 띈다. 생성된 Pod들은 {Pod 이름}-{순번} 식으로 이름이 정해진다. 예를 들어 Pod 이름을 mysql 이라고 정의했으면, 이 StatefulSet에 의해 생성되는 Pod 명들은 mysql-0, mysql-1,mysql-2 … 가 된다. ​ 배포시 순차적인 기동과 업데이트 또한 StatefulSet에 의해서 Pod가 생성될때, 동시에 모든 Pod를 생성하지 않고, 0,1,2,.. 순서대로 하나씩 Pod를 생성한다. ..

[SpringBoot] SpringMVC 에서 WebClient 사용시 주의사항

WebClient 는 Spring 에서 제공하는 RestClient 의 한 종류이다. 과거에 사용되던 RestTemplate 과 비슷한 역할이라고 생각하면 되는데 RestTemplate 는 장기적으로 Deprecated 예정이기 때문에 이제는 WebClient 를 사용해야 한다. WebClient 의 가장 큰 특징은 RestTemplate 과 다르게 논블로킹을 지원한다는 것이다. 말만 들으면 성능에 굉장한 이득이 있을 것 같지만 논블로킹 방식으로 사용하지 않으면 RestTemplate 을 사용하는 것과 차이가 없다. WebClient 의 응답값은 Mono 또는 Flux 타입이다. Mono, Flux 는 리액티브 스트림을 구성하는 파이프라인의 일부로 웹플럭스에서는 기본적으로 논블로킹 처리되지만 Spring..

Backend/Spring+Boot 2022.07.28

WebClient max connection 그리고 mutate()

max connection 의 default는 원래 기본적으로 제한이 없었으나 최근 버전에서는 호스트당 500개로 제한되어 있는 상태이다. 물론 이 값은 커스텀 할 수 있다. 그런데 이 사실을 알고나니 mutate() 대해 궁금해졌다. 난 WebClient를 호스트별로 mutate() 해서 사용했는데 만약 이때마다 새로운 인스턴스가 생성되는거라면 불필요하게 많은 WebClient 를 생성하게 되는거다. 그런데 서칭해보니 WebClient 는 한번 빌드한 뒤에는 이뮤터블하고 mutate() 하더라도 동일한 인스턴스가 사용되고 다른 설정값을 가지는 요청을 처리할 수 있게 해줄 뿐이라고 한다.

Backend/Spring+Boot 2022.07.22

spring-boot-maven-plugin 디버깅 하기

spring boot 가 많이 활성화 된 상황에서 프로젝트를 로컬에서 실행하는 방법은 매우 간단하다. 그냥 부트스트랩 클래스를 run 하면 된다. 그런데 간혹 갑자기 맡게된 프로젝트에서 이게 안되고 spring-boot-maven-plugin 을 통해서만 구동이 가능하게 구성된 프로젝트들이 있다. 즉, 로컬에서는 아래와 같이 mvn 플러그인 실행만으로 프로젝트를 구동할 수 있는 것이다. mvn spring-boot:run 그런데 문제는 이렇게 프로젝트를 띄우면 debug 모드가 지원되지 않아 breakpoint 에서 실행이 중단되지 않는다. 디버깅이 불가능하다는 말이다. 이때는 프로젝트를 띄울 때 원격 디버그 포트를 지원하도록 하고 해당 포트로 붙어서 서비스를 호출하면 우리가 원하는 데로 breakpoi..

Backend/Spring+Boot 2022.05.31

[Kotlin] SpringMVC WebClient 에 Resilience4j 적용하기

WebClient 는 SpringMVC 에서 동기식으로 사용할 것이고 WebClient가 아닌 다른 rest client 를 선택하더라도 적용방법은 크게 달라지지 않는다. WebFlux 에서 사용하는 비동기식 WebClient 에 적용하는 방법은 추후 다시 정리하도록 한다. Resilience4j 에서는 여러가지 모듈을 제공하는데 여기에서는 일반적으로 많이 사용하는 retry, circuitbreaker 모듈 적용만 정리한다. retry, circuitbreaker 설정에는 여러가지 설정값들이 존재하겠지만 application.yml 에 아래와 같이 설정되어 있다고 가정해보자. resilience4j: retry: configs: default: maxRetryAttempts: 3 waitDuration..

Backend/Kotlin 2022.05.10

mysql delete 데이터 공간 반납

mysql은 데이터를 delete 하더라도 사용 했던 공간은 바로 반납하지 않는다. 이에 대량 delete 의 경우 truncate 또는 사전에 파티셔닝을 해놔서 파티션을 삭제하는 방법을 선택한다. 그럼 delete 삭제된 데이터 공간은 영원히 반납하지 않느냐? 그건 또 아니다. 이후 DDL 이 수행될때 지워진 공간이 반납된다. truncate 나 파티션 삭제는 모두 DDL 이기 때문에 곧바로 공간이 반납될 뿐이다. 이를 이용하면 delete 를 수행하고 임의로 DDL를 수행하는 것도 하나의 방법이 될 수 있다.

Backend/Database 2022.04.27

[Kubernetes] Graceful Shutdown

쿠너네티스 환경에서는 Scale in/out 이 빈번하게 발생하기 때문에 Scale in 과정에서 종료되는 pod 들에 대한 관리가 필요하다. 예를 들어 pod에서 어떠한 로직을 처리중에 있는데 강제로 종료를 해버리면 당연히 문제가 될 것이고 종료되고 있는 과정에 트래픽이 인입되면 해당 요청을 정상처리할 수 없어 에러를 리턴할 수 밖에 없을 것이다. 이에 pod 이 정상적으로 종료될 수 있도록 대기시간을 주고 그 시간동안 트래픽은 막는 방안이 필요하다. 쿠버네티스에서는 pod 을 종료할 때 SIGTERM 시그널을 우선 보내고 terminationGracePeriodSeconds에 설정된 시간 이후에는 SIGKILL 시그널을 보내서 프로세스를 강제종료한다. terminationGracePeriodSecon..

WebClient SSL 설정

SSL 관련 설정은 가장 많이 다뤄지는 것이 핸드쉐이크 타임아웃인데 이는 default 값이 있기도 하고 설정역시 간단하기 때문에 여기에서 다루지 않는다. 여기에서 다룰 것은 자체서명 인증서를 사용하는 서버와 https 통신을 해야할 때 필요한 설정을 정리한다. 기본적으로 https 통신에 사용되는 인증서는 ROOT CA에 등록된 인증서여야 한다. ROOT CA는 전문적인 인증서 발급회사 의미하며 https 통신을 제공하려는 서버는 이러한 전문업체에 등록되어 정식 서명된 인증서를 사용해야 한다. 당연하게도 이러한 인증서는 관리목적으로 일정비용이 발생하게 되는데 단순히 테스트 목적이라면 굳이 ROOT CA 서명없이 자체서명된 인증서를 사용해도 무방하다. 다만 이러한 자체서명된 인증서를 사용할 경우 아래와 ..

Backend/Spring+Boot 2022.04.19
728x90