대용량시스템에 대한 이해(3) - 데이터베이스 성능 핵심

남순식·2023년 10월 6일
0

대용량 시스템

목록 보기
4/7

01. 데이터베이스 성능 핵심

1-1. 컴퓨터 구조

다음 장표는 가장 기본이 되는 컴퓨터 구조의 장표이다

CPU가 데이터를 가져오거나, 저장하기 위해서는 I/O 입출력 버스를 통하게 된다.

1-1-1. 데이터를 저장하기 위한 용도로 사용하는 장치


1. 디스크
2. 메모리

1-1-2. 디스크 / 메모리 비교

디스크는 전원이 공급되지 않아도 영속성이 보존된다는 중요한 특징이 있다.
따라서 모든 데이터는 결국 디스크에 저장되어야 하지만 디스크메모리에 비해 훨씬 느리다.

1-1-3. 핵심

Note :
데이터베이스 성능의 핵심
디스크 I/O(접근)을 최소화 하는 것

  • 메모리에 올라온 데이터로 최대한 요청을 처리하는 것.
    메모리 캐시 히트율을 높힌다.
  • 데이터 쓰기도 곧 바로 디스크에 쓰지 않고 메모리에 쓴다.
    • 메모리 데이터 유실을 고려해 WAL(Write Ahead Log)를 사용

02. WAL *참고

2-1. 랜덤 I/O, 순차 I/O

  • 랜덤I/O : 무작위로 데이터를 읽어옴
  • 순차I/O : 연속된 블럭의 데이터를 읽어옴

문제
대부분의 트랜잭션은 무작위하게 write 발생하게 된다.
이것을 곧 바로 디스크에 접근하면 많은 랜덤 I/O가 발생하게 된다.
따라서 업데이트나 삽입 연산이 발생할 때마다 데이터베이스를 직접 이용하는 것은 비효율적이니 쓰기 연산도 모두 메모리에 저장했다가 한번에 디스크로 보내는 방법을 이용한다.

2-2. WAL 이란

Note :
WAL은 Write-ahead logging 의 약자이다.
트랜잭션이 일어나기 전에 로그를 미리 기록하여 트랜잭션 undo, redo 를 할 수 있도록 한다.

2-2-1. 트랜잭션

트랜잭션이란, 하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합이다.

예시
A라는 사람이 B라는 사람에게 1000원을 송금하려고 한다.
1. A 계좌에 1000원이 있는지 확인한다.
2. A 계좌에서 1000원을 뺀다.
3. B 계좌에 1000원을 추가한다.
위 1,2,3을 하나의 트랜잭션이라고 할 수 있다.

트랜잭션은 ACID 성질이라고 하는 다음의 네 가지 성질로 설명된다.

ACID
1. Atomicity (원자성)

트랜잭션의 연산들은 모두 정상적으로 수행되거나 혹은 모두 수행되지 않아야 한다.
위에 예를 든 트랜잭션의 2번 작업을 진행한 후에 갑자기 멈춰버린다면, A 는 1000원을 잃고 B 는 1000원을 받지 못한다.
atomicity는 쉽게 'all or nothing' 특성으로 설명된다.

2. Consistency(일관성)

트랜잭션의 수행이 데이터베이스의 일관성을 보존해야 한다.
즉, 성공적으로 수행된 트랜잭션은 정당한 데이터들만을 데이터베이스에 반영해야 한다.

3. Isolation(독립성)

여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 한다.
트랜잭션의 중간 결과가 다른 트랜잭션에게는 숨겨져야 한다는 의미이다.
만약 isolation 성질이 보장되지 않으면 트랜잭션이 원래 상태로 되돌아갈 수 없기 때문이다.
Isolation 성질을 보장할 수 있는 가장 쉬운 방법은 모든 트랜잭션을 순차적으로 수행하는 것이다.

4. Durability(지속성)
트랜잭션이 성공적으로 완료되어 커밋되고 나면,
해당 트랜잭션에 의한 모든 변경은 (향후에 어떤 소프트웨어나 하드웨어 장애가 발생되더라도) 보존되어야 한다.

Note :
트랜잭션 실행 중에

  • 잘못된 입력
  • 일관성 제약 조건 위배
  • 사용자 요청
  • 타임 아웃
  • 교착 상태

    등 발생 가능한 여러가지 상황에 따라 트랜잭션이 철회될 수 있다.
    트랜잭션을 철회하기 위해 (로그를 이용하여) undo 복구를 사용한다.

2-2-2. undo, redo

