# 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 |