본문 바로가기

IT/DB

[postgresql] pgpool II 설치 (Master Master + replication)

[postgresql] pgpool II 설치 (Master Master + replication)

# OS : Redhat 5.5 (vmware사용)

# postgresql ver. 8.4.13

# pgpool ver.3.1.5

 

#1. 테스트 개요

-- Posgresql서버 두대의 이중화 구성을 위하여 Pgpool II를 이용하여 Master Master + replication 모드 동작하는지 테스트를 해보자.

 

#2. 네트워크 구성

--  서비스는 Master Master + replication이지만 실제 테스트 VIP를 이용하여 Master/slave 형태로 동작하도록 할 것이다. 

-- VIP

192.168.10.150

-- wisdb1 (Master1)
192.168.10.151

-- wisdb2 (Master2)
192.168.10.152

 

#3. Postgresql

#3.1 posgresql 설치

서버 2대 각각 설치를 한다. rpm으로 설치하였고 설치방법은 생략한다.

#3.2 pg_config 명령어를 실행했을때 정보들이 다음과 같이 나왔다. 참조

[root@wisdb1 server]# pg_config
BINDIR = /usr/bin
DOCDIR = /usr/share/doc/pgsql
HTMLDIR = /usr/share/doc/pgsql
INCLUDEDIR = /usr/include
PKGINCLUDEDIR = /usr/include/pgsql
INCLUDEDIR-SERVER = /usr/include/pgsql/server
LIBDIR = /usr/lib64
PKGLIBDIR = /usr/lib64/pgsql
LOCALEDIR = /usr/share/locale
MANDIR = /usr/share/man
SHAREDIR = /usr/share/pgsql
SYSCONFDIR = /etc/sysconfig/pgsql
PGXS = /usr/lib64/pgsql/pgxs/src/makefiles/pgxs.mk
CONFIGURE = '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-

------- 생략 ----------

CC = gcc
CPPFLAGS = -I/usr/include/et -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include
CFLAGS = -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -I/usr/include/et -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv
CFLAGS_SL = -fpic
LDFLAGS = -L/usr/lib64
LDFLAGS_SL =
LIBS = -lpgport -lxslt -lxml2 -lpam -lssl -lcrypto -lgssapi_krb5 -lz -lreadline -ltermcap -lcrypt -ldl -lm
VERSION = PostgreSQL 8.4.13

#3. yum 설치

yum install postgresql postgresql-server postgresql-devel

postgresql 설치
 $ ./configure --prefix=[somepath]
 $ make
 $ make install
 $ cd doc; make ;make install

 pgpool 설치
 $ ./configure --prefix=[sompath] --with-pgsql=[pgsql install path]
 $ make
 $ make install

 

#4. pgpool II 설치(Replication mode로 설치)

* 참조 : http://www.pgpool.net/  (설명이 부실하고 업데이트된 대한 내용이 없으니 맹신하지 말것)

#4.1 파일 다운로드 , 빌드하기 (ROOT로 설치했음)

-- configure시 옵션은 pgpool.net을 참조, (옵션 안주었음)

[root@wisdb1 pgpool]# wget http://www.pgpool.net/download.php?f=pgpool-II-3.2.1.tar.gz
[root@wisdb1 pgpool]# tar -xvzf pgpool-II-3.1.5.tar.gz
[root@wisdb1 pgpool]# cd pgpool-II-3.1.5
[root@wisdb1 pgpool-II-3.2.1]# ./configure
[root@wisdb1 pgpool-II-3.2.1]# make
[root@wisdb1 pgpool-II-3.2.1]# make install
[root@wisdb1 pgpool-II-3.2.1]#

#4.2 관련 함수 설치하기 (pgpool-recovery  , pgpool-regclass 두개만 설치했음)

-- 설치 파일 위치는 임의로 정했음

-- make에러 날때는

-- Makefile을 수정할것

PGXS = $(shell pg_config --pgxs)
PG_CONFIG=/usr/bin/pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

-- 위와 같이 수정하면 된다고 찾았음 (전 안했음)