undo 복구란
트랜잭션이 작업을 진행하기 전 데이터로 되돌리는 것을 말한다.
(실행중인 트랜잭션이 어떤 이유든 비정상적으로 종료되는 경우, 트랜잭션이 변경한 데이터들을 다시 원래대로 복구하는 작업)

  • 트랜잭션 작업이 중간에 종료되었는데, 중간까지의 결과물이 디스크에 쓰여졌을 때
    undo 복구를 하지 않는다면 중간 결과물이 최종 결과물처럼 오해될 수 있다.

위 ACID 의 Atomicity 원자성 부분 설명 예를 참고하자.
해당 예에서 중간에 트랜잭션이 종료되어 A 가 1000원을 잃어버리게 되는 상황이 왔을 때 (중간 결과물이 디스크에 쓰여진 상황) A 계좌에 다시 1000원을 증가시켜 원래대로 되돌리는 undo 복구를 진행한다.

redo 복구란
트랜잭션이 작업을 진행한 후 상태로 되돌리는 것을 말한다.
(이미 커밋한 트랜잭션의 수정을 재반영하는 복구 작업)

  • 트랜잭션 작업이 제대로 진행되었고 그 결과가 메모리에만 쓰여지고 디스크에는 쓰여지지 않았을 때 정전이 되어서 메모리가 날아가는 경우, 트랜잭션 작업 결과도 사라지게 된다.

이 경우, 트랜잭션 결과를 다시 복구하기 위해 (로그를 이용하여) redo 복구를 진행한다.

2-2-3. 로그

로그

  • 로그는 로그 레코드의 연속이며 데이터베이스의 모든 갱신 작업을 기록한다.
  • 로그는 안정적 저장 매체(stable storage)에 기록되어야 한다.
  • 로그는 덧붙이는(append) 방식으로 기록되며, 각 로그 레코드는 고유의 식별자를 갖는다.
    (로그 레코드의 식별자를 LSN(Log Sequence Number) 혹은 LSA(Log Sequence Address)라고 부른다.)
  • 로그는 항상 뒤에 덧붙이는 방식으로 쓰이기 때문에, 로그 식별자는 단조 증가하는 성질을 가진다.

로그는 다음과 같은 방법으로 저장된다.

  • 물리적인 상태 로깅(physical state logging)
    트랜잭션의 실행 이전 데이터와 이후 데이터를 모두 로그에 기록한다.
    undo 복구를 하면 실행 이전 데이터를 반영하고
    redo 복구를 하면 실행 이후 데이터를 반영한다.
    DBMS에서 가장 널리 쓰이는 기본적인 로깅 방법이다.

  • 물리적인 전이 로깅(physical transition logging)
    트랜잭션 이전과 이후 데이터의 XOR 차이점을 로그에 기록한다.
    로그에 기록된 XOR 차이점을 이용하여 UNDO 복구와 REDO 복구를 수행하게 된다.

  • 논리적인 전이 로깅(logical transition logging)
    트랜잭션이 어떤 일을 했었는가를 기록하는 방식이다.
    예를 들어, a = 0; a = a + 1과 같은 연산을 로깅할 때
    물리적인 상태 로깅의 경우 이전 값 0, 이후 값 1을 물리적으로 기록하지만
    논리적인 전이 로깅의 경우 오퍼레이션(a = 0; a = a + 1 이라는 연산 그 자체)을 기록한다.
    redo 복구를 하면 로그에 기록된 오퍼레이션을 재수행하고
    undo 복구를 하면 역오퍼레이션을 수행한다.
    오퍼레이션 로깅(operation logging)으로도 불린다.

해당 업데이트가 데이터베이스에 써지기 전에 먼저 관련된 UNDO 정보가 로그에 써져야 한다.
이 원칙을 WAL(Write Ahead Logging)이라고 부른다.
어떤 경우에도 UNDO 복구가 되기 위해서는 반드시 WAL 규칙이 준수되어야 한다.
트랜잭션이 정상적으로 종료 처리되기 위해서는 먼저 REDO 정보가 로그에 써져야 한다.
역시 어떤 경우에도 REDO 복구를 할 수 있기 위해서는 REDO 로그가 적어도 커밋 시점에는 써져야 한다.

Note :
로그는 복구를 위해 무조건적으로 안전한 저장소에 쓰여져야 한다.

2-3. 문제해결

  • 쓰기 연산도 모두 메모리에 저장했다가 한번에 디스크로 보내는 방법을 이용할 때 데이터 유실이 발생할 수 있는 문제

    • WAL기술을 활용
      순차적으로 로그를 남겨 설령 메모리에 있던 데이터가 디스크로 가지 못하고 유실 되더라도 서버가 다시 실행 됐을 때 순차적으로 쌓인 로그를 재실행하여 정합성을 유지한다.

결론
결국 데이터베이스 성능의 핵심은 디스크의 랜덤 I/O(접근)을 최소화 하는 것.

profile
응집력있는 시간을 보내기 위한 블로그

0개의 댓글