샤딩이란데이터를 여러 서버에 분산 저장하는 기술이다.서버를 여러개 두어 scale-out하는 기법으로 단일 DB의 서버의 용량과 성능의 한계를 극복할 수 있는 기법이다. 샤딩의 장점성능 향상여러 DB 인스턴스에 데이터를 나누고 각 데이터가 존재하는 DB에서 연산을 수행하므로부하와 데이터가 분산되어 쿼리 성능 향상을 이룰 수 있다.장애 격리샤드 단위 백업 및 복구샤딩의 단점일괄성 유지 어려움- 분산 트랜잭션 처리 및 데이터 동기화에 대한 관리 필요- auto_increment 충돌 (충돌 방지 미들웨어 사용해야함, sharding-sphere)복잡성 증가조인 연산이나 복잡한 쿼리는 샤딩 이전 환경의 쿼리보다 느리고 에러 발생 빈도가 높아질 수 있다.샤드 불균형 발생 가능샤딩은 스케일업으로 DB 스펙이 한계..
파티셔닝(Partitioning)파티셔닝은 논리적인 하나의 테이블을 여러개의 물리적인 파티션으로 나누어 저장/관리하는 기법이다.이때, 파티션을 나누는 기준을 파티션 키 칼럼이라고 한다.mysql 파티션은 파티션 단위로 테이블과 인덱스가 모두 분리되기에 파티션 키 설정이 매우 중요하다.자주 사용되는 키가 아니라면 인덱스 조회시 모든 파티션 탐색을 수행할 수 있기에파티션 키는 가급적 자주 사용되는 조건이어야한다. 파티션이 필요한 이유하나의 테이블에 너무 많은 레코드가 쌓이는 경우,스캔 범위가 넓어지는 것 뿐만 아니라 레코드나 인덱스를 메모리에 올리지 못하여 디스크 접근을 유발하여 더더욱 성능 저하를 유발할 수 있다.이때, 하나의 테이블을 물리적으로 여러 파티션으로 나누게 되면 파티션 단위 접근과 파티션 단위..
RDB의 부하를 줄이는 방법단일 DB 내에서 최적화쿼리 최적화인덱스 추가CQRS파티션스케일업분산 DB를 통한 부하 분산복제캐싱 DB 별도 사용(redis)DB MSA샤딩서비스가 지속되고 사용자와 트래픽이 증가하게 되면 DB의 부하가 증가할 수 있다.이때 가장 고려해볼만한 옵션은 쿼리 최적화나 인덱스 추가, CQRS 패턴 같은 것들이 있다.이는 단일 DB 내에서 CPU, 메모리, IO 자원을 효율적으로 사용하기 위해 고려하는 옵션이다. 단일 DB는 컴퓨터의 용량과 스펙이라는 한계가 존재하기 때문에,쿼리 최적화, 인덱스, CQRS 패턴으로는 한계에 직면할 수 있다. 이때, 고려해볼 수 있는 옵션이 레플리케이션(복제)이다.복제는 RDB에서 제공해주는 옵션으로 쉽게 적용 가능하고 데이터의 신뢰성 측면에서도 안정..
트랜잭션의 격리 수준이란 여러 트랜잭션이 동시에 처리 될 때, 다른 트랜잭션에 의해 영향을 받는 정도이다.트랜잭션 격리 수준은 아래와 같이 4단계로 이루어져있다.READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE각 단계에서 발생할 수 있는 상황과 격리수준 및 동시 처리 성능은 아래와 같다. DIRTY READNON-REPEATABLE READPHANTOM READ격리 수준동시 처리 성능READ UNCOMMITTEDOOO낮음높음READ COMMITTEDXOO REPEATABLE READXXX SERIALIZABLEXXX높음낮음일반적으로 격리 수준이 높아질수록 동시 처리 성능이 크게 떨어진다고 하지만, mysql에서 serializable을 제외한 나머..

