전체 글 55

Hands-On Helm: Deploying Essential Kubernetes Components

"k8s 클러스터에 springboot application 배포후 모니터링" 연재를 다루는데 helm 파트가 적지 않고, 이번에 helm chart를 직접 만들어서 install 해보는 결과 helm으로 애플리케이션 배포에 대한 포스팅을 따로 다뤄야할것 같아서 이렇게 포스팅하게 되었습니다 이번 포스트에서는 helm chart를 생성해서, k8s cluster에 애플리케이션을 배포하는 실천적인 내용을 다룹니다 환경Apple M2 PromacOS Sonoma 다루는 내용helm charthelm installhelm uninstall준비사항yaml로 k8s에 배포할 svc, deployment 작성해서 k8s cluster에 배포해보기helm chart 생성helm create demo helm: comm..

Chaining Kafka and Database Transactions with SpringBoot

Chaining Kafka and Database Transactions with Spring Boot, Minikube, Debezium connector for MySQL 이번 포스트에서는 kafka produce와 database transaction을 원자적으로 처리하는 것을 kotlin + springboot + mysql + kafka 조합으로 구성해봤습니다.kafka message produce와 JPA 영속화 코드를 트랜잭션으로 묶는게 목표였으나, 리서치해보고 직접 여러 가지 방법을 POC해봤을때, 서로 다른 솔루션을 같은 트랜잭션으로 묶는건 그렇게 간단하지도, 운영에서 사용하는게 맞을지도 미지수이기 때문에 운영에 사용할 방법은 아니라는 결정을 내렸습니다.대안으로는 Kafka Connect..

kotlin 코루틴 정리 - 1

