[Database] DBA급 개발자로 - #21 Distributed Database 1/3
2022. 12. 9. 22:38
Database/DBA급 개발자로
이전 포스팅에서 로깅을 활용해서 시스템 장애 시 데이터베이스를 어떻게 복구하는지 살펴봤습니다. 이번 포스팅에서는 분산 데이터베이스에 대해 살펴보겠습니다. Distributed Database 데이터베이스 노드가 네트워크로 연결돼서 데이터베이스 기능을 제공하는 형태를 분산 데이터베이스라고 합니다. 노드 간 통신이 네트워크를 통해 이뤄지므로 통신 비용을 고려해야 합니다. System Architecture 분산 데이터베이스는 다음과 같이 구성할 수 있습니다. 하나씩 살펴보겠습니다. Shared Memory 데이터베이스 노드가 네트워크를 통해 하나의 메모리를 공유하는 형태입니다. 데이터베이스 노드는 하나의 메모리에 적재된 데이터를 공유합니다. Shared Disk 네트워크를 통해 디스크를 공유하는 형태입니다...
[Database] DBA급 개발자로 - #20 Database Recovery
2022. 12. 5. 15:14
Database/DBA급 개발자로
이전 포스팅에서는 DBMS의 정책(steal, force policy)에 따라 데이터를 디스크에 어느 시점에 저장하는지와 WAL에 대해 간단히 살펴봤습니다. 이번 포스팅에서는 로그를 활용해서, 특히 WAL(Write Ahead Log)를 활용해서 어떻게 복구를 수행하는지 살펴보겠습니다. WAL(Write Ahead Log) WAL 기록 방법 우선 WAL을 활용한 데이터베이스에서는 변경사항이 어떻게 기입되는지 살펴보겠습니다. WAL에는 다음과 같은 로그를 추가합니다. 새로운 트랜잭션이 시작되면 WAL에 로그를 기입합니다. 트랜잭션이 종료되면 로그를 기입합니다. WAL에 기입된 각각의 로그는 transaction Id, Object Id, 이전 값과 변경 이후의 값을 포함합니다. A의 값이 1이고 B의 값이..
[Database] DBA급 개발자로 - #19 Database Logging
2022. 12. 4. 10:49
Database/DBA급 개발자로
이전 3개의 포스팅을 통해 DBMS가 어떻게 트랜잭션 동시성을 제어하는지 살펴봤습니다. 이번 포스팅에서는 database logging에 대해 살펴보겠습니다. Database Logging 데이터베이스는 다음과 같은 특성을 보장해야 합니다. 트랜잭션이 abort 된 경우 데이터가 부분적으로 영구 저장소에 저장되면 안 됩니다. 트랜잭션이 commit 된 경우 데이터는 영구 저장소에 영구 저장돼야 합니다. DBMS는 위와 같은 특성을 보장하기 위해 undo와 redo 기능을 제공합니다. Undo: 성공적으로 commit 되지 않거나 abort 된 트랜잭션에 의한 변경사항을 되돌립니다. Redo: Commit된 트랜잭션에 의한 변경사항을 영구저장소에 다시 반영할 수 있습니다. DBMS의 이런 기능이 어떻게 구..
[Database] Storage Engine의 꽃 InnoDB
2022. 11. 21. 11:42
Database/Database 필수
InnoDB는 MySQL의 기본 storage engine입니다. 우리가 사용하는 데이터베이스의 기능(transaction, isolation level 등)은 InnoDB에서 제공하고 있는 만큼 InnoDB를 이해하면 데이터베이스의 기능을 더 효율적으로 활용할 수 있습니다. 이번 포스팅을 통해 InnoDB가 어떤 기능을 어떻게 제공하는지 살펴보겠습니다. 이번 포스팅은 MySQL 경험이 있고 MySQL 기능을 어느 정도 이해한 분들이 대상입니다. InnoDB 란? InnoDB는 MySQL과 MariaDB에서 사용하는 storage engine입니다. InnoDB는 트랜잭션 기능, row-level locking, clustered index를 활용한 효율적인 데이터 저장과 검색 그리고 데이터 정합성을 위..
[Database] DBA급 개발자로 - #18 Mutli-Version Concurrency Control
2022. 11. 14. 08:45
Database/DBA급 개발자로
이전 포스팅에서 timestamp ordering을 활용하여 트랜잭션 동시성을 어떻게 제어하는지 살펴봤습니다. 이번 포스팅에서는 multi version의 데이터를 활용해서 트랜잭션 동시성을 제어하는 MVCC에 대해서 살펴보겠습니다. MVCC MVCC(Multi-Version Concurrency Control)는 여러 버전의 데이터를 저장합니다. 트랜잭션은 해당 트랜잭션이 시작한 시점을 기준으로 가장 최근 버전의 데이터를 읽습니다. MVCC를 활용하면 데이터가 특정 시점에 어떻게 변경됐는지 확인할 수 있기 때문에 다양한 isolation level을 보장할 수 있습니다. 또한 특정 시점에 필요가 없는 버전은(더 이상 트랜잭션에 의해 참조되지 않는 데이터) 제거됩니다. MVCC의 장점은 읽기 작업이 쓰기..
[Database] DBA급 개발자로 - #17 Timestamp Ordering Concurrency Control
2022. 11. 13. 11:25
Database/DBA급 개발자로
이전 포스팅에서는 2 phase locking을 통해 어떻게 concurrent transaction을 처리하는지 살펴봤습니다. 이번 포스팅에서는 timestamp를 통해 concurrent transaction을 처리하는 방법을 살펴보겠습니다. Timestamp Ordering Timestamp ordering 방식도 2 phase locking처럼 concurrent transaction을 처리하기 위한 프로토콜입니다. 주된 차이점은 2 phase locking의 경우 트랜잭션이 실행되는 과정에서 충돌이 발생하면 해당 트랜잭션을 롤백하지만 timestamp ordering의 경우 트랜잭션이 실행되기 전에 충돌 여부를 미리 확인합니다. 두 트랜잭션 Ti, Tj이 동시에 진행되고 트랜잭션이 시작된 시간이..
[Database] DBA급 개발자로 - #16 Two-Phase Locking
2022. 11. 6. 10:43
Database/DBA급 개발자로
이번 포스팅에서는 트랜잭션 동시성을 제어할 수 있는 방법인 two phase locking에 대해 살펴보겠습니다. 2PL(Two phase locking)은 데이터베이스의 serializable isolation level을 구현하는데 자주 사용됐던 방식입니다. 2PC(2 Phase Commit)과 2PL 용어가 비슷해서 헷갈릴 수 있는데요, 2PC은 하나의 트랜잭션으로 처리돼야 할 작업이 여러 DBMS 서버를 거쳐야 하는 경우 트랜잭션의 원자성 보장하기 위해 활용하는 프로토콜입니다. 2PL(2 Phase Locking) 2PL는 다수의 트랜잭션이 동시에 실행될 때 conflict serializability를 보장하는 동시성 제어 방법입니다. 2PL의 장점은 conflict serializability..
[Database] DBA급 개발자로 - #15 Concurrency Control
2022. 11. 1. 17:55
Database/DBA급 개발자로
이전 포스팅에 쿼리 처리 비용을 계산해서 최적의 쿼리를 선택하는 방법에 대해 살펴봤습니다. 그리고 DBMS에서 동시에 실행되는 트랜잭션을 어떻게 처리하는지 살펴보겠습니다. Transaction Concurrency Control 트랜잭션의 동시성 처리가 왜 중요할까요? 동시에 실행된 다수의 트랜잭션이 하나의 데이터를 수정할 때 어떻게 데이터의 일관성을 유지할 수 있을까요? 가장 단순한 방법은 한 시점에 하나의 트랜잭션만 데이터에 접근할 수 있도록 하는 방법입니다(예를 들면 데이터에 접근하는 트랜잭션을 순차적으로 실행하는 방식입니다). 하지만 트랜잭션을 순차적으로 실행하면 처리 속도가 줄고 DBMS의 응답 시간이 길어질 수 있습니다. 이를 해결하기 위해서는 데이터의 일관성을 유지하면서도 트랜잭션을 동시에 ..