낙관적 락과 비관적 락낙관적 락충돌이 드물게 발생한다고 가정데이터 변경 시점에 다른 사용자에 의해 값이 변경됬는지 체크낙관적 락은 데이터를 변경하는 시점에 다른 사용자에 의해 값이 변경됬는지 체크하는 방식으로update나 delete 쿼리 수행시 버전 정보나 타임 스탬프를 통해 다른 사용자에 의한 변경을 체크할 수 있다.애플리케이션 수준에서 동시성 제어를 해보았다면 update나 delete 쿼리 수행시 where 문에 조건절을 걸어 반영된 레코드가 존재하는지 여부로 판단하는 구현이 대표적인 낙관적 락의 예시이다. 비관적 락총돌이 발생한다고 가정레코드 자체에 락을 걸며, 쓰기 작업에 잠금을 하는 공유 락과 읽기/쓰기 모두 못하게 하는 배타 락이 존재한다.비관적 락은 레코드 자체에 잠금을 걸고 변경 작업을..
버퍼풀 자료구조버퍼풀은 여러개의 데이터 페이지로 이루어져 있다.버퍼풀은 메모리 공간에 존재하기에 무한정 많은 데이터를 담고 있을 수 없다.사용하지 않는 데이터는 제거되야한다.버퍼풀에서 사용되는 자료구조를 살펴보자. LRU(Least Recently Used) 리스트 : 가장 오래동안 사용되지 않은 데이터 페이지 제거New 서브리스트- MRU(Most Recently Used) 알고리즘을 통해 가장 많이 읽힌 데이터들이 존재하는 공간- 버퍼풀의 데이터를 읽어들이면 해당 데이터는 리스트의 머리부분으로 이동한다.Old 서브리스트 - LRU 알고리즘이 사용되는 공간으로 오랫동안 읽히지 않는 데이터 관리- 오랫동안 사용되지 않은 데이터는 나이가 증가하고 꼬리 부분으로 이동된다.데이터를 디스크에서 처음 버퍼풀로 가..

* 이글은 RealMysql 책을 참고하여 작성한 내용입니다.db 성능은 디스크 접근횟수에 달려있다. 일반적으로 메모리는 디스크보다 1000~1만 배 빠르다.최대한 메모리에서 많은 작업을 하고 디스크 접근을 최소화해야한다. mysql db를 공부하며 위의 전제조건이 중요하다.mysql 아키텍쳐 설계는 쓰기 작업의 안정성도 보장하지만 무엇보다 읽기 성능 향상을 위해 설계되어있다.위 내용을 중점에 두고 글을 이해해보자. mysql 아키텍쳐 [mysql 엔진]커넥션 핸들러 - 클라이언트 접속 허용- 쿼리 실행 요청sql 파서- 쿼리를 토큰(mysql이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조를 만들어 내는 작업- 기본 sql 문법 오류 검사sql 전처리기- 쿼리 파서에 의해 만..

B-tree (Balaced tree) Mysql DB는 인덱스 및 실제 데이터를 B-tree 알고리즘을 통해 관리한다. 각 노드는 하나의 페이지 형태로 여러 레코드 정보를 갖고 있다.페이지의 크기가 정해져 있기에 인덱스 키 값의 크기에 따라 저장할 수 있는 레코드 수가 달라진다.클러스터드 인덱스는 데이터 파일의 물리적 저장 방식을 결정하기에 리프 노드에 모든 칼럼 정보가 저장되며,세컨더리 인덱스의 경우 데이터의 주소로 클러스터드 인덱스 키값을 사용한다.따라서 세컨더리 인덱스로 조회하는 경우 클러스터드 인덱스를 한번 더 거쳐 조회되는 특징이 있다.세컨더리 인덱스 리프 노드에 데이터 주소가 아닌 pk 값을 할당하는 이유?데이터 주소를 사용하게 되면 데이터 변경, 이관, 분리와 같은 상황에서 이를 사용하는..