DRBD, Pacemaker, Corosync를 이용한 PostgreSQL HA 구성


1. 환경 구성

  • VM 2개(VirtualBox 사용)

  • Cent OS 7.4 버전기준

  • NIC 카드 2개 필요
  • IP 5개 필요 (Service IP 2개, Heartbeat용 2개, VIP 1개)

  • VM 당 별도 추가 디스크 설정
  • 특별한 표시가 없으면 VM 2대 모두에 해당 되는 내용입니다.


2. OS 설정


1. Directory 생성 (PGDATABASE로 생성)

mkdir /PG/PGDATABASE    (Postgresql Engine 디렉토리)
mkdir /data/PGDATABASE  (Postgresql Data 디렉토리)

mkdir /data/PGDATABASE/data  
mkdir /data/PGDATABASE/data/pg  
mkdir /data/PGDATABASE/pg_xlog   
mkdir /data/PGDATABASE/TS01  
mkdir /arch/PGDATABASE/arch 


2. USER 생성 및 디렉토리 설정

adduser pgadmin

chown -R pgadmin:pgadmin /PG/PGDATABASE
chown -R pgadmin:pgadmin /data/PGDATABASE

chmod -R 0755 /data/PGDATABASE/data
chmod -R 0755 /data/PGDATABASE/pg_xlog
chmod -R 0750 /arch/PGDATABASE/arch
chmod -R 0700 /data/PGDATABASE/TS01


3. SELinux 설정 해제 및 NetworkManager 해제

setenforce 0
systemctl stop firewalld
systemctl disable firewalld

systemctl stop NetworkManager
systemctl disable NetworkManager


4. Hostname 등록 (/etc/hosts)

EX)  10.1.1.11     cluster-node01
     10.1.1.12     cluster-node02
     172.1.1.11   cluster-node01-hb 
     172.1.1.12   cluster-node02-hb


5. VG, LV 생성

  • 추가 디스크가 /dev/sdb에 있다고 가정
vgcreate rootvg -s 64 /dev/sdb
lvcreate --extents 100%FREE -n data rootvg


6. 계정 환경 설정 (User .bash_profile)

  • su - pgadmin
  • vi .bash_profile
export PGHOME=/PG/PGDATABASE/pgsql 
export PATH=$PGHOME/bin:$PATH 
export PGDATA=/data/PGDATABASE/data/pg
export PGDATABASE=pgdatabase
export PGUSER=pgadmin 
export PGPORT=5448
  • source ~/.bash_profile (반영)


3. SW 설치


1. 관련 패키지 설치

yum install gcc gcc-c++ make autoconf wget readline readline-devel zlib zlib-devel openssl openssl-devel gettext gettext-devel python python-devel


2. pacemaker, corosync 설치

yum install pacemaker corosync


3. DRBD 설치

rpm -Uvh http://mirror.web24.net.au/elrepo/elrepo/el6/x86_64/RPMS/elrepo-release-6-5.el6.elrepo.noarch.rpm
 
yum install drbd84-utils kmod-drbd84 heartbeat


4. DRBD Setting


1. DRBD Conf Setting (/etc/drbd.d/drbd_res01.res)

resource "drbd_res01"
{
     protocol C;
     disk {on-io-error detach;}
     syncer {}
		
     on cluster-node01 {
             device /dev/drbd0;
             disk /dev/mapper/rootvg-data;
             address 172.1.1.11:7791;
             meta-disk internal;
     }

     on cluster-node02 {
             device /dev/drbd0;
             disk /dev/mapper/rootvg-data;
             address 172.1.1.12:7791;
             meta-disk internal;
     }
}
  • protocol C 는 동기 방식을 의미
  • 아까 만들어 놓은 LV와 논리 디바이스 /dev/drbd0로 매핑하여 사용
  • DRBD는 7791번 포트를 통해 통신


2. DRBD Meta Data 생성 및 실행

drbdadm create-md drbd_res01 --force
drbdadm up drbd_res01
drbdadm primary drbd_res01 --force             # Primary Node에서 실행
  • create-md를 통해 메타 데이터를 생성
  • drbd를 실행하고 Primary 노드에서 마지막 명령어로 primary롤 지정


3. DRBD Primary 설정 (※ Primary Node 에서만 실행)

drbdadm -- --overwrite-data-of-peer primary drbd_res01 
									#primary --> secondary로 동기화가 되게 설정하는 것
drbdadm status drbd_res01
mkfs.xfs /dev/drbd0		# 파일 시스템 생성
mount /dev/drbd0 /data	# Mount
  • 동기화 하는동안 drbdadm status를 통해 상태확인


4. 실제 동기화가 되는지 확인

  • Primary
touch /data/a
umount /data
drbdsetup /dev/drbd0 secondary
  • Secondary
drbdsetup /dev/drbd0 primary
mount /dev/drbd0 /data
  • Secondary의 /data 밑에 a 파일이 있는 것 확인


5. Pacemaker Cluster 구성

1. hacluster 계정 패스워드 설정

※ hacluster 계정은 pacemaker 설치 시 자동 생성되는 계정

echo 'abcd01' | passwd --stdin hacluster	# 비밀번호 abcd01으로 설정


2. pcsd 서비스 Start

systemctl enable pcsd
systemctl start pcsd
systemctl status pcsd


3. pcs cluster 사용자 인증

pcs cluster auth cluster-node01 cluster-node02 cluster-node01-hb cluster-node02-hb -u hacluster -p abcd01


