Repmgr 을 활용한 PostgreSQL 이중화 서버 구현 1

&&&·2024년 3월 13일

repmgr 을 활용해서 postgresql 이중화 서버를 구현해 보았습니다.
잘 모르셔도 그대로만 따라하면 구현이 되도록 자세하게 적어두었습니다.
혹시 읽다가 틀린 부분이 있다거나 이해가 되지 않는 부분이 있다면 댓글 부탁드립니다.

  • 개발 환경
    OS : Linux Centos7,
    사용 라이브러리 : repmgr
    PostgreSQL v14

1. postgresql 다운로드 (all server)

[root@localhost /]# sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[root@localhost /]# sudo yum install -y postgresql14-server

2. postgresql database 초기화(primary only)

[root@localhost /]# sudo /usr/pgsql-13/bin/postgresql-13-setup initdb

3. repmgr 및 dnf 다운로드 (all server)

[root@localhost /]# curl https://dl.enterprisedb.com/default/release/get/14/rpm | sudo bash
[root@localhost /]# yum install dnf
[root@localhost /]# sudo dnf install repmgr14
[root@localhost /]# ln -s /usr/pgsql-14/bin/repmgr /usr/bin/repmgr
[root@localhost /]# ln -s /usr/pgsql-14/bin/repmgrd /usr/bin/repmgrd

5. etc/sudoers 파일 수정 (all server)

postgres ALL=NOPASSWD: /usr/bin/systemctl stop postgresql-14.service, \
        /usr/bin/systemctl start postgresql-14.service, \
        /usr/bin/systemctl restart postgresql-14.service, \
        /usr/bin/systemctl reload postgresql-14.service, \
        /usr/bin/systemctl start repmgr14.service, \
        /usr/bin/systemctl stop repmgr14.service

postgres 계정이 postgreSQL 또는 repmgr을 패스워드 없이 시작, 종료 할 수 있도록 설정.

6. User와 Database 생성 (primary only)

[root@localhost /]# createuser --superuser repmgr
[root@localhost /]# createdb --owner=repmgr repmgr

7. postgresql.conf 파일 수정 (primary only)

listen_addresses = '*'
port = 5432
max_wal_senders = 10
max_replication_slots = 10
wal_level = 'replica'
hot_standby = on
archive_mode = on
archive_command = '/bin/true'
wal_log_hints = on
shared_preload_libraries = 'repmgr'

8. pg_hba.conf 수정 (primary only)

## type  database   user       address      auth-method

local	replication	{유저명}	   		          trust
host	replication	{유저명}	127.0.0.1/32	  trust
host	replication	{유저명}	{IP대역}/24	    trust
local	{DB명}		  {유저명}			            trust
host	{DB명}		  {유저명}	127.0.0.1/32	  trust
host	{DB명}		  {유저명}	{IP대역}/24	    trust

Type : local 은 같은 머신에서의 연결을 의미하고 host 는 네트워크를 통한 연결을 의미합니다. host는 hostssl 과 hostnossl 로 세분화되어 SSL 연결만 허용하거나 금지할 수 있습니다.

Database : 이 규칙이 적용된 데이터 베이스를 지정합니다. sameuser 나 samerole 같은 특수 키워드를 사용하여 접근 규칙을 세밀하게 조정할 수 있습니다.

User : 이 규칙이 적용될 사용자를 지정합니다. all 로 설정해 모든 사용자에게 적용할 수 있습니다.

Address : 클라이언트의 ip주소 또는 네트워크를 지정합니다. local의 경우 이 필드는 사용되지 않습니다.

Auth-method : 클라이언트 인증 방법을 지정합니다. (trust , reject, md5, password, scram-sha-256, peer , gss, sspi, identm pam , ldap 등이 있습니다.)

