본문으로 건너뛰기

데이터베이스 이중화

정보처리기사 목차물리 데이터베이스 설계레슨 114 / 233

목차

데이터베이스 이중화는 같은 데이터를 두 대 이상의 서버에 두고, 한쪽에서 일어난 변경을 다른 쪽에 옮겨 같은 상태로 맞추는 것입니다. 변경을 언제 옮기는지와 어느 서버가 일을 받는지로 방식이 갈립니다.

분산 데이터베이스의 중복 투명성은 복제본이 몇 개인지 사용자가 몰라도 되게 해 줍니다. 그렇게 숨기려면 복제본끼리 값이 같아야 합니다. 주 서버에서 점수를 90으로 고쳤는데 복제 서버가 아직 60을 들고 있으면, 어느 쪽을 읽었는지에 따라 결과가 달라집니다. 그래서 이중화는 '변경을 언제 보내나'를 먼저 정합니다. 빨리 끝내려 하면 잠깐 어긋나고, 어긋나지 않게 하려면 느려집니다. 아래 그림은 같은 변경 하나가 두 방식에서 어떤 차례로 건너가는지 보입니다.

7단계 중 1단계. 같은 데이터를 두 서버에 두고, 한쪽의 변경을 다른 쪽에 옮겨 같은 상태로 맞춥니다. 이것이 데이터베이스 이중화입니다.

1변경을 언제 보내나 — Eager와 Lazy

Eager
  변경 → 복제 반영 → COMMIT
Lazy
  변경 → COMMIT → 복제 반영

Eager 방식은 복제 서버에 반영한 뒤에 커밋을 마칩니다. 변경과 복제가 한 트랜잭션에 묶여 있어 어느 순간에 봐도 두 서버의 값이 같습니다. 그 대신 커밋이 복제 서버를 기다려 응답이 늦어지고, 복제 서버가 멈춰 있으면 그 변경 자체가 취소될 수 있습니다.

Lazy 방식은 커밋을 먼저 마치고 변경을 나중에 보냅니다. 응답은 빠르지만, 보내기 전에 복제 서버를 읽으면 옛 값이 나옵니다.

가르는 기준EagerLazy
복제 반영과 커밋의 차례반영한 뒤 커밋커밋한 뒤 반영
두 서버의 값늘 같다잠깐 다를 수 있다
응답 속도느리다빠르다
복제 서버가 멈추면변경이 취소될 수 있다주 서버는 그대로 일한다

자료에 따라 Eager를 동기 방식, Lazy를 비동기 방식이라고도 부릅니다.

2어느 서버가 일을 받나 — 활동-대기와 활동-활동

활동-대기 방식은 한 서버만 일을 받고 다른 서버는 같은 상태로 기다립니다. 일하던 서버가 멈추면 기다린 서버가 이어받습니다. 어느 순간에도 쓰기를 받는 서버가 하나뿐이라 값이 부딪히지 않습니다.

활동-활동 방식은 두 서버가 모두 일을 받습니다. 일을 나누어 더 많이 처리하고 멈춘 서버를 기다릴 필요도 없습니다. 그 대신 같은 행을 거의 같은 순간에 양쪽에서 고치면 어느 값을 남길지 정해야 합니다. 이것을 충돌이라 하고, 미리 정한 규칙으로 해결합니다.

가르는 기준활동-대기활동-활동
쓰기를 받는 서버하나둘 다
평소 복제 서버기다린다(읽기만 받기도 한다)똑같이 일한다
처리량한 서버 몫두 서버 몫
충돌생기지 않는다생길 수 있어 규칙이 필요하다

3무엇을 맞바꾸나

두 갈림은 따로 고릅니다. 'Lazy·활동-활동'처럼 섞어 쓸 수 있고, 이 짝이 가장 빠르면서 가장 어긋나기 쉽습니다.

무엇을 고르나값이 어긋나지 않게빠르고 많이 처리하게
변경을 보내는 때EagerLazy
일을 받는 서버활동-대기활동-활동

