전체 글 2646

[17장] 샤딩 관리

1. 현재 상태 확인데이터 위치, 샤드 구성 및 클러스터 실행 작업을 조회할 수 있는 몇 가지 보조자가 있음 1.1 sh.status()를 사용해 요약 정보 얻기sh.status()는 샤드, 데이터베이스, 샤딩된 컬렉션의 개요를 제공청크의 개수가 적을 경우 어느 청크가 어디에 위치하는지도 출력청크의 개수가 많을 경우 단순히 컬렉션의 샤드 키와 각 샤드가 갖는 청크 개수를 보고 1.2 구성 정보 확인하기클러스터에 대한 모든 구성 정보는 구성 서버의 config 데이터베이스 내 컬렉션에 보관되며 셸 보조자를 사용하면 구성 정보를 더 읽기 쉽게 볼 수 있음클러스터에 대한 메타데이터를 조회하려면 언제든지 config 데이터베이스를 직접 쿼리 할 수 있음일반적으로 config 데이터베이스에 들어 있는 데이터는..

[16장] 샤드 키 선정

1. 용도 평가컬렉션을 샤딩할 때는 데이터 분할에 사용할 한두 개의 필드를 선택하며 해당 키를 샤드 키라고 지칭컬렉션을 샤딩하고 나서는 샤드 키를 변경할 수 없으므로 올바르게 선택하는 것이 중요함 좋은 샤드 키를 선정하려면 샤드 키가 애플리케이션의 요청을 분산하는 방법과 작업량 이해가 필요함샤드가 세 개인 클러스터는 샤드가 천 개인 클러스터보다 훨씬 유연함; 클러스터가 점점 더 커질 때, 쿼리가 모든 샤드를 방문해야 하는 쿼리를 피하기 위해서는 거의 모든 쿼리가 샤드 키를 포함해야 함쓰기 응답 대기 시간을 줄이는 일은 일반적으로 요청을 지리적으로 더 가까운 곳이나 더 좋은 장비로 보내는 작업과 관련 있음처리량을 늘리는 일은, 더 많은 병렬 처리 기능을 추가하고 클러스터에 요청을 균일하게 분산하는 작업과 ..

[15장] 샤딩 구성

1. 언제 샤딩해야 하나너무 일찍 샤딩할 경우 배포 운영이 더 복잡해지며 나중에 변경이 어려운 구조에 대한 결정을 내려야 한다는 단점 존재반면 너무 늦게 샤딩할 경우 과부하된 시스템을 중단 없이 샤딩하기 어렵다는 단점 존재일반적으로 샤딩은 다음과 같은 경우에 사용됨사용 가능한 메모리를 늘릴 때사용 가능한 디스크 공간을 늘릴 때서버의 부하를 줄일 때한 개의 mongod가 다룰 수 있는 처리량보다 더 많이 데이터를 읽거나 쓸 때 따라서 샤딩이 필요한 시점을 결정하는 데 모니터링이 중요하며, 각 지표를 주의 깊게 측정해야 함일반적으로 한 가지 병목 항목에 빠르게 맞닥뜨리게 되므로 어떤 항목을 프로비저닝할지 찾고, 복제 셋 전환 방법과 시기를 미리 계획하는 것을 권장 2. 서버 시작클러스터를 생성하려면 먼저 필..

[14장] 샤딩 소개

1. 샤딩이란샤딩은 여러 장비에 걸쳐 데이터를 분할하는 과정을 일컬으며, 때때로 파티셔닝이라는 용어로도 불림각 장비에 데이터의 서브셋을 넣음으로써, 수직 확장 없이도 더 많은 수의 덜 강력한 장비 (수평 확장)로 더 많은 데이터를 저장하고 보다 많은 부하를 처리할 수 있음더 자주 접근하는 데이터를 성능이 더 좋은 하드웨어에 배치하거나, 지역에 따라 데이터셋을 분할해 주로 접근하는 애플리케이션 서버와 가까운 컬렉션에서 도큐먼트의 서브셋을 조회할 수 있음 수동 샤딩은 어떤 데이터베이스 소프트웨어를 사용하든 대부분 수행 가능수동 샤딩을 사용하면 애플리케이션이 여러 데이터베이스 서버와 연결을 유지하며, 각 서버는 완전히 독립적애플리케이션은 각기 다른 데이터를 다른 서버에 저장하고, 데이터를 조회하기 위해 적절한..

[RDBMS] 트랜잭션

1. 트랜잭션 개요트랜잭션은 데이터베이스에서 원자적 (Atomic)이고, 일관적 (Consistent)이며, 격리 (Isolated)되고, 영속적 (Durable)인 작업 단위실무에서는 동시 사용자 요청, 서버 장애, 네트워크 오류 등 다양한 이슈가 존재하기 때문에 트랜잭션의 안정적 관리가 필수적트랜잭션을 적용하지 않았을 경우 흔히 발생하는 문제로는, 동시에 여러 인출 요청이 들어와 체크-후-실행 (check-then-act) 로직이 깨져서 음수 잔고나 데이터 불일치가 생기는 케이스i.g. 금융, 암호화폐 등 돈이 오가는 시스템에서는 동시성 제어나 트랜잭션 오류가 심각한 보안사고, 해킹, 자산 손실로 이어질 수 있음을 FlexCoin 해킹 사례 2. ACID Atomicity (원자성)트랜잭션은 전부 실..