[root@wisdb1 sql]# cd /data/pgdata/pgpool/pgpool-II-3.1.5/sql
[root@wisdb1 sql]# ls
insert_lock.sql  Makefile  pgpool-recovery  pgpool-regclass  pgpool-walrecrunning  system_db.sql

createdb pgpool -U postgres -d pgpool

psql -f system_db.sql -d pgpool 

[root@wisdb1 pgpool-recovery]# ls
Makefile           pgpool-recovery.so   pgpool-recovery.sql.in
pgpool-recovery.c  pgpool-recovery.sql  uninstall_pgpool-recovery.sql

[root@wisdb1 pgpool-recovery]# make && make install
[root@wisdb1 pgpool-recovery]# psql -f pgpool-recovery.sql -U postgres -d postgres

[root@wisdb1 pgpool-recovery]# psql -f pgpool-recovery.sql -d postgres

[root@wisdb1 pgpool-recovery]# psql -f pgpool-recovery.sql -d template

[root@wisdb1 pgpool-recovery]# psql -f pgpool-recovery.sql -d OpenWIS
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION

[root@wisdb1 pgpool-recovery]# cd /data/pgdata/pgpool/pgpool-II-3.1.5/sql/pgpool-regclass
[root@wisdb1 pgpool-regclass]# make && make install
[root@wisdb1 pgpool-regclass]# psql -f pgpool-regclass.sql -U postgres -d postgres

[root@wisdb1 pgpool-regclass]# psql -f pgpool-regclass.sql -d postgres

[root@wisdb1 pgpool-regclass]# psql -f pgpool-regclass.sql -d template

[root@wisdb1 pgpool-regclass]# psql -f pgpool-regclass.sql -d OpenWIS
CREATE FUNCTION
-- walrecrunning는 실패!! 버전이 올라가면 안쓰는듯 빌드시 에러남 확인 필요-
[root@wisdb1 pgpool-regclass]# cd /data/pgdata/pgpool/pgpool-II-3.1.5/sql/pgpool-walrecrunning
[root@wisdb1 pgpool-walrecrunning]# make && make install
[root@wisdb1 pgpool-walrecrunning]# psql -f pgpool-walrecrunning.sql -U postgres -d postgres

-- walrecrunning 안됨 --

#4.3 pgpool config 파일 설정 (가장 중요, 디폴트 위치에 깔았음)

-- 설정에 따라서 모드를 변경할 수 있다. 인증 설정은 반드시 postgresql과 맞춰줘야 remote에서 pgpool이 에러없이 잘 됨. pgpool 접속 에러 메세지를 보고 원인찾기는 절대 쉽지 않음!! 심지어 엉뚱함.

-- redhat5.5에 설치시 pgpool설정 파일의 기본 위치는 /usr/local/etc 임

-- 설정 바꾸기 전에 샘플파일 복사해 둘것

[root@wisdb1 pgpool-walrecrunning]# cd /usr/local/etc

[root@wisdb1 etc]# ls
pcp.conf.sample  pgpool.conf.sample  pgpool.conf.sample-master-slave  pgpool.conf.sample-replication  pgpool.conf.sample-stream  pool_hba.conf.sample
[root@wisdb1 etc]# cp pcp.conf.sample pcp.conf
[root@wisdb1 etc]# cp pool_hba.conf.sample pool_hba.conf
[root@wisdb1 etc]# cp pgpool.conf.sample-replication pgpool.conf

#4.3.1 pcp.conf 설정 (난 안했음)

-- md5로 인증 안했기 때문에 참고로만 적어둠

[root@wisdb1 etc]# pg_md5 postgres
2fcd6b82583~~ 생략~

-- 다음에서 추가하기
[root@wisdb1 etc]# vi pcp.conf
# Example:
postgres:2fcd6b82583~~생략 ~ 

#4.3.2  pool_hba.conf 설정

## postgres계정으로

$ pg_md5 -m -p postgres

pool_passwd가 생성

 

-- postgresql 설정과 맞춰 줄것 안그럼 remote에서 접속시 이상한 에러남..  pg_hba.conf랑 맞춰볼것

[root@wisdb1 etc]# vi pool_hba.conf