궁금점1

  • 위에서 설정한 “ local replication {유저명} trust ” 와 “ host replication {유저명} 127.0.0.1/32 trust ” 는 같은 설정이지 않은가?
    → 여기서 127.0.01 은 자신을 가리키는 IP주소입니다. 하지만 local은 같은 머신에서의 소켓 연결을 의미하고 host는 네트워크를 통한 연결을 의미합니다. 그러므로 두 줄은 서로 다른 의미입니다..
    추가로 소켓 연결이란 네트워크 스택을 거치지 않고 운영체제 내에서 프로세스 간 직접 통신을 가능하게 하는 기능입니다. 기본적으로 “ psql -h /var/run/postgresql -d 데이터베이스명 -U 유저명 “으로 명령어를 친다면 소켓 통신을 통해서 postgresql 데이터베이스에 접속하게 됩니다. 여기서 -h 조건없이 “ psql -U postgres -p 5432 ” 명령어로 postgresql 에 접속하게 된다고 하더라도 postgresql 에 접속할 때는 기본설정으로 Unix 소켓을 사용하게 되어있기 때문에 Unix 소켓을 사용하여 연결이 됩니다.

궁금점2

  • replication 이라는 데이터 베이스가 없는데 왜 replication 에 대한 설정이 있는 걸까?
    -> 이는 특정한 데이터베이스 이름을 지칭하는 것이 아니라 PostgreSQL 의 데이터 복제 기능을 사용할 때 접근 제어를 설정하기 위한 목적으로 사용됩니다.
    하나의 주(Primary) 데이터베이스 서버에서 하나 이상의 스탠바이(Standby) 서버로 데이터를 복제하는 과정에서 스탠바이 서버는 주 서버에 연결하여 데이터를 동기화 받게 되는데, 이때 pg_hba.conf에 정의된 복제 관련 설정이 사용됩니다.

9. repmgr.conf 수정 (primary only)

node_id=1
node_name='{노드명}'
conninfo='host={IP주소} user={DB명} dbname={유저명} connect_timeout=2'
data_directory='/var/lib/pgsql/14/data'

service_start_command = 'sudo systemctl start postgresql-14.service'
service_stop_command = 'sudo systemctl stop postgresql-14.service'
service_restart_command = 'sudo systemctl restart postgresql-14.service'
service_reload_command = 'sudo systemctl reload postgresql-14.service'

10. repmgr에 primary 서버 등록 (primary only)

[root@localhost /]# repmgr primary register

11. repmgr에 primary 서버 등록 확인 (primary only)

[root@localhost /]# repmgr cluster show

12. standby 서버 중지 (standby only)

[root@localhost /]# systemctl stop postgresql-14

13. repmgr.conf 수정 (standby only)

node_id=2
node_name='{노드명}'
conninfo='host={IP주소} user={DB명} dbname={유저명} connect_timeout=2'
data_directory='/var/lib/pgsql/14/data'

service_start_command = 'sudo systemctl start postgresql-14.service'
service_stop_command = 'sudo systemctl stop postgresql-14.service'
service_restart_command = 'sudo systemctl restart postgresql-14.service'
service_reload_command = 'sudo systemctl reload postgresql-14.service'

14. 5432 port에 대한 방화벽 설정(all server)

[root@localhost /]# firewall-cmd --permanent --add-port=5432/tcp
[root@localhost /]# firewall-cmd --reload

15. primary 서버에 있는 데이터 복제 (standby only)

[root@localhost /]# repmgr -h {primary IP} -U {유저명} -d {DB명} standby clone --force

16. 방화벽 설정

[root@localhost /]# firewall-cmd --list-all
[root@localhost /]# firewall-cmd --permanent --add-port=5432/tcp
[root@localhost /]# firewall-cmd reload

17. postgresql 실행 및 standby 서버로 등록 (standby only)

[root@localhost /]# sudo systemctl start postgresql-14.service
[root@localhost /]# repmgr standby register

&저장해둔 곳

https://github.com/yoojin-kwon12/PostgreSQL_HA_MASTER
https://github.com/yoojin-kwon12/PostgreSQL_HA_SLAVE

0개의 댓글