Replication 사용을 고민한다면, 개발하고자 하는 서비스의 요구 사항 뿐만 아니라
각 Replication 기술의 장점과 단점을 이해해야 적합한 솔루션을 선택할 수 있다.
PostgreSQL에서 제공하는 Replication 기술의 종류와 그 특징에 대해 더 알아보고 싶다면 PostgreSQL Replication 포스팅을 참고하자.
위에서 링크로 첨부한 포스팅에서 언급했던대로, 이번 포스팅에서는 Streaming Replication
방식을 사용하여 주 데이터베이스를 쓰기 전용 데이터베이스로, 복제본을 읽기 전용 데이터베이스로 구성하는 과정을 정리할 것이다.
Docker Compose를 사용하면 각각의 컨테이너로 구성된 PostgreSQL을 구성하는 데 필요한 환경을 쉽게 정의할 수 있기 때문에 주 데이터베이스와 복제본 간의 구성 및 관리를 보다 편리하게 할 수 있으며,
유연한 설정으로 여러 복제본을 구축하고 관리할 수 있기 때문에 Docker Compose를 사용하여 개발 환경에서 사용할 Replication을 구성하고자 한다.
Docker Hub에서 postgresql을 검색하니 가장 pull 수가 많은 이미지로는
Docker Officail Image인 postgres
와 VMWare에서 만든 이미지인 bitnami/postgresql
가 있었다.
bitnami/postgresql
이미지의 개요 탭에서 bitnami 이미지를 사용하는 이유를 다음과 같이 소개해두었다.
Bitnami는 업스트림 소스 변경 사항을 면밀히 추적하고 자동화된 시스템을 사용하여 이 이미지의 새 버전을 즉시 게시합니다.
Bitnami 이미지를 사용하면 최신 버그 수정 및 기능을 최대한 빨리 사용할 수 있습니다.
근데 솔직히 bitnami 이미지를 사용하는 이유에 대한 설명은 내게 크게 와닿진 않았고 ···
저런 것들보다는 replication 구성에 익숙하지 않은 나에게 Streaming Replication Set Up 방법을 개요 탭에 상세히 적어두었다는 점이 너무 반가웠다!
( postgres
이미지에 대한 설명 에서는 그런거 못 찾았다. )
그래서, bitnami/postgresql
이미지를 사용하고, Streaming Replication Set Up 참고하여 Streaming Replication 구성을 해볼 예정이다 😊
version: "3.8"
services:
# 쓰기 전용 데이터베이스
postgresql-main:
image: 'bitnami/postgresql:latest'
ports:
- '5432:5432'
restart: on-failure
volumes:
- postgresql_main_data:/bitnami/postgresql
- ./replication-user-grant.sql:/docker-entrypoint-initdb. d/db.sql
environment:
- POSTGRESQL_REPLICATION_MODE=master # 복제 모드 [master / slave]
- POSTGRESQL_REPLICATION_USER=repl_user # 복제 사용자 이름
- POSTGRESQL_REPLICATION_PASSWORD=repl_password # 복제 사용자 비밀번호
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=ourhour
# 읽기 전용 데이터베이스
postgesql-standby:
image: 'bitnami/postgresql:latest'
ports:
- '5433:5432'
restart: on-failure
depends_on:
- postgresql-main
environment:
- POSTGRESQL_REPLICATION_MODE=slave # 복제 모드 [master / slave]
- POSTGRESQL_REPLICATION_USER=repl_user # 복제 사용자 이름
- POSTGRESQL_REPLICATION_PASSWORD=repl_password # 복제 사용자 비밀번호
- POSTGRESQL_MASTER_HOST=postgresql-main
- POSTGRESQL_MASTER_PORT_NUMBER=5432
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
volumes:
postgresql_main_data:
driver: local
POSTGRESQL_MASTER_HOST
와 POSTGRESQL_MASTER_PORT_NUMBER
환경 변수는 standby 데이터베이스가 어떤 주소와 포트로 main 데이터베이스에 연결할지 정의한다.
POSTGRESQL_REPLICATION_USER
와 POSTGRESQL_REPLICATION_PASSWORD
환경 변수는 복제를 위해 특별히 생성된 사용자의 이름 및 비밀번호를 설정한다.
./replication-user-grant.sql
: 복제 사용자인 repl_user에게 복제 작업을 위해 필요한 권한을 부여한다.
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO repl_user;
ALTER USER REPL_USER WITH SUPERUSER;
이전 포스팅인 스프링부트 프로젝트 생성 에서 추가했던 Docker Compose Support
의존성은 Docker Compose 명령을 Spring Boot 3에 위임할 수 있도록 하는 도구로,
Docker Compose 파일이 존재하는 것을 감지하고, 서비스에 연결하기 전에 자동으로 docker compose up 명령을 실행한다.
만약 서비스가 이미 실행 중이라면, 그 서비스에 연결한다.
별도의 설정을 하지 않으면, Docker Compose 파일이 존재하는 것을 감지하기 위해 기본적으로 docker-compose.yaml 파일을 찾는다.
개발 환경에서 어플리케이션을 실행할 때 방금 작성했던docker-compose-dev.yml
을 찾아 서비스에 연결하도록 설정하기 위해 application-dev.yml
파일을 다음과 같이 작성한다.
또한, docker-compose-dev.yml
에서 구성한 main
데이터베이스와 standby
데이터베이스의 정보로 커넥션 풀을 생성하고
, 관리하기 위해 다음과 같이 datasource 구성을 정의한다.
spring:
config:
activate:
on-profile: dev
# 1.
docker:
compose:
file: docker-compose-dev.yml
# 2.
datasource:
main:
hikari:
driver-class-name: org.postgresql.Driver
jdbc-url: jdbc:postgresql://localhost:5433/ourhour
username: my_user
password: my_password
standby:
hikari:
driver-class-name: org.postgresql.Driver
jdbc-url: jdbc:postgresql://localhost:5433/ourhour
username: my_user
password: my_password
이번 포스팅에서는 Docker Compose로 PostgreSQL Replication 구성하기 위해 docker-compose-dev.yml
파일을 작성하고, 다중 datasource 구성을 application-dev.yml
파일에 정의했다.
다음 포스팅에서는 application-dev.yml
에 정의된 다중 datasource 구성을 기반으로, 데이터 소스를 생성하고
트랜잭션의 read-only 여부에 따라 라우팅하는 코드를 작성할 것이다.
[개인 프로젝트(9)] 개발 환경 구축 - Springboot Multi DataSource 동적 라우팅
https://velog.io/@ieieie0419/%EA%B0%9C%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B89-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-Springboot-Multi-DataSource-%EB%8F%99%EC%A0%81-%EB%9D%BC%EC%9A%B0%ED%8C%85