# "local" is for Unix domain socket connections only
local   all         all                                   trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
host    all         all         192.168.10.10/32      trust
host    all         all         192.168.10.151/32       trust
host    all         all         192.168.10.152/32     trust

#4.3.3  pgpool.conf 설정

-- mod변경이나 여러가지 설정이 여기 전부 들어가 있음

listen_addresses = '*'
 
port = 9999 ## pgpool 이 사용하는 포트이다. ( app 단에서 db 접속시에는 꼭 9999 포트로 접속하여야 한다. 5432 포트로 접속하여 A서버의 Data만 변경할 경우 data sync 에 문제가 발생한다. )
 
pcp_port = 9898 ## online recovery 시 사용하는 포트이다.
 
num_init_children = 32  ## ( num_init_children x max_pool  의 값이 동시 접속 유저가 된다. ) number of pre-forked child process
max_pool = 4  # Number of connection pools allowed for a child process

backend_hostname0 = 'host1'          # Host name or IP address to connect to for backend 0
backend_port0 = 5432                      # Port number for backend 0      
backend_weight0 = 1                       # Weight for backend 0 (only in load balancing mode)
backend_data_directory0 = '/data/pgdata/data'     # Data directory for backend 0
backend_flag0 = 'ALLOW_TO_FAILOVER'       # Controls various backend behavior

                                                                # ALLOW_TO_FAILOVER or DISALLOW_TO_FAILOVER
backend_hostname1 = 'host2'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pgdata/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = off ## pool_hba.conf 파일을 사용한 인증을 하겠다는 의미이다.

pid_file_name = '/var/run/pgpool/pgpool.pid'             # 폴더가 없음 에러남 폴더 존재 유무 확인
replication_mode = off
load_balance_mode = off

connection_cache = on

enable_query_cache = on   ### true 설정시 systemDB 설치해야하며, 수행된 쿼리는 테이블 object에 저장된다. 

health_check_user = 'postgres'  # Health check user

# system DB info
system_db_hostname = 'host1' ##  A서버의 IP를 적어준다.
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'postgres'
system_db_password = '

 
# - online recovery -
recovery_user = 'postgres'  # online recovery user
recovery_password = ''  # 공백으로 둔다. online recovery password
recovery_1st_stage_command = 'copy_base_backup'     # online recovery 시 사용하는 첫번째 쉘 파일명이다. 경로는 postgresql data 경로에 둔다.
recovery_2nd_stage_command = 'pgpool_recovery_pitr'  # online recovery 시 사용하는 두번째 쉘 파일명이다. 경로는 postgresql data 경로에 둔다.

recovery_timeout = 20

 

 

#system_db 만들기

-bash-3.2$ createdb pgpool
-bash-3.2$ psql
psql (8.4.13)
Type "help" for help.

postgres=# grant create on database "pgpool" to postgres;
GRANT
postgres=# grant util_gis to postgres;
GRANT ROLE
postgres=# \q

-bash-3.2$ psql pgpool postgres

-bash-3.2$ pwd
/data/pgdata/pgpool/pgpool-II-3.1.5/sql
-bash-3.2$ ll
total 40
-rw-rw-r-- 1 postgres postgres   413 Oct 12 15:05 Makefile
-rw-rw-r-- 1 postgres postgres  2664 Oct 12 15:05 pgpool_adm--1.0.sql
-rw-rw-r-- 1 postgres postgres 13336 Oct 12 15:05 pgpool_adm.c
-rw-rw-r-- 1 postgres postgres   146 Oct 12 15:05 pgpool_adm.control
-rw-rw-r-- 1 postgres postgres  1181 Oct 12 15:05 pgpool_adm.h
-rw-rw-r-- 1 postgres postgres  2662 Oct 12 15:05 pgpool_adm.sql.in
-rw-rw-r-- 1 postgres postgres   128 Oct 12 15:05 TODO
-bash-3.2$ psql -f system_db.sql  -U postgres pgpool

 

 

 

#5. pgpool 동작 시키지

#5.1 postgresql 서비스 올리기 (서버 2대)

#5.2 pgpool  실행

