vultr 가상화 + ubuntu 21.04 + postgresql 13 replication

2021. 6. 16. 15:47개발 이야기/Postgresql

함쓰 가계부 앱 DB 서버 구성하기

데이터 베이스는 현재 사용중인 postgresql 로 구성하고자 합니다.

현재 오라클에서 운영하고 있는 서버는 

 

PostgreSQL 13.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

 

이렇게 나오네요.

제가 직접 리눅스를 설치하고 DBMS 를 설치했습니다.

Docker 같은 컨테이너는 사용하지 않고 OS위에 직접 설치 했습니다.

다만 pgadmin4 를 이용하기 위해서 docker 를 설치하긴 했습니다.

 

이번에는 pgadmin 을 어느 서버에 설치를 해야할까 잠시 고민입니다.

db서버니까 공인ip는 오픈하지 않고 was에 docker 를 이용하여 설치를 해야겠습니다.

 

DB구성은 이렇게 할 예정입니다.

 

vip - pgpool II - Master (read/write)

                         - Slave (read)

 

서버 두대가 백업이 되고 pgpool 이 부하 분산과 failover 를 담당해줄 것입니다.

참고로 postgresql 이중화를 해본적이 없고 pgpool 부하분산을 read/write , read 로 해본적이 없어서 아직은 좀 감이 안오네요

기본 셋팅만으로 들어오는 쿼리를 알아서 분산을 해주는 것인지도 확실하지 않구요.

일단 서버 OS부터 생성해보겠습니다.

 

vultr 클라우드를 활용한 가상화 서버 2대 생성하기

현재 서버는 centos 를 사용중입니다만 centos8 이 종료되고 centos stream 으로 바뀐다네요?

이번에는 리눅스 양대 산맥인 ubuntu 서버로 해보겠습니다.

서버는 나중에 업그레이드 하면 되니까 일단 가장 저렴한 서버로 선택하겠습니다.

 

우분투 최신 버전에 최저 서버를 선택했습니다.

두대를 만들겠습니다.

 

WAS 서버만 접속하면 되므로 내부 네트워크를 사용할 수 있도록 Private network 를 enable 선택했습니다.

DB 서버 2대가 생성되었습니다.

이제 postgresql 13 을 설치하고 pgpool 을 셋팅해보겠습니다.

 

SSH-KEY 셋팅 하기

먼저 편하게 서버에 접근하기 위해서 sshkey 를 셋팅해볼게요

# ssh-keygen -t ed25519 -C "your_email@example.com"

이렇게 하면 만들수 있다고 합니다.

 

만들어진 pub 파일을 열어서 그 텍스트를 그대로 붙여서

vultr 셋팅에 키를 생성해 줬습니다.

다음으로는 맥 터미널에서 바로 접속을 하려면 이렇게 입력했습니다.

# ssh -i 키경로 서버아이피

 

이렇게 하니까 잘 연결 되네요

 

상기 화면까지 나오는데..

서버를 생성할때부터 sshkey 를 만들어줬어야 하나 봅니다.

 

제가 서버 두개중이 하나는 sshkey 를 나중에 만들고 reinstall 을 했거든요.

그건 바로 잘 붙었고 다른 하나는 그냥했더니 안되서 reinstall 하니까 되네요.

아마도 서버 내부에서 sshkey 셋팅을 다시 하는 방법이 있겠지만 저는 깨끗한 os 니까 다시 설치해도 무방해서 다시 했습니다.

 

그리고 작업을 이어가기 위해서는 사설 IP를 알아야 하는군요. 내부 통신용인듯 합니다.

vultr 에 사설 아이피 셋팅이 안되어 있어서 그것부터 하도록 하겠습니다. 

이 셋팅은 둘다 필요할 것 같습니다. (Master / Slave)

 

저의 경우는 인스턴스를 만들때 사설네트워크를 추가해놨었기 때문에 이미 생성이 되어 있는데

서버에 어댑터 설정이 안되어 있는 것 같습니다.

이문서를 보고 따라 했습니다.

https://www.vultr.com/docs/how-to-configure-a-private-network-on-ubuntu#Ubuntu_17_10_through_20_04

 

SSD VPS Servers, Cloud Servers and Cloud Hosting by Vultr

Vultr Global Cloud Hosting - Brilliantly Fast SSD VPS Cloud Servers. 100% KVM Virtualization

www.vultr.com

인스턴트 셋팅에 보면 아래와 같이 private network 정보가 있습니다.

# ip addr

