본문 바로가기

database

(7)
[DB] 샤딩(Sharding)이란? 샤딩 샤딩은 분산 시스템에서 데이터를 수평적으로 분할하는 기술이다. 수평적 파티셔닝(horizontal partitioning)의 일종으로 볼 수도 있지만, 분산 시스템에서 서로 다른 시스템 자원을 이용하여 데이터베이스의 부하를 분산시키고 성능을 최적화하는 데 초점이 있다. 아래 그림처럼 단일 서버에서 데이터를 read & write 하는 것이 아니라, 여러 대의 서버로 나누어 저장하고 조회도 각각의 데이터베이스에서 처리함으로써 부하를 분산시킬 수 있다. 언제 필요할까? 파티셔닝과 비교해보자. 10개의 파티션을 만들어 주로 적은 수의 파티션에서 read & write 작업이 일어난다면 파티셔닝이 성능 향상에 도움이 될 수도 있다. 하지만 10개의 각 파티션을 균일하게 사용하게 된다면 오히려 오버헤드가 ..
[DB] 데이터베이스와 색인(hash, LSM tree) 데이터베이스와 색인 데이터베이스의 기본은 특정 데이터를 write & read 하는 데 있다. 값을 특정 저장소에 넣어두고 필요할 때 꺼내쓰는 것이다. 일반적으로 하나의 파일 끝에 write만 하는 작업은 매우 효율적이기 때문에 많은 데이터베이스가 내부적으로 추가 전용(append-only) 데이터 파일인 로그(log)를 사용한다. 하지만 원하는 데이터 값을 읽어오려면 전체 파일을 스캔해서 찾아와 읽어야 한다. 검색 비용이 O(n)이다. read를 효율적으로 수행하기 위해서 색인(index)라는 데이터 구조가 필요하다. 하지만 별도의 index를 관리해야 하기 때문에 특히 write 할 때 오버헤드가 발생한다. 이러한 작업은 단순히 파일 끝에 write 하는 것보다 쓰기 속도를 느리게 한다. 데이터를 ..
[DB] 트랜잭션(3) - 격리 수준과 동시성 문제, 그 해결 [DB] 트랜잭션(1) - ACID와 격리 수준(isolation level) [DB] 트랜잭션(2) - repeatable read 격리 수준에서의 phantom read 현상 [DB] 트랜잭션(3) - 격리 수준과 동시성 문제, 그 해결 이전 글에서 트랜잭션과 격리성을 살펴보았다. 트랜잭션은 작업의 완전성을 보장하기 위한 개념이다. 격리성은 각 트랜잭션이 다른 트랜잭션에 영향을 받지 않게 하려는(즉, 동시성 문제를 해결하려는) 개념이다. 가장 엄격한 격리성은 직렬로 모든 트랜잭션을 처리하는 것이다. 그런데 가장 엄격한 격리성은 동시성 문제를 해결하기 보다는 동시성 문제를 아예 회피하는 전략이다. 이는 동시성의 단점을 배제하고자 그 장점을 모두 버린 해결책이다. 이는 성능 문제를 야기했다. 격리 수..
[DB] 트랜잭션(2) - repeatable read 격리 수준에서의 phantom read 현상 [DB] 트랜잭션(1) - ACID와 격리 수준(isolation level) [DB] 트랜잭션(2) - repeatable read 격리 수준에서의 phantom read 현상 [DB] 트랜잭션(3) - 격리 수준과 동시성 문제, 그 해결 이전 글에서 repeatable read는 팬텀 리드 현상이 발생한다고 하였다. 조금 더 자세히 살펴보자. Phantom Read 현상 위 예제에서 B 트랜잭션이 emp_no >= 500000 을 select for update를 통해 명시적인 read/write lock을 걸었다. 하지만 A트랜잭션에서 emp_no이 500001인 데이터(B 트랜잭션 입장에서는 현재 존재하지 않는 데이터)를 insert 하고 있다. A 트랜잭션이 락을 거는 시점에 존재하지 않는 ..
[DB] 트랜잭션(1) - ACID와 격리 수준(isolation level) [DB] 트랜잭션(1) - ACID와 격리 수준(isolation level) [DB] 트랜잭션(2) - repeatable read 격리 수준에서의 phantom read 현상 [DB] 트랜잭션(3) - 격리 수준과 동시성 문제, 그 해결 트랜잭션과 격리 수준에 대해서는 여러 책과 블로그 등에서 상세히 다루고 있으므로 개념을 살펴보진 않으려 한다. 간단하게만 짚고 넘어가면 다음과 같다. 트랜잭션 - 작업의 완전성을 보장해준다. 즉, 논리적인 작업 셋이 모두 성공(commit)하거나 실패(abort, rollback)하도록 보장한다. - '데이터 중심 애플리케이션 설계' 책에서는 트랜잭션이 제공하는 안전성 보장을 흔히 ACID로 알려져 있다고 말하지만, 그 개념은 데이터베이스에 따라 제각각이고 개념 ..
HikariCP - max lifetime과 DB wait_timeout의 관계 이전 글에서 maximum pool size와 db max connections size의 관계를 살펴보면서, HikariCP의 maximum pool size를 어떻게 조정해야 좋은지 살펴보았다. pool size를 조정하는 것은 db와 connection을 맺은 connection을 얼마나 관리할 것인가에 관심이 있다면, 이제 살펴볼 max lifetime은 pool에서 관리할 connection의 생명주기를 어떻게 가져갈 것인가 하는 문제에 관심이 있다. max lifetime은 어떻게 설정해야 할까? 다음 블로그 글에서 max lifetime 설정에 대해서 자세히 설명하고 있다. 결론부터 말하자면 max lifetime의 값을 db wait_timeout 보다 최소 2~5초는 짧게 설정하는 것이 ..
HikariCP - maximum pool size와 DB max_connections의 관계 Maximum pool size는 어떻게 조정해야할까? HikariCP maximum pool size 설정 시 어떤 것을 고려해야 하나 찾아보던 차에 잘 정리된 블로그 글을 발견했다. connection pooling을 해주는 HikariCP가 사용자의 요청(thread)에 대해 어떻게 connection을 관리하는지 알 수 있었고, 할당된 thread 수에 따라 maximum pool size를 어떻게 조정하면 좋은지도 알 수 있었다. 위 글에서 설명된 maximum pool size 설정값은 HikariCP 공식 github의 wiki에 잘 정리되어 있다. 대강 정리하면 다음과 같다. - connection pool 사이즈를 CPU 코어에 맞게 조정하면 성능 향상을 볼 수 있다. (다른 변경 사항 ..