[root@wisdb1 etc]# pgpool -n -d                               # 디버깅 로깅 * 주의 stop시 다른 창에서 stop할것!!

[root@wisdb1 etc]# pgpool                                       # 일반

#5.3 pgpool 종료

[root@wisdb1 etc]# pgpool stop                                # 정상적으로 종료 할 것

[root@wisdb1 etc]# pgpool -m s stop                         # 상황에 맞게 종료

[root@wisdb1 etc]# pgpool -m i stop                          # 즉시 종료  

 

설치폴더 redhat에 pgpool.init 복사해 /etc/init.d/에 넣기

몇가지 수정할 것

service pgpool start 하면 됨 

 

#5.4 접속확인 (이것으로 안해 봤음)

-- 상태확인

[root@wisdb1 etc]# psql -U postgres -p 9999 -c 'show pool_status'

 

[postgres@wisdb1 etc]# psql -p 9999 -d postgres -U postgres

[postgres@wisdb1 etc]$ createdb -p 9999 bench_replication
[postgrest@wisdb1 etc]$ pgbench -i -p 9999 bench_replication
[postgres@wisdb1 etc]$ psql -p 5432 -d bench_replication -U postgres #node1 확인

[postgres@wisdb1 etc]$ psql -p 5432 -d bench_replication -U postgres #node2 확인

 

#6.WATCHDOG 설정

#6.1 pgpool.conf 설정

use_watchdog = on                  #  활성화
                                    # Activates watchdog
trusted_servers = ''
                                    # trusted server list which are used
                                    # to confirm network connection
                                    # (hostA,hostB,hostC,...)
delegate_IP = 'XXX.XXX.XXX.XXX'     # vitual IP
                                   
wd_hostname = 'XXX.XXX.XXX.XXX'  # 이 노드의 IP
 
wd_port = 9000               # 이 노드에서 watchdog를 사용할 포트
 
wd_interval = 10
                                    # lifecheck 주기 (*1)
ping_path = '/sbin'
                                    # ping command path
ifconfig_path = '/sbin'
                                    # ifconfig command path
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
                                    # startup delegate IP command
if_down_cmd = 'ifconfig eth0:0 down'
                                    #  shutdown delegate IP command
 
arping_path = '/usr/sbin'           # arping command path
 
arping_cmd = 'arping -U $_IP_$ -w 1'
                                    # arping command
wd_life_point = 3
                                    # lifecheck 재시도 횟수
wd_lifecheck_query = 'SELECT 1'
                                    # life체크를 위해 pgpool로 요청하는 쿼리
# Other pgpool Connection Settings
 
other_pgpool_hostname0 = 'XXX.XXX.XXX.XXX'
                                    # 상대편 pgpool IP 또는 hostname
other_pgpool_port0 = 9999
                                     # 상대편 pgpool port
other_wd_port0 = 9000
                                   # 상대편 watchdog port

 

#10. pgpool 테스트 결과

-- test 툴 SQL Manager 2007이란 postgresql툴을 사용하여 접속하였음

접속 정보는  pgpool을 9999포트로 잡아두어서 포트만 변경하고 접속했음 posgresql이랑 접속정보는 동일함

-- port만 9999로 접속

#10.1 pgpool이 깔려있는 db를 db1이라고하고 다른 하나의 노드를 db2라 할때 db2의 postgresql서비스 내림

-- 결과 : failover - db2가 죽은거랑 관계없이 정상 동작함

#10.2 db2의 postgresql서비스 내리고 다시 올림

-- 결과 : db2가 살아나도 pgpool은 모름 replication안함

#10.3 pgpool을 2개 노드에서 다 돌렸을때

-- 결과 : replication안함

 

'IT > DB' 카테고리의 다른 글

[MySQL SQL] 해당 날짜의 요일 출력  (0) 2015.07.27
[MySQL SQL] IP매칭 SQL 예제  (0) 2015.07.27
[postgresql] postgresql HA정리  (0) 2015.07.27
[IBM DB2] DB2 명령어  (0) 2015.07.27
[IBM DB2] DB2 정리  (0) 2015.07.27