어긋남을 아주 싫어하는 곳(계좌 잔액)은 Eager와 활동-대기 쪽으로, 조금 늦은 값을 보여도 되는 곳(조회 통계)은 Lazy와 활동-활동 쪽으로 기울입니다.

예제

주 서버에서 일어난 변경은 이런 문장 하나입니다. 102번 학생의 운영체제 점수를 90으로 고칩니다.

UPDATE 수강
SET 점수 = 90
WHERE 학번 = 102
  AND 과목코드 = 'OS';
SELECT 학번,
  과목코드,
  점수
FROM 수강
WHERE 학번 = 102
ORDER BY 과목코드;
학번과목코드점수
102DS70
102OS90

주 서버는 어느 방식이든 이 결과입니다. 갈리는 것은 복제 서버가 언제 90을 갖게 되는지입니다. Eager라면 커밋이 끝난 순간 복제 서버도 이미 90입니다. Lazy라면 커밋 직후에 복제 서버를 읽으면 아직 60이 나올 수 있습니다.

다음 네 가지 일이 일어났습니다. 각각 어느 방식 때문인지 먼저 골라 보세요.

(가) 점수를 고치고 커밋한 직후에 복제 서버를 조회했는데 옛 점수가 나왔습니다.

(나) 복제 서버가 꺼져 있는 동안 점수를 고치려 했더니 변경이 취소되었습니다.

(다) 두 지점에서 같은 수강 행의 점수를 거의 같은 순간에 고쳐, 어느 값을 남길지 정해야 했습니다.

(라) 쓰기를 받던 서버가 멈추자 기다리던 서버가 쓰기를 받기 시작했습니다.

가르는 기준방식사례
커밋 뒤에 보내 잠깐 어긋났다Lazy(가)
커밋이 복제 반영을 기다려 함께 묶였다Eager(나)
두 서버가 모두 쓰기를 받았다활동-활동(다)
쓰기를 받는 서버가 하나이고 다른 하나가 이어받았다활동-대기(라)

(가)와 (나)는 '변경을 언제 보내나'의 두 쪽입니다. (다)와 (라)는 '어느 서버가 일을 받나'의 두 쪽입니다. 네 사례는 두 갈림에서 각각 하나씩 고른 결과입니다.

시험 포인트

  • 필기: 이중화는 같은 데이터를 여러 서버에 두고 변경을 옮겨 같은 상태로 맞추는 것입니다. Eager는 복제 서버에 반영한 뒤 커밋해 두 값이 늘 같지만 느리고, 복제 서버가 멈추면 변경이 취소될 수 있습니다. Lazy는 커밋한 뒤 반영해 빠르지만 잠깐 어긋납니다. 활동-대기는 한 서버만 쓰기를 받고 다른 서버가 이어받을 준비를 하며, 활동-활동은 둘 다 쓰기를 받아 처리량이 크지만 충돌이 생길 수 있습니다. 두 갈림은 따로 고릅니다. 상황을 주고 방식을 고르게 하거나, 방식과 그 대가를 짝짓게 합니다. 회복의 즉시 갱신·지연 갱신과 헷갈리지 않습니다 — 그쪽은 한 데이터베이스 안에서 변경을 언제 데이터베이스에 쓰는지를 가르는 것입니다(회복).
  • 실기: 이름은 Eager 방식(Eager), Lazy 방식(Lazy), 활동-대기(Active-Standby), 활동-활동(Active-Active)으로 씁니다.

확인 문제

1. 어느 시스템이 Eager 방식(eager)으로 이중화되어 있습니다. 이 시스템에서 일어나는 일로 알맞은 것을 고르세요.

  • ① 커밋이 끝난 직후에 복제 서버를 읽으면 옛 값이 나올 수 있습니다.
  • ② 커밋이 끝나면 복제 서버도 이미 새 값을 갖고 있습니다.
  • ③ 두 서버가 모두 쓰기를 받아 같은 행이 부딪힐 수 있습니다.
  • ④ 쓰기를 받던 서버가 멈추면 기다린 서버가 이어받습니다.
