| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 백엔드개발
- Java
- kafka
- 트랜잭션
- 성능 최적화
- netty
- mysql
- CloudNative
- monitoring
- DevOps
- GitOps
- 동시성제어
- helm
- webflux
- 데이터베이스
- selector
- JPA
- 성능최적화
- NIO
- jvm
- redis
- Kubernetes
- 백엔드
- SpringBoot
- prometheus
- Kotlin
- RDBMS
- spring boot
- docker
- grafana
- Today
- Total
목록mysql (7)
유성
DB를 선택할 때 보통 "MySQL은 웹 서비스에 좋고, PostgreSQL은 복잡한 데이터 분석에 유리하다"는 말을 듣곤 한다.물론 맞는 이야기다. 안정성을 위해 멀티 프로세스(PG)를 쓰는지, 속도를 위해 멀티 스레드(MySQL)을 쓰느냐의 차이도 있겠지만,이 글에서는 가장 결정적인 차이 Index와 MVCC를 구현하는 방식에 대해서 알아본다. 만약 MVCC가 무엇인지 궁금하다면, 아래 글을 참고하자. 데이터베이스 격리 수준과 동시성 제어의 실체REPEATABLE READ는 어떻게 구현되는가?부제: MySQL InnoDB의 MVCC와 Undo Log 해부 트랜잭션 격리 수준은 데이터베이스의 동시성 처리 성능과 데이터 무결성 사이의 트레이드오프를 결정하는 핵심 설정이다youseong.tistory.co..
지난 글에서는 Kubernetes 환경에서 로컬 디스크와 StatefulSet을 활용해 MySQL 마스터-슬레이브 복제 구조를 구축해 보았다.이번 글에서는 이렇게 구축된 DB 인프라를 Spring Boot 애플리케이션에서 어떻게 효율적으로 분기하여 연결하는지 알아보자. Kubernetes에서 MySQL 마스터-슬레이브(Replication) 구축하기쿠버네티스에서 데이터베이스를 운영할 때 가장 큰 고민은 "데이터의 영속성과 성능"일 것이다.이번 글에서는 로컬 디스크를 활용해 성능을 최적화하고, StatefulSet을 이용해 마스터-슬레이브 복youseong.tistory.com 1. Master-Slave는 각각 어떤 역할을 할까?DB 레플리케이션은 데이터의 정합성을 유지하면서 부하를 분산하기 위해 사용..
쿠버네티스에서 데이터베이스를 운영할 때 가장 큰 고민은 "데이터의 영속성과 성능"일 것이다.이번 글에서는 로컬 디스크를 활용해 성능을 최적화하고, StatefulSet을 이용해 마스터-슬레이브 복제 구조를 자동화하는 방법을 알아보자.1. 데이터베이스 disk 전략: 왜 Local PV인가?데이터베이스는 I/O 성능이 매우 중요하다. NFS나 클라우드 기반 네트워크 스토리지(EBS 등)는 관리가 편하지만, 네트워크 지연이 발생할 수밖에 없다. DBMS가 실행되는 노드의 로컬 디스크를 직접 사용하면 네트워크 오버헤드 없이 최고의 속도를 낼 수 있고, 별도의 스토리지 비용을 아낄 수 있다.이를 위해 우리는 Local Persistent Volume을 사용한다. 2. Storage Class 설정: 지능적인 바..
Spring Data JPA를 사용하다가 R2DBC로 넘어오면 가장 먼저 마주치는 당황스러운 지점이 있다.바로 Page를 반환하는 메서드를 만들 수 없다는 것이다. 왜 R2DBC는 그 편리한 페이지네이션을 공식적으로 지원하지 않을까? 1. 근본적인 원인: DB는 'Page'라는 개념이 없다.우리가 SQL에서 사용하는 LIMIT과 OFFSET은 데이터를 끊어서 가져오는 도구일 뿐, DB 엔진 자체가 "전체 10페이지 중 1페이지" 라는 객체를 만들어 주지는 않는다.(만약 이러한 객체가 있었다면 충분히 리액티브 스타일이 가능했다) Page 객체를 만들기 위해서는 반드시 두 가지 정보가 필요하다.조회 데이터: LIMIT, OFFSET으로 잘라낸 데이터 뭉치전체 카운트: SELECT COUNT(*)로 계산한 전..
REPEATABLE READ는 어떻게 구현되는가?부제: MySQL InnoDB의 MVCC와 Undo Log 해부 트랜잭션 격리 수준은 데이터베이스의 동시성 처리 성능과 데이터 무결성 사이의 트레이드오프를 결정하는 핵심 설정이다. 우리가 흔히 사용하는 RDBMS는 기본적으로 Read Committed 혹은 Repeatable Read 수준에서 동작한다.격리 수준을 높이기 위해서는 더 강력한 Lock이 필요하지만 모든 명령어를 직렬화 하는데에는 무리가 있다. 대표적으로 MySQL의 대표적인 엔진 InnoDB를 살펴보면, SELECT 쿼리를 날릴 때 Lock을 전혀 사용하지 않는다.하지만 락을 걸지 않는데 어떻게 다른 트랜잭션이 커밋한 데이터를 무시하고, 내 트랜잭션 시작 시점의 데이터를 계속 보여줄 수 있을..
Linux는 어떤식으로 Page Cache를 활용하는가?Page Cache는 파일 기반 I/O를 통해 디스크에서 읽어온 거의 모든 파일 데이터를 캐싱한다.단순히 사용자가 열어본것을 포함해서, 커널을 통해 파일이 오픈 된 경우도 Page Cache에 포함된다. 쉽게 말해서 MySQL 에서 select * from user where user_id = 1; 을 실행한 경우MySQL은 내부 파일을 오픈해서 값을 찾고 이 과정에서 Linux 에서 Page Cache가 추가된다. 동작을 보면 훨신 쉽다.1. 캐시가 없는 경우MySQL -> read() 시스템 콜 -> Linux Kernel(디스크 읽기) -> Page Cache 적재 -> MySQL 2. 캐시가 있는 경우MySQL -> read() 시스템 콜 -..