이번 포스트에서는 코드로 kotlin coroutine을 사용해보면서 특징을 파악합니다크게 1,2로 나누어서 포스팅할 예정입니다포스팅 내용은 코루틴을 익히면서 고도화 될 예정입니다 다루는 내용runBlocking코루틴 취소코루틴 예외처리runBlockingkotlin에서는 다음과 같이 runBlocking으로 코루틴을 생성할 수 있습니다runBlocking 내에서는 코루틴을 사용할 수 있게 됩니다fun main () : Unit = runBlocking { printWithThread("START") launch { newRoutine() } printWithThread("END")}suspend fun newRoutine() { val num1 = 1 val num2 = 2 ..

kotlin/기초 2024.08.25

A Hands-on Guide to Automated Spring Boot Deployment using GitHub Actions

A Hands-on Guide to Automated Spring Boot Deployment using GitHub Actions "k8s 클러스터에 springboot application 배포 시리즈"의 시작 포스팅입니다이번 포스트에서는 github action으로 springboot application의 docker image를 remote registry에 push 해보도록하겠습니다. 준비사항:docker 사용경험gradle 사용경험docker 계정node.js 환경에서 개발 및 운영만 해오다보니 로컬 개발환경에서 개발환경에 배포하기 전이나 새로운 시스템을 개발해아할때 Dockerfile로 도커 이미지를 생성해서 AWS ECR이든 Google Container Registry에 도커 이미지를 ..

Spring Data JPA - join, 페이징 정리

ToMany, ToOne 관계에서 Spring Data JPA로 join시 페이징 처리에 대한 정리입니다.오늘 포스트는 Spring Data JPA에서는 ToOne, ToMany 관계의 join의 페이징 하는 방법이 다룹니다. 두 관계에 처리 방법이 다릅니다. 그리고 최적화 내용까지 다룹니다. 먼저, ToOne의 경우에는 fetchJoin으로 페이징쿼리를 하는게 어렵지 않습니다.join시 row수가 증가하지 않기 때문입니다.ToMany, OneToMany의 경우에는 (ManyToMany는 사용하지 않습니다.) 페이징 처리가 쉽지않습니다. ToOne 관계는 fetchjoin으로 조회합니다.ToMany 관계는 지연로딩으로 조회합니다. 지연로딩 최적화를 위해 hibernate.default_batch_size..

Java/JPA 2024.08.21

kafka consumer lag으로 kafka consumer auto scaling하기

이번 포스트에서는 kafka consumer lag을 기반으로 kafka consumer를 auto scaling 적용해봤습니다.준비사항kafka clusterk8s clusterkedalens상황kafka consumer가 lag이 쌓이면, kafka consumer를 늘려서 lag을 줄이고, lag이 줄면 kafka consumer를 줄여서 자원을 절약하고 싶습니다.해결방안keda를 이용하여 kafka consumer lag을 기반으로 kafka consumer를 auto scaling합니다.구성요소구현1. ScaledObject 생성HPA가 적용될 Deployment를 지정합니다.metadata.labels.deploymentName: HPA가 적용될 Deployment의 이름spec.scaleTa..

kafka 2024.08.21

Using HashiCorp Vault with Kubernetes SecretStore: Hands-on Guide

Using HashiCorp Vault with Kubernetes External Secrets: Hands-on Guide "k8s 클러스터에 springboot application 배포 시리즈"의 시작 포스팅입니다이번 포스트에서는 minikube에 배포한 Vault로 secret 정보를 관리하고 External Store 방식으로 k8s secret으로 연동해보겠습니다이전에 포스트한  Kubernetes Vault Deployment: A Hands-on Guide with Minikube 에 k8s에 vault를 배포하는 과정이 포스팅되어있습니다준비사항: Helm, k8s cluster, Vault 다루는 내용ExternalStore로 vault secret과 k8s secret 연동연동과정 중..

Kubernetes Vault Deployment: A Hands-on Guide with Minikube

Kubernetes Vault Deployment: A Hands-on Guide with Minikube"k8s 클러스터에 springboot application 배포 시리즈"의 시작 포스팅입니다이번 포스트에서는 k8s에 vault를 배포하여 vault-ui로 접근하여 파드에서 사용할 환경변수를 생성하겠습니다 다루는 내용k8s에 vault 배포vault-ui로 secret 생성 k8s에 vault 배포Create a Kubernetes namespace.kubectl create namespace vaultView all resources in a namespace.kubectl get all --namespace vaultTo access the Vault Helm chart, add the Has..

mysql - explain, explain analyze 해석

이번 포스트에서는 가끔 볼때마다 찾아보는 mysql explain, explain analyze에 대해서 정리했습니다아는내용이 추가될수록 정리하는 내용은 계속 업데이트할 예정입니다다루는 내용실행 계획 분석 ( explain analyze )id 컬럼type 컬럼key 컬럼key_len 컬럼ref 컬럼rows 컬럼filtered 컬럼Extra 컬럼using filesortusing indexusing temporaryusing wherebackward index scan explain analyze 예시 SQLEXPLAIN ANALYZESELECT first_name, last_name, SUM(amount) AS totalFROM staff INNER JOIN payment ON staff.staff_..

DB 2024.08.19

mysql - sending to client

자주 실행되는 쿼리는 아니지만 서버에서 타임아웃(1분)이 발생할정도로 오래걸리는 쿼리를 발견했습니다.쿼리만 보고는 크게 문제가 되보이지 않았습니다. execution plan을 봐도 filter가 안되거나 하지 않습니다.process list로 확인해보면 Sending to Client로 되어있고 쿼리 응답시간이 깁니다.기본 페이지네이션을 통해 데이터크기를 줄였습니다.20초 후반대 걸리는 쿼리가 ms단위로 줄었습니다. json 컬럼을 조회하면서 네트워크 payload가 커졌습니다. 쿼리 튜닝은 인덱스 대부분 개선되지만 이렇게 대량의 disk를 access하는 작업은 쿼리 응답시간이 오래 걸립니다.  참고링크:sending to client: https://stackoverflow.com/a/2462612..

DB 2024.08.19