정답

②입니다. Eager 방식은 복제 서버까지 반영한 뒤에 커밋을 마칩니다. 커밋이 끝난 순간에는 두 서버의 값이 이미 같습니다.

  • ① 커밋을 먼저 마치고 나중에 보내는 Lazy 방식에서 일어나는 일입니다.
  • ③ 쓰기를 받는 서버 수에 따라 갈리는 활동-활동 방식의 이야기입니다. 변경을 언제 보내는지와는 다른 갈림입니다.
  • ④ 활동-대기 방식의 이야기입니다. 이것도 변경을 언제 보내는지와는 다른 갈림입니다.

2. 다음 (가)~(라)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 이름이 영문뿐이면 영문으로만 씁니다. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 주문을 고치고 커밋이 끝났는데, 1초 뒤에 옆 서버를 조회하니 아직 옛 금액이었습니다.
  • (나) 옆 서버로 가는 선이 끊어진 동안에는 주문을 고칠 수 없었습니다. 고치려 하면 취소되었습니다.
  • (다) 평소에는 서울 서버만 주문을 받고 부산 서버는 같은 상태로 기다립니다.
  • (라) 서울과 부산이 모두 주문을 받습니다. 같은 주문을 양쪽에서 고치는 일이 생겨 어느 값을 남길지 규칙을 정해 두었습니다.
정답

받는 답: (가) Lazy 방식(Lazy) · (나) Eager 방식(Eager) · (다) 활동-대기(Active-Standby) · (라) 활동-활동(Active-Active)

(가)의 실마리는 '커밋이 끝났는데 옆 서버는 옛 값이다', (나)는 '옆 서버에 반영할 수 없으면 변경 자체가 취소된다', (다)는 '한쪽만 받고 다른 쪽은 같은 상태로 기다린다', (라)는 '둘 다 받아 같은 행이 부딪힌다'입니다.

  • 같은 이름의 다른 꼴: (가) 비동기 방식 · (나) 동기 방식 — 자료에 따라 이렇게도 부릅니다. 함께 받습니다.
  • 틀리는 꼴 지연 갱신 — (가)에: 회복에서 쓰는 이름으로, 한 데이터베이스 안에서 변경을 커밋할 때까지 미뤄 두는 기법입니다. 서버 둘 사이의 이야기가 아닙니다.
  • 틀리는 꼴 활동-활동 — (나)에: 쓰기를 받는 서버가 둘이라는 뜻입니다. (나)는 받는 서버 수가 아니라 보내는 때 때문에 취소된 것입니다.
  • 틀리는 꼴 Eager 방식 — (다)에: 변경을 언제 보내는지를 가르는 이름입니다. (다)는 어느 서버가 일을 받는지를 말하고 있습니다.

3. 어느 회사가 서울과 부산 서버를 'Lazy·활동-활동'으로 묶었습니다. (1) 이 짝을 고르면 얻는 것 하나와 치르는 것 하나를 쓰세요. (2) 같은 계좌의 잔액을 다루는 시스템이라면 두 갈림을 각각 어느 쪽으로 바꿔야 하는지 이름으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

정답

받는 답:

(1) 얻는 것 — 커밋이 옆 서버를 기다리지 않아 응답이 빠르고, 두 서버가 모두 쓰기를 받아 처리량이 두 서버 몫입니다. 치르는 것 — 커밋 직후 두 서버의 값이 잠깐 다르고, 같은 행을 양쪽에서 고치면 충돌이 생겨 어느 값을 남길지 규칙이 필요합니다.

(2) 변경을 보내는 때는 Eager 방식으로, 일을 받는 서버는 활동-대기로 바꿉니다. 잔액은 어느 쪽을 읽어도 같아야 하므로 커밋 전에 복제 서버까지 반영하고, 같은 잔액이 양쪽에서 고쳐지는 일이 없게 쓰기를 한 서버로 모읍니다.

더 보기: 서버가 아니라 저장 장치를 어떻게 붙이는지는 이어지는 레슨에서 봅니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로