4. pcs cluster 구성 (※ Primary Node 에서만 실행)

pcs cluster setup --name pg_cl cluster-node01,cluster-node01-hb 
cluster-node02,cluster-node02-hb --force
  • /etc/corosync/corosync.conf 파일 확인


5. pcs cluster start (※ Primary Node 에서만 실행)

pcs cluster start --all


6. pcs property 설정 (※ Primary Node 에서만 실행)

pcs property set default-resource-stickiness=100
pcs property set stonith-enabled=false
  • resource-stickiness : the measure of how much a resource wants to stay where it is
  • stonith-enabled: fencing 기능 사용 여부


6. PostgreSQL 설치

1. DB 엔진 설치

  • https://www.enterprisedb.com/download-postgresql-binaries 사이트에서 binary 파일 다운로드
tar -zxvf postgresql-9.6.14-2-linux-x64-binaries.tar.gz -C /PG/PGDATABASE


2. InitDB 실행 (※ Primary Node 에서만 실행)

  • DB user로 실행
initdb --pgdata=/data/PGDATABASE/data/pg --xlogdir=/data/PGDATABASE/pg_xlog 
--encoding='UTF8' --locale='C' --username='pgsys'


3. PostgreSQL START (DB USER로 실행)

pg_ctl start


4. PostgreSQL 기본 Setting (DB USER로 실행)

psql -d postgres

# pgsys 비밀번호 지정
alter user pgsys password 'password001!';

# USER 생성
CREATE USER pgadmin WITH SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN PASSWORD 'password001!';

# Tablespace 생성
create tablespace TBS01 OWNER "pgadmin" location '/data/PGDATABASE/TS01';

exit로 bash로 나간 후
# Database 생성
createdb -p 5432 -D tbs01 PGDATABASE -O pgadmin


7. Postgresql Stop 및 DRBD Down

1. Postgresql Stop (※ Primary Node 에서만 실행)

su - pgadmin -c 'pg_ctl stop -mf'


2. Data영역 Umount (※ Primary Node 에서만 실행)

umount /data


3. DRBD secondary (※ Primary Node 에서만 실행)

drbdadm secondary drbd_res01


4. DRBD Down

drbdadm down drbd_res01


8. Pacemaker Resource 구성

1. PostgreSQL Resource Agent 수정 (/usr/lib/ocf/resource.d/heartbeat/pgsql)

OCF_RESKEY_pgctl_default=/PG/PGDATABASE/pgsql/bin/pg_ctl
OCF_RESKEY_psql_default=/PG/PGDATABASE/pgsql/bin/psql
OCF_RESKEY_pgdata_default=/data/PGDATABASE/data/pg
OCF_RESKEY_pgdba_default=pgadmin
OCF_RESKEY_pghost_default=""
OCF_RESKEY_pgport_default=5432
OCF_RESKEY_start_opt_default=""
OCF_RESKEY_pgdb_default=template1
OCF_RESKEY_logfile_default=/dev/null
OCF_RESKEY_stop_escalate_default=30
OCF_RESKEY_monitor_user_default=pgsys
OCF_RESKEY_monitor_password_default=password001!
OCF_RESKEY_monitor_sql_default="select now();"
OCF_RESKEY_check_wal_receiver_default="false"
  • PostgreSQL Resource Agent 설정에 자신에게 맞는 정보 설정


2. Pacemaker Resource 등록 (※ Primary Node 에서만 실행)

pcs cluster cib pcs_conf
pcs -f pcs_conf resource create VIP ocf:heartbeat:IPaddr2 ip=10.1.1.13 cidr_netmask=32 op monitor interval="5" timeout="10"
pcs -f pcs_conf resource create drbd_res ocf:linbit:drbd drbd_resource=drbd_res01 op monitor timeout="30" interval="5" role="Master" op monitor timeout="30" interval="6" role="Slave"
pcs -f pcs_conf resource master DataSync drbd_res master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
pcs -f pcs_conf resource create Filesystem ocf:heartbeat:Filesystem device="/dev/drbd0" directory="/data" fstype="xfs" options="noatime"
pcs -f pcs_conf resource create DB ocf:heartbeat:pgsql op monitor timeout="20" interval="5"
pcs -f pcs_conf resource group add HA-GROUP VIP Filesystem DB
pcs -f pcs_conf constraint colocation add HA-GROUP DataSync INFINITY with-rsc-role=Master
pcs -f pcs_conf constraint order promote DataSync then start Filesystem
pcs cluster cib-push pcs_conf
  • CIB(Cluster Information Base) 라는 Raw xml에 설정을 저장 후 업데이트하는 방식
  • VIP, DRBD, Filesystem,DB 리소스를 추가
  • DRBD에 대해선 Datasync라는 이름으로 Master/Slave 구성
  • VIP, Filesystem,DB에 대해서는 HA-Group으로 구성
  • HA-Group과 Datasync 그룹은 항상 같은 위치에 위치하도록 설정
  • DRBD 구성이 완료 후 FileSystem이 구성되도록 설정


3. Pacemaker 실행 (※ Primary Node 에서만 실행)

pcs cluster start --all


4. Pacemaker 상태 확인 및 로그 확인

pcs cluster status
  • 로그 확인
    • /var/log/cluster/corosync.log
    • var/log/pcsd/pcsd.log
    • /var/log/pacemaker.log