저의 경우는 이 파일이었네요
# vi /etc/netplan/10-enp6s0.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    enp6s0:
      match:
        macaddress: 맥주소
      mtu: 1450
      dhcp4: no
      addresses: [아이피/서브넷]   ex) 10.3.96.3/20    
  
# netplan apply    

서버 두개다 셋팅하고 해당 아이피로 핑을 때려보면 잘 가네요.

두 서버 사이에도 핑이 잘 갑니다. (처음 아이피 잘못 셋팅해서 한참을 해멨네요)

여기까지 셋팅을 하다가 vultr 의 방화벽 기능을 알게 되었어요

그래서 우분투 방화벽을 꺼버리고 vultr 에서 제공하는 방화벽을 셋팅했습니다.

 

방화벽은 아래와 같이 꺼버렸어요

ufw disable

이렇게 하니까 외부에서는 차단이 되고 내부 아이피끼리는 잘 통신이 되는것이 확인 됩니다.

포트가 잘 열려있는지는 아래와 같이 해보면 압니다.

root@ggmoney-db1:~# telnet 10.34.96.4 5432
Trying 10.34.96.4...
Connected to 10.34.96.4.
Escape character is '^]'.

위와 같이 나오면 잘 연결이 된다는 것입니다.

만약 연결이 안되면 커서만 깜빡깜빡 합니다.

Postgresql 설치하기

우분투에서는 처음 설치해보네요. 열심히 구글링 해봅니다.

https://jinisbonusbook.tistory.com/70 

 

PostgreSQL 이중화(HA) 구성 방법 #1 - 개념 및 초기 복제 구성

PostgreSQL 의 이중화 구성 방법 중 Active-Standby 로 구성하는 방법을 포스팅합니다. 먼저 이중화 구성 방법을 개념도로 설명하여 이해를 돕겠습니다. 1. 정상 동작 중일 경우 정상 동작 시 구성 형태

jinisbonusbook.tistory.com

https://velog.io/@jwpark06/Postgresql-%EC%9D%B4%EC%A4%91%ED%99%94%ED%95%98%EA%B8%B0-Streaming-%EB%B0%A9%EC%8B%9D

 

Postgresql 이중화하기

먼저, DB 이중화에 대해 알아보겠습니다. DB 이중화란 '기준이 되는 데이터베이스(Master)의 변경된 데이터를 물리적으로 떨어진 각각의 데이터베이스(Slave)에 동일하게 유지하여 관리하는 것'이라

velog.io

일단 요 블로그들을 참조해서 해보겠습니다.

먼저 DB먼저 설치해줬습니다. (Master, Slave)

$ sudo apt -y install postgresql postgresql-contrib

잘 설치 된것 같습니다.

https://www.qunsul.com/posts/postgresql-13-streaming-replication-on-ubuntu.html

위에 있는 포스트들은 구버전이라서 잘 동작이 안되는듯 해서 맨 아래 13버전 해외 포스트를 그대로 참조하였습니다.

 

OS의 postgres 계정 비번을 설정합니다. (Master / Slave)

root@ggmoney-db1:~# passwd postgres

DB 기본계정의 비밀번호를 설정합니다. (Master / Slave)

root@ggmoney-db2:/lib# su - postgres
postgres@ggmoney-db2:~$ psql
psql (13.2 (Ubuntu 13.2-1))
Type "help" for help.

postgres=# alter user postgres with password '비밀번호'
postgres-#

다음으로 복제 계정을 생성합니다. (Master)

마스터만 작업해주면 되나봅니다. Slave 에 접속해서 밀어넣어줘야 하니까 그런가보네요

root@ggmoney-db1:/var/lib/postgresql/13/main# su - postgres
postgres@ggmoney-db1:~$ psql
psql (13.2 (Ubuntu 13.2-1))
Type "help" for help.

postgres=# create user replication with replication login password 'replica' connection limit -1;
CREATE ROLE
postgres=# \du
                                    List of roles
  Role name  |                         Attributes                         | Member of
-------------+------------------------------------------------------------+-----------
 postgres    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 replication | Replication                                                | {}

postgres=#

 

데이터 파일의 위치를 확인해보았습니다

root@ggmoney-db1:/usr/lib/postgresql/13/bin# su - postgres
postgres@ggmoney-db1:~$ psql
psql (13.2 (Ubuntu 13.2-1))
Type "help" for help.

postgres=# show data_directory;
       data_directory
-----------------------------
 /var/lib/postgresql/13/main
