차례
데이터베이스 서버는 하나의 운영 서버에서 장애가 생기면, 대기 서버가 빠르게 운영 서버로 운영될 수 있도록 구축할 수 있다. 이것을 고가용성 high availability 이라고 한다. 또한, 여러 대의 똑 같은 자료를 사용하는 서버를 동시에 운영해서, 서버 부하를 분산해서 운영할 수도 있다. 이것을 부하 분산 load balancing 이라고 한다. 단순하게 이상적으로만 생각한다면, 데이터베이스 서버도 별 문제점 없이 여러 대의 같은 서버가 운영될 수 있을 것이다. 정적인 웹 페이지를 제공하는 웹 서버라면, 여러 대의 웹 서버를 구축해서, 여러 웹 브라우저 요청에 동시에 해당 페이지를 제공해서, 부하를 분산하는 작업은 그리 어려운 일이 아니다. 하지만, 데이터베이스가 읽기 전용 형태로 서비스 되는 경우는 극히 드물다. 또한 하나의 요청에 내부적으로 자료를 읽고 쓰는 작업이 복잡하게 얽혀 있어, 쓰기 작업은 다른 서버에서 그 변경된 자료를 읽는 서비스까지 제공해야하기 때문에, 자료의 일관성 - 자료 정합성이라고 한다 - 을 유지하는 작업이 꽤 난해한 작업이다.
이 동기화 문제가 바로 병렬 데이터베이스 서버를 구축이 어려운 가장 근본적인 문제다. 이 문제를 해결 하는 서로 다른 여러 방법들이 있으며, 서로 다른 개선책을 제시하고 있다.
한 가지 해결책은 오직 하나의 데이터베이스만 읽기/쓰기를 허용하는 것이다. 이 때, 이 서버를 마스터 또는 프라이머리 서버라고 한다. 마스터 서버의 변경된 내용이 그대로 내부적으로 동기화 되는 서버를 스탠바이 또는 세컨더리 서버라고 한다. 마스터 서버의 장애로 운영 제어권을 스탠바이 서버로 남기기 전까지 스탠바이 서버를 사용할 없는 환경을 warm standby 서버 환경이라고 하고, 이와 달리 스탠바이 서버를 읽기 전용으로 사용이 가능한 환경을 hot standby 서버 환경이라고 한다. (일단은 용어들을 영어 단어 그대로 옮겼다. 운영 서버, 대기 서버, 주 서버, 보조 서버 등 우리말 옮기고 싶었으나, 혼돈이 있을 것 같아, 그냥 그대로 옮겼다. 이 설명서 전체에 걸쳐 이렇게 명확히 구분해야하지 않을 상황이면, 운영 서버와 대기 서버를 사용한다.)
다른 한 가지 해결책은 동기화 문제의 안전성을 보장하는 것이다. 데이터 변경 트랜잭션이 발생 했을 때, 사용하는 모든 서버에서 그 트랜잭션이 커밋 되었을 때 만 그 트랜잭션을 유요한 트랜잭션으로 처리하는 방식이다. 이렇게 구현되면, 부하를 분산 할 수 있으며, 하나의 서버에서 장애가 발생되어도 자료의 정합성은 유지될 수 있다. 문제는 서버 자료 동기화 방식을 비동기식으로 처리한다면, 동기화 작업에 지연이 생긴 상황에서 한 서버에서 장애가 발생하면, 자료 손실이 있을 수 있다. 비동기방식을 사용하는 경우는 서버간 통신이 아주 느린 경우에 사용한다.
또 다른 한 가지 해결책은 자료 자체를 나눠서 동기화 하는 방법이다. 데이터베이스 단위이거나, 테이블 단위로 해당 부분만 동기화한다.
이런 여러 방식 가운데 어떤 방식을 선택할 것인가는 서버의 운영 특성과 자료 동기화 하는 방식의 성능에 따라 고려 해야한다. 일반적으로 기능과 성능간의 상관관계를 가진다. 예를 들어, 느린 네트워크 환경에서는 전체 동기화 방식을 사용한다면, 성능은 절반 이하로 떨어질 것이지만, 이런 경우에 비동기화 방식을 사용한다면, 서버 성능 저하를 최소화 할 수 있다.
다음은 장애처리 failover, 복제 replication, 부하 분산 load balancing 기능을 제공하는 여러 기법을 대략적으로 소개하고 있다.