DB 2025.05.14

[RDBMS] 페이징 (Pagination)

1. SQL Standard의 페이징SQL 2008 표준에서는 대용량 데이터의 일부만 선별적으로 조회할 수 있도록 페이징을 위한 구문을 도입FETCH FIRST N ROWS ONLY: 정렬된 결과 집합에서 상위 N개 행만 조회OFFSET M ROWS FETCH NEXT N ROWS ONLY: 결과 집합에서 M개 행을 건너뛴 뒤, 그다음 N개 행 조회 부연 설명해당 쿼리는 post 테이블에서 created_on과 id를 내림차순으로 정렬한 뒤, 상위 5개의 title만 선택하여 조회정렬 기준이 없다면, 반환되는 데이터의 순서는 DB 내부 처리 로직에 따라 비결정적이기 때문에, 정확한 페이징 결과를 얻을 수 없으므로 항상 원하는 순서대로 결과를 얻으려면 ORDER BY를 반드시 사용해야 함 부연 설명..

DB 2025.05.12

[RDBMS] 파생 테이블과 공통 테이블 표현식

개요관계형 데이터베이스에서 복잡한 쿼리를 작성할 때, 임시적으로 쿼리 결과를 재사용하거나 여러 단계로 나누어 데이터를 처리하는 방법은 다음과 같음 파생 테이블(Derived Table)공통 테이블 표현식(CTE, Common Table Expression 1. 파생 테이블 (Derived Table)파생 테이블이란, FROM절에 직접 쿼리(SELECT문)를 작성하여 만들어지는 임시 테이블을 의미해당 테이블은 쿼리 실행 시점에만 존재하며, 별칭을 반드시 부여해야 함파생 테이블의 특징은 다음과 같음 쿼리 내부에서만 사용되는 일회성 임시 테이블FROM절에서만 정의할 수 있고, 쿼리의 나머지 부분에서만 접근 가능복잡한 쿼리를 쪼개서 읽기 쉽게 만들거나, 집계 결과를 다시 활용할 때 주로 사용중첩 사용(파생 테이..

DB 2025.05.12

[RDBMS] JOIN 성능

1. JOIN vs 서브 쿼리JOIN은 두 개 이상의 테이블을 논리적으로 연결해서, 관련된 데이터를 한 번에 조회할 수 있도록 해주는 SQL의 대표적인 기능i.g. 회원 테이블과 주문 테이블이 따로 있을 때, 회원의 이름과 해당 회원이 주문한 상품 목록을 함께 보고 싶다면 JOIN을 사용JOIN은 여러 테이블의 레코드를 조합하여 복합적인 데이터(복합 프로젝션)를 만드는 데 매우 효율적여러 테이블의 데이터를 결합해야 할 때, 복합적인 결과 셋이 필요할 때, 그리고 결과에서 여러 테이블의 컬럼이 동시에 필요할 때 권장JOIN은 복합적인 데이터 결합에 효율적이지만, 불필요하게 사용할 경우 성능 저하나 복잡도 증가로 이어질 수 있음 서브 쿼리는 쿼리 안에 또 다른 쿼리가 들어 있는 구조서브 쿼리는 주로 데이..

DB 2025.05.12

LATERAL JOIN 개요

LATERAL JOIN이란?SQL 하위 쿼리가 메인 쿼리의 각 행에 접근할 수 있도록 해주는 조인 방식표준 SQL 및 PostgreSQL, MySQL 8.0 이상, Oracle 등에서 지원되는 기능LATERAL 키워드를 사용하면 서브 쿼리 안에서 외부 쿼리의 칼럼을 자유롭게 참조 가능전통적인 JOIN에서는 서브쿼리 내에서 외부 쿼리의 컬럼을 직접 참조할 수 없지만, LATERAL JOIN은 이를 가능케 하여 더욱 유연한 데이터 변환 및 분석이 가능해짐 LATERAL JOIN PostgreSQL 예시 #1각 부서별로 직원들의 정보와, 그 직원이 속한 부서에서 최근 등록된 공지사항 2개를 최신순으로 함께 보여주고 싶다고 가정이런 요구사항은 전통적인 JOIN이나 서브쿼리만으로는 복잡하거나 효율이 떨어질 수 있..

DB 2025.04.30

[13장] 복제 셋 관리

1. 독립 실행형 모드에서 멤버 시작많은 유지 보수 작업은 쓰기와 관련되어 있어 Secondary에서 수행될 수 없으며, 애플리케이션 성능에 영향을 미치기 때문에 Primary에서 수행하면 안 됨따라서 해당 절에서는 독립 실행형 모드 서버 시작을 자주 언급함이는 멤버가 복제 셋의 멤버가 아닌 독립 실행형 서버로 재시작함을 의미 독립 실행형 모드에서 멤버를 시작하려면 먼저 명령행 인수를 확인해야 하며 인수는 다음과 같다고 가정해당 서버에서 유지보수를 수행하려면 replSet 옵션 없이 서버를 재시작하면 되며 이는 일반적인 독립 실행형 mongod처럼 읽기와 쓰기가 가능하게 해 줌복제 셋에 있는 다른 서버에서 해당 서버와 통신하기를 원치 않으므로 다른 멤버들이 서버를 발견하지 못하도록 서버가 다른 포트로 수..