(1 row)

 

원격접속을 위한 셋팅을 변경하겠습니다. 기본으로 localhost 만 접근 가능한가봅니다.

블로그들에 나와 있는 설정파일들의 위치가 저와는 조금식 차이가 있네요

제것을 기준으로 나중을 위해서 기록을 남겨두도록 하겠습니다.

root@ggmoney-db1:/usr/lib/postgresql/13/bin# vi /etc/postgresql/13/main/postgresql.conf

편집기로 보면 아래와 같은 곳을 수정해줍니다. (Master./ Slave)

# listen_addresses = 'localhost' -> 주석으로 되어있음
listen_addresses = '*'

동일한 파일에 마스터만 아래 내용을 셋팅합니다. (Master)

# 요 한부분도 넣어줍니다. 블로그들 보면 뭔가 설정이 많은데 이것만 해도 되나봅니다.
# 나머지는 차차 옵션을 알아보고 추가해야겠습니다.

wal_level = replica

 

보안 설정도 해줘야 한다고 합니다. (Master / Slave)

맨 아래에 추가, 패스워드 인증 방식을 모든 IP에 허용한다는 의미라고 합니다.

저는 vultr 방화벽을 사용하여 특정 클라이언트만 접속 가능하게 할 예정이므로 일단 모두 열어두겠습니다.

root@ggmoney-db2:/lib# vi /etc/postgresql/13/main/pg_hba.conf

host    all             all             0.0.0.0/0               trust

상기 파일의 끝에 마스터만 아래 내용을 추가합니다. (Master)

이중화를 했을때 슬레이브에서 마스터에 접근할 수 있도록 해주는 부분으로 보면 될것 같습니다.

아래 아이피는 슬레이브 DB의 아이피 입니다.

host    all             all             10.34.96.4/20               md5

 

서비스를 재시작 합니다. (Master / Slave)

root@ggmoney-db1:/usr/lib/postgresql/13/bin# systemctl restart postgresql
root@ggmoney-db1:/usr/lib/postgresql/13/bin# systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: ena>
     Active: active (exited) since Wed 2021-06-16 08:56:03 UTC; 7s ago
    Process: 6912 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 6912 (code=exited, status=0/SUCCESS)

 

그다음 슬레이브 서버에 마스터 데이터를 가져옵니다.

/etc/postgres/13/main/postgresql.conf 파일을 수정 (Slave)

primary_conninfo = 'host=10.34.96.3 port=5432 user=replication password=replica'

마스터 데이터 복제 

# 기존 데이터 디렉토리 백업후
mv /var/lib/postgresql/13/main /var/lib/postgresql/13/main_old

# 마스터에서 복제
root@ggmoney-db2:/etc/postgresql/13/main# sudo -u postgres pg_basebackup -h 10.34.96.3 -D /var/lib/postgresql/13/main -U replication -v -P --wal-method=stream --write-recovery-conf
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/1C000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_11006"
32249/32249 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/1C000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed

여기까지 하면 -write_recovery 때문에 자동으로 슬레이브 서버로 동작하는것 같습니다.

그런데 한번더 아래처럼 하라고 안내되어 있네요.

touch /var/lib/postgresql/13/main/standby.signal

그럼 이제 동작이 잘 되는지 확인해봐야겠습니다.

 

먼저 기존에 사용하던 로컬 pgadmin4 에 새로 만든 서버를 붙여보았습니다.

방화벽에 제 아이피만 허용해놨기 때문에 잘 붙어야 정상입니다.

 

 

두개 서버 모두 잘 붙었습니다.

이제 Master에서 테이블을 만들고 데이터 추가/삭제를 해보겠습니다.

그다음 Slave 에서 잘 복제되는지 확인해보면 되겠지요

 

 

 

Master DB 에서 테이블을 생성하고 인서트가 잘되었습니다.

Slave 를 확인해보면.

테이블 생성 및 데이터가 잘 들어와 있는것을 확인했구요

인서를 하려고 할때 read-only 라고 안되는군요.

특별한 셋팅을 하지 않았음에도 의도한데로 잘 동작하네요

 

참고로 이상태에서 Master 를 stop 해봤습니다.

Slave 가 동작하긴 하는데 그대로 read_only 로만 동작되네요.

Master 를 켜면 다시 잘 Master / Slave 모드로 동작하긴 합니다.

 

이것을 자동으로 fail-over 할수 있도록 pgpool 을 셋팅해보도록 하겠습니다.