설치 환경
운영체제 : centos 7 3-10.0-1127.13.1.el7.x86_64
DB 버전 : 11.9
구성도
설치 방법
특이사항
- replication 설정 후 시작, replication 설정은 https://peryh.tistory.com/8?category=871555 참조
- pgpool을 두가지 방식으로 사용하는 방법을 기술(pgpool이 load balance만 하는 경우, pgpool이 replication을 담당하는 경우)
- postgres 기본 경로 변경(/var/lib/pgsql/11/data -> /pgsql/11/data)하여 수행, 변경하지 않는 경우 scp로 파일을 생성할 때, root의 권한이 있는 디렉터리에 생성되지 않음, 설정은 peryh.tistory.com/7?category=871555 참조
master 쪽 설정
Pgpool-II 설치
yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-release-4.0-1.noarch.rpm
yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-4.0.1-1pgdg.rhel7.x86_64.rpm
yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-debuginfo-4.0.1-1pgdg.rhel7.x86_64.rpm
yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-devel-4.0.1-1pgdg.rhel7.x86_64.rpm
yum -y install http://www.pgpool.net/yum/rpms/4.0/redhat/rhel-7-x86_64/pgpool-II-pg11-extensions-4.0.1-1pgdg.rhel7.x86_64.rpm
확인
#rpm -qa | grep pgpool
pgpool-II-release-4.0-1.noarch
pgpool-II-pg11-debuginfo-4.0.1-1pgdg.rhel7.x86_64
pgpool-II-pg11-extensions-4.0.1-1pgdg.rhel7.x86_64
pgpool-II-pg11-4.0.1-1pgdg.rhel7.x86_64
pgpool-II-pg11-devel-4.0.1-1pgdg.rhel7.x86_64
pgpool디렉터리 생성(로그 보기 위한 디렉터리)
mkdir -p /var/log/pgpool
Step 2. pgpool 설정을 한다.
pgpool.conf 복사 및 수정
어떻게 작동시킬 것인가에 따라 필요한 conf 파일을 복사해서 사용한다
스트리밍 복제모드(Streaming replication mode) : stream PostgreSQL이 데이터베이스를 동기화하고 Pgpool은 Load Balancing을 담당
논리 복제모드(logical replication mode) : logical PostgreSQL이 테이블 동기화를 담당하며 Pgpool은 Load Balancing을 담당
마스터 슬레이브 모드(master slave mode(slony mode)) : master-slavePgpool이 데이터베이스 동기화와 Load Balancing을 담당
네이티브 복제모드(native replication mode) : replication동기식으로 동기화를 수행
원시 모드(raw mode) : sample
설명 문서 : https://www.pgpool.net/docs/latest/en/html/configuring-pgpool.html
#cd /etc/pgpool-II
#rm -rf pgpool.conf
#cp pgpool.conf.sample-stream pgpool.conf
#chmod 764 pgpool.conf
#vi /etc/pgpool-II/pgpool.conf
---------------------------------------------------------------------
# pgpool 외부 접근정보
# 외부 접속 정보
# '*' for all, '' for no TCP/IP connections
listen_addresses = '*'
port = 9999
#------------------------------------------------------------------------------
# - Backend Connection Settings -
#------------------------------------------------------------------------------
# backend_hostname : Pgpool이 서버에 접속할 때 사용할 hostname 또는 IP
# backend_port : 포트번호
# backend_weight : 백엔드의 Load balancing 비율
# backend_data_directory : 백엔드의 데이터베이스 클러스터 디렉터리
# backend_flag : 백엔드 동작을 제어
# 백엔드를 여러 개 사용할 경우 매개변수 이름 끝에 숫자(DB node ID)를 추가한다.
# 0은 서버를 하나만 사용한다. 숫자가 가장 낮은 DB noid ID가 마스터 노드가 된다.
backend_hostname0 = '10.178.0.1' => 1번 OS ip
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/pgsql/11/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '10.178.0.2' => 2번 OS ip
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/pgsql/11/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------
#클라이언트 인증을 위해 pool_hba.conf를 참조, 기본값은 false
#서버 수가 둘 이상인 경우 postgresql에서 정의한 인증방법이 trust이면 off로 설정 가능
enable_pool_hba = off
# 로그 파일 저장 위치 지정
logdir = '/var/log/pgpool'
#------------------------------------------------------------------------------
# REPLICATION MODE
#------------------------------------------------------------------------------
# replication 모드 활성화/비활성화
replication_mode = off
replicate_select = off
insert_lock = off
#------------------------------------------------------------------------------
# - Degenerate handling -
#------------------------------------------------------------------------------
# 데이터 정합성 검사
# insert나 update, delete시에 반영되는 로우가 다를시 쿼리실행이 중지됨
replication_stop_on_mismatch = off (1/5 현재 on상태)
#------------------------------------------------------------------------------
# LOAD BALANCING MODE
#------------------------------------------------------------------------------
#pgpool의 load_balance 기능, 위에서 설정한 backend host에 맘대로 왔다갔다하여 붙음
#확인 방법은 $psql -h <pgpool 설치된곳 ip> -p 9999 -U <유저=롤> 이후 select inet_server_addr();
load_balance_mode = on
#------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------
# Streaming Replication
# 마스터 / 슬레이브 모드 확성화/비활성화
# replication_mode 와 함께 사용할 수 없다. 둘 중 하나만 활성화해서 사용.
//master_slave_mode = off 설정을 off로 하면 pgpool에서 자체적으로 replication을 함
master_slave_mode = on
master_slave_sub_mode = ‘stream’
#------------------------------------------------------------------------------
# - Streaming -
#------------------------------------------------------------------------------
# Streaming Replication 방식을 사용할 경우 설정
# sr_check_user 설정을 정확히 안하면 primary node 를 찾지 못함(DB 유저 postgres의 계정, 비밀번호, DB정보)
sr_check_period = 10
sr_check_user = 'postgres'
sr_check_password = 'psql'
sr_check_database = 'postgres'
delay_threshold = 0
#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------
# 기본 노드를 찾는 시간
search_primary_node_timeout = 10
---------------------------------------------------------------------
pgpool에서 master, slave 서버에 접근할 수 있도록 설정한다.
vi /etc/pgpool-II/pool_hba.conf
---------------------------------------------------------------------
host all all 10.178.0.0/24 trust
---------------------------------------------------------------------
pgpool을 기동한다.
# pgpool -f /etc/pgpool-II/pgpool.conf -n -D -d > /var/log/pgpool/pgpool.log 2>&1 &
여기서 에러가 나면
https://qastack.kr/ubuntu/50621/cannot-connect-to-postgresql-on-port-5432
오류 메시지는 유닉스 도메인 소켓을 참조하므로 netstat제외하지 않으려면 호출을 조정해야 합니다.
옵션없이 시도하십시오
netstat -nlp | grep 5432
클라이언트가 연결하려고하는 /tmp/.s.PGSQL.5432것이 아니라 서버가 실제로 소켓에서 수신 대기 하고 /var/run/postgresql/.s.PGSQL.5432있다고 생각합니다. 이것은 유닉스 도메인 소켓 디렉토리의 소스 기본값 /tmp이 데비안 패키징에서로 변경 되기 때문에 데비안 또는 우분투에서 수동 컴파일 또는 타사 PostgreSQL 패키지를 사용할 때 발생하는 일반적인 문제 /var/run/postgresql입니다.
가능한 해결 방법 :
타사 패키지에서 제공 한 클라이언트를 사용하십시오 (call /opt/djangostack-1.3-0/postgresql/bin/psql). 우분투 제공 패키지를 모두 제거 할 수 있습니다 (다른 역 종속성으로 인해 어려울 수 있음).
타사 패키지의 소켓 디렉토리가 Debian / Ubuntu와 호환되도록 수정하십시오.
-H localhost대신 TCP / IP를 통해 연결하는 데 사용하십시오 .
올바른 디렉토리를 가리 키려면 -h /tmp이와 동등한 PGHOST설정을 사용하십시오 .
타사 패키지를 사용하지 마십시오.
vi /var/lib/pgsql/11/data/postgresql.conf의 unix_socket_directories = '/var/run/postgresql, /tmp' 주석 해제 후
pid관련 파일 삭제 후 재부팅하여 해결하였음
pgpool 관련 에러 발생 시, pg_hba.conf 파일 수정
[postgres@policyserver1 ~]$ psql -h localhost -p 9999 -U postgres
psql: ERROR: unable to read message kind
DETAIL: kind does not match between master(45) slot[1] (52)
---------------
pgpool 정지
#pgpool stop
-pgpool 기동하고 접속
$psql -h 10.178.0.1 -p 9999 -U postgres
# master, slave 노드정보 확인
postgres=# \x
postgres=# show pool_nodes;
# 현재 접속된 노드 확인
# 로드밸런싱 설정을 해놔서 master, slave 왔다갔다 하면서 붙음(안바뀜)
select inet_server_addr();
Step 3. failover 설정
failover시, master 서버가 slave 서버한테 failover trigger 파일을 전송한다. 이 때 비밀번호 없이 전송하기 위해 ssh key 복사를 해준다.
master 노드 (postgres 계정으로 진행)
ssh-keygen -C postgres@10.178.0.1
엔터- 엔터- 엔터
ssh-copy-id postgres@10.178.0.2 <=이 IP는 상대 IP 넣기
slave 노드 (postgres 계정으로 진행)
ssh-keygen -C 10.178.0.2로 생성
엔터 3번
클라우드 환경이라면 cd .ssh
내부의 id_rsa.pub 파일 내용을 메타데이터의 ssh키에 저장
ssh-copy-id postgres@10.178.0.1
정상 동작 확인(master에서)
ssh -T postgres@10.178.0.2 touch /home/postgres/testfile.txt
해당 위치에 파일 생성된 것 확인
failover_command 설정, pgpool은 master의 장애를 감지하면 failover_command를 수행한다.(master에서 수행)
#vi /etc/pgpool-II/pgpool.conf
-------------------------------------------------------------------------------
failover_command = '/usr/pgsql-11/share/failover.sh %d %H /pgsql/11/data/failover_trigger'
health check 설정 : 자동으로 failover기능이 활성화 되도록 설정
health_check_period = 0 --> 15
health_check_timeout= 20 --> 10
health_check_max_retries = 0 --> 3
health_check_retry_delay = 1
health_check_user = 'postgres'
-------------------------------------------------------------------------------
# failover 스크립트 작성
master 서버에 장애가 생기면 slave 서버에게 trigger 파일을 전송
slave에 trigger 파일이 있으면 master로 전환, trigger 파일 경로는 slave의 /var/lib/pgsql/11/data/recovery.conf 에도 설정(master에서 설정)
$ cd /usr/pgsql-11/share
$ vi failover.sh
-------------------------------------------------------------------------------
if [ $# -ne 3 ]
then
echo "failover failed_node new_master trigger_file"
exit 1
fi
FAILED_NODE=$1
NEW_MASTER=$2
TRIGGER_FILE=$3
# Do nothing if standby server goes down
if [$FAILED_NODE = 1]; then
echo "Standby Server is downed\n" >> /var/log/pgpool/failover.log
exit 0
fi
echo "failover.sh FAILED_NODE:${FAILED_NODE}; NEW_MASTER:${NEW_MASTER}; at $(date)\n" >> /var/log/pgpool/failover.log
sudo -u postgres ssh -T postgres@$NEW_MASTER touch $TRIGGER_FILE
exit 0
-------------------------------------------------------------------------------
# failover.sh 권한 변경
$ chmod 775 /usr/pgsql-1/share/failover.sh
pgpool을 재시작
pgpool stop
pgpool -f /etc/pgpool-II/pgpool.conf -n -D -d > /var/log/pgpool/pgpool.log 2>&1 &
master 쪽 stop
$pg_ctl -D /pgsql/11/data/ stop
slave쪽에서 접속하여 확인
$psql -h 10.178.0.2 -p 9999 -U postgres
postgres=# show pool_nodes;
<참고>일반적인 수동 active 전환 방법
$pg_ctl promote -D /var/lib/pgsql/11/data
failover 후 추가작업(new master가 살아있어야 함, pgpool있는 곳에서 작업)
failover 후 old master를 올려도 자동으로 slave 로 추가되는 기능은 제공되지 않기 때문에 아래와 같은 과정을 수동으로 진행
old master 서버가 failover 되어 new master 가 된 상황 1번 서버를 올려도 자동으로 slave로 추가되지 않으며
pgpool은 이 서버를 인식하지 못함
10.178.0.2(new master)쪽 설정(최초에 설정했으면 수정할 필요 없음)
vi /pgsql/11/data/pg_hba.conf
host replication all 0.0.0.0/0 md5
추가
이후 재기동
$pg_ctl -D /pgsql/11/data start
10.178.0.1(old master)에서 진행
$ cd /pgsql/11
$ mv data data_old
$pg_ctl -D /pgsql/11/data stop
Standby Server의 Data 폴더를 보면 이전에 recovery.conf로 만들어 놓은 파일이 recovery.done으로 변경되어 있는 것을 확인할 수 있음, 새로 master가 된 2번기의 데이터 파일 가져오기
$ pg_basebackup -h 10.178.0.2 -D /pgsql/11/data -U repl -v -P -X stream
recovery.done을 .conf로 바꾸고 host ip도 변경
$cd /pgsql/11/data
$mv recovery.done recovery.conf
vi recovery.conf
---------------------------------------------------------------------
standby_mode='on'
# master 노드의 정보를 적는다.
primary_conninfo='host=10.178.0.2 port=5432 user=repl password=repl'
# slave노드에 trigger file이 있으면, slave가 master로 전환된다.
trigger_file='/var/lib/pgsql/11/data/failover_trigger'
---------------------------------------------------------------------
old master up
$ cd /usr/pgsql-11/bin/
$./pg_ctl -D /var/lib/pgsql/11/data/ start
pgpool node로 추가(pgpool에서 up으로 인식되어지는 작업)
# echo "postgres:$(pg_md5 --username=postgres postgres)" >> /etc/pgpool-II/pcp.conf
이거 때문에 password 지정해야 함
$ pcp_attach_node -n 0
Password : postgres (echo에서 설정한 비밀번호 입력해야 함)
new master가 죽었을 경우 slave를 pgpool에 붙여주기 위해서는
pgpool 재기동이 필요
'데이터베이스 > postgres' 카테고리의 다른 글
Postgresql 11 replication (0) | 2021.03.15 |
---|---|
Postgres 기본 경로 변경 (0) | 2021.03.15 |
Postgres 설치 및 사용 방법 (0) | 2021.01.14 |