반응형

본 내용은 인프런의 데브위키님의 강의 "개발자를 위한 쉬운 도커" 내용을 바탕으로 정리한 내용입니다.

이중화 DB 구성 이유

  • 단일 서버 구성 시 단일 서버에 장애가 생기면 전체 서비스의 장애로 이어진다.
  • 서버 이중화(Redundancy) 구성 시 하나의 서버가 실패해도 다른 서버가 동일한 역할을 수행하여 고가용성을 보장한다.
  • 하나의 서버가 문제가 생겨도 다른 서버가 있기에 장애를 줄일 수 있다.

그림 1) 단일 서버의 문제점 1

이중화 DB 구성 방법

동시에 같은 볼륨을 사용하는 경우

  • 사용하면 구성이 간단하지만 볼륨에 문제가 생길 경우 대처가 어렵다.
  • 볼륨의 성능에 부하가 생길 수 있다.

그림 2) 동시에 같은 볼륨을 사용하는 경우

각각의 컨테이너에 별도의 볼륨을 연결하는 경우

  • 데이터의 싱크를 맞추는 처리를 별도로 해야 한다.

그림 3) 별도의 볼륨을 사용하는 경우

1. Primary-Standby Replication 방식

  • 프라이머리-스탠바이 복제 구조의 경우 프라이머리 서버에만 쓰기 작업을 수행하며, 프라이머리의 상태를 스탠바이에 복제한다.
  • 스탠바이 서버는 읽기 전용으로만 사용되며, 읽기 전용 스탠바이 서버를 여러 대 사용할 수 있다.

그림 4) Primary-Standby Replication 방식

2. Primary-Primary Replication 방식

  • 프라이머리-프라이머리 복제 구조의 경우 모든 서버에 읽기/쓰기작업을 수행한다.
  • 여러 서버에서 동시에 쓰기 작업이 일어나기 때문에 동기화 구성 작업이 복잡하다.

그림 5) Primary-Primary Replication 방식

 

예시 1) 프라이머리-스탠바이 이중화 Postgres 구성(프라이머리 노드)

# 1. easydocker/leafy/leafy-postgres 디렉터리 이동 및 소스코드 상태 변경
git reset --hard HEAD && git clean -fd
# 소스코드 버전 변경
git switch 05-redundancy

# 2. 테스트용 네트워크 생성
docker network create postgres

 

예시 2) 프라이머리-스탠바이 이중화 Postgres 구성 (프라이머리 노드)

#3. 프라이머리 노드 실행
docker run -d \
--name postgres-primary-0 \
--network postgres \ 
-v postgres_primary_data://bitnami/postgresql \ # Windows는 //bitnami/postgresql
-e POSTGRESQL_POSTGRES_PASSWORD=adminpassword \ ------- postgres 사용자(슈퍼유저)의 비밀번호
-e POSTGRESQL_USERNAME=myuser \ ----------------------------------- 데이터베이스 사용자 이름
-e POSTGRESQL_PASSWORD=mypassword \ --------------------------- 데이터베이스 사용자 패스워드
-e POSTGRESQL_DATABASE=mydb \ ---------------------------------------------- 데이터베이스 명
-e REPMGR_PASSWORD=repmgrpasswor----------------------- Repmgr 패스워드(레플리케이션 관리용)
-e REPMGR_PRIMARY_HOST=postgres-primary-0 \ -------------------- 프라이머리 노드의 호스트 명
-e REPMGR_PRIMARY_PORT=5432 \ --------------------------------------- 프라이머리 노드의 포트
-e REPMGR_PARTNER_NODES=postgres-primary-0,postgres-standby-1:5432 \ ------ 통신할 노드 목록
-e REPMGR_NODE_NAME=postgres-primary-0 \ ---------------------------------- 현재 노드의 이름
-e REPMGR_NODE_NETWORK_NAME=postgres-primary-0 \ ---------------------- 현재 노드의 도메인명
-e REPMGR_PORT_NUMBER=5432 \ ---------------------------------------------- 현재 노드의 포트
 bitnami/postgresql-repmgr:15   

 

예시 3) 프라이머리-스탠바이 이중화 Postgres 구성 (프라이머리 노드)

# 4. 스탠바이 노드 실행
docker run -d \
--name postgres-standby-1 \
--network postgres \ 
-v postgres_standby_data://bitnami/postgresql \ # Windows는 //bitnami/postgresql
-e POSTGRESQL_POSTGRES_PASSWORD=adminpassword \
-e POSTGRESQL_USERNAME=myuser \
-e POSTGRESQL_PASSWORD=mypassword \
-e POSTGRESQL_DATABASE=mydb \
-e REPMGR_PASSWORD=repmgrpassword \
-e REPMGR_PRIMARY_HOST=postgres-primary-0 \
-e REPMGR_PRIMARY_PORT=5432 \
-e REPMGR_PARTNER_NODES=postgres-primary-0,postgres-standby-1:5432 \
-e REPMGR_NODE_NAME=postgres-standby-1 \
-e REPMGR_NODE_NETWORK_NAME=postgres-standby-1 \
-e REPMGR_PORT_NUMBER=5432 \
bitnami/postgresql-repmgr:15

 

예시 4) 프라이머리-스탠바이 이중화 Postgres 구성 (데이터 테스트)

# 5. SHELL1, SHELL2 각 컨테이너의 로그 확인
docker logs -f postgres-primary-0
docker logs -f postgres-standby-1

# 6. 프라이머리 노드에 테이블 생성 및 데이터 삽입
docker exec -it -e PGPASSWORD=mypassword postgres-primary-0 psql -U myuser -d mydb -c "CREATE TABLE sample (id SERIAL PRIMARY KEY, name VARCHAR(255));"
docker exec -it -e PGPASSWORD=mypassword postgres-primary-0 psql -U myuser -d mydb -c "INSERT INTO sample (name) VALUES ('John'), ('Jane'), ('Alice');"

# 7. 스탠바이 노드에 데이터가 동기화되어 있는지 확인
docker exec -it -e PGPASSWORD=mypassword postgres-standby-1 psql -U myuser -d mydb -c "SELECT * FROM sample;"

# 8. 환경 정리
docker rm -f postgres-primary-0 postgres-standby-1
docker volume rm postgres_primary_data postgres_standby_data
docker network rm postgres
반응형

+ Recent posts