제목 없음
홈페이지 : http://www.openphp.com
, http://www.openpython.com
안녕 하세요? 조성준 입니다.
작년말에 쓸쓸해서 정리하던 강좌고 오늘 올리면서 몇군데 고쳤습니다. 신버전이 나와서리 ^^
* 본문서는 본인이 이해하고 스스로 독학으로 인해 오역과 오탈등이 많습니다 ^^ 잘못된 부분은 지적을 부탁드립니다. *
* 작성을 작년
pgpool 설치가 완료되고 나서 설정파일과 몇가지 기동 방법에 대해 설명 하겠습니다.
pgpoll을 설치하고나면 설치 폴더에는 bin과 etc만이 존재합니다. 내부 파일들의 용도는 다음과 같습니다.
- pgpool 설치 디렉토리의 파일 용도 -
bin/pgpool : pgpool 메인 파일
etc/pgpool.conf.sample : pgpool 설정 파일
-.-역시나 단촐하죠.!!
- pgpoll 설정준비 -
먼저 etc의 pgpool.conf.sample을 cp pgpool.conf.sample pgpool.conf로 복사를 해줍니다.
mv나 rename을 쓰서도 되지만 default setting 파일을 그냥 두시는게 나중에 돌려 놓을 때 필요하니 cp로 카피하시는게
안정하실듯 싶습니다.
자주 쓰시는 Editor로 pgpool.conf를 열어 아래의 설명에 따라 자신의 상황에 따라 설정 하십시요.(* 명훈님은 죽어도 pico ^^~ ,,)
- pgpool 설정 -
listen_addresses
서버의 Listening Address를 정하는 것입니다. localhost로 정하면 동일 서버에서만 접속이 가능하며,
해당 서버의 IP를 잡아 주면 외부에서 해당 IP가 잡힌 Interface(랜카드 ^^)로 들어 오게 되구요. * 를 하시면
해당 서버의 랜 카드를 통해 접속이 가능해 집니다. localhost로 주여도 되고 그냥 '' 로 설정해도 알아서 locahost로 잡습니다.
listen_addresses="localhost"
pgpool옛버전의 경우는 inet 방식으로의 동작도 지원했었지만 현재 2.4는 지원이 않되므로, 기존옵션이 빠진게
allow_inet_domain_socket 옵션이 있지만 동일하게 지원을 해줍니다.
allow_inet_domain_socket=1 은 * 로 둔것과 같과 0은 locahost와 같은 설정으로 취급합니다.
port
pgpool을 접속을 위한 port 설정으로 9999 포트가 기본입니다. 원할경우 변경이 가능하며,.
저로써는 기본 포트사용을 왠만하면 변경을 추천드립니다. 웹서버용 HTTP Port인 80같이 반드시
해주어야만 하는게 아니라면 포트 변경을 하는게 크래커들의 피해로 부터 쬐금은 보호가 될듯.
PostgreSQL은 5432 포트이고 MySQL은 3306입니다. 기타 다른 서비스 Port와 출돌않나에 잘 선택하시구요
되도록이면 0~1024 Port내는 중요 서비스이니 그외 포트로 잡으시고 65535 까지 저징이 가능하면
4만 5만 번 포트를 이용하시는게 좋을듯 싶네요. ^^
port=9999
socket_dir
pgpool에서는 UDS(Unix Domain Socket)을 지원하므로 해당 Socket 파일위치를 정해줄수있고
그 UDS파일로 통신도 당연 가능합니다 디폴트는 /tmp이지만 원하시면 변경가능.
저역시 기본을 이상하게 변경하길 좋아라해서. pgpool 디렉테 tmp를 만들어 넣어 주었습니다
socket_dir="/tmp"
backend_host_name
PostgreSQL의 디비서버가 유동IP이거나 DNS의 Round Robine을 이용하여 서버의 IP를 로드 밸런스를 하거나 등등의 사유로
고정 IP를 두지않고 Domain을 통해 둘경우./etc/hosts 파일을 통해 Name to IP Addr.로 서비스를 원할경우
PostgreSQL을 찾아 해매기위한 이름을 따로 지정할수 있습니다.
backend_host_name=''
backend_port
PostgreSQL의 포트가 5432 기본이 아니면 바꾸어 주시면 됩니다,.
backend_port=5432
secondary_backend_host_name 와 secondary_backend_port
위의 backend_host_name과 backend_port와 같습니다 FailOver나 replication 사용지 2번째 장비의 호스트명이나 IP와
Port를 지정할수 있습니다.
secondary_backend_host_name = ''
secondary_backend_port = ''
num_init_children
pgpool의 prefork즉 데몬 갯수를 설정합니다. 이 설정을 아래 옵션과 연계되므로 주의.!!!
이셋팅은 DB Application과 pgpool과의 접속과 직접관련으로 이 설정 갯수가 DB App.와의 동시접속자 입니다.
num_init_children=16
max_pool
pgpool에서 PostgreSQL을 대상으로 pooling할 Connect 갯수를 정하는 것입니다.
num_init_children * max_pool = pgpoll이 PostgreSQL Connect 하는 갯수므로 PostgreSQL의 동시접속자 제한과 연동되므로
디비서버의 동시접속 최대인원과 동일시 하지마시구요 최대한 5명정도나 10%내외는 비워 주시는것이
pgpool을 이용하지않거나 Consol작업이나 replication등등 작업용으로 쓸수 있으니 100% 잡는 일을 피해주시는게 좋을듯
max_pool의 기본이 4이니 15 * 4 = 64즉 PostgreSQL에 기본 설정으로는 64개의 최대 Connect를 유지합니다.
max_pool=4
child_life_time
pgpool의 Child즉 부모1과 설정에 따라 생성된 아그들 Process가 설정된 시간동안 idle 상태
(뭐! 맹하게 먼산바라보고 있다고 생각하시면 될듯하네요)에 있을때 그 프로세스를 죽이고 새로 생성하는 시간을 줍니다.
0을 주면 강제로 죽이지않습니다. 장단점이 있으니 웹서버의 KeepAlive 셋팅과 같다고 생각하시면 될듯.
초단위로 주시면 됩니다. 300초명 300/60 = 5분.! Just One Ten Minute!!^^
child_life_time=300
connection_life_time
이 옵션을 PostgreSQL로 pgpoll의 connect time out이라고 생각 하시면 됩니다. 즉.
괜히 PostgreSQL과 연결을 수없이 열어만 놓고 있는게 아니라 일정시간동안 작업이 생기지 않고 놀때
PostgreSQL과 Connect를 Close하라는 것입니다.
0은 계속 연결 즉 연결 유지(UnLimit) , 역시 초단위 설정.!
connection_life_time=0
logdir
처음에 이 옵션보고 로그 겁나게나오겠지 했습니다. 하지만 Process PID뿐입니다. 즉 pgpool종료를 위해
부모 Process의 PID뿐.! 쩝.... 추후 로그 파일을 위해 미리 준비하는듯.
logdir='/tmp'
Replication 모드 관련 옵션들
따로 어느정도 테스트해보고 올려드리겠습니다. 아직은 사용을 하지 않으시는 편이 낳을듯 합니다.
replication_mode
replication_strict
replication_timeout
replication_strict
load_balance_mode
replication_stop_on_mismatch
제약과 고민하고 해야 할게 ㅇ좀 있는것 같아 실서비스에는 적용하지 않으시는것이..
자 이제 설정에 대해 설명을 다하였습니다. 역시 자신의 상황에 맞게 교정하시면 될듯 싶습니다.
-+- 유의 사항 또는 집고 넘어 가야할 , 미리 알아야할 -+-
약간이상한것은 DB 연결 패스가 없는것이 다소 그렇습니다만. 이 정보는 pgpool에 보관하는것이 아니라
pgpool가동후 첫 접속시에 인증정보를 통해 postgresql에 인증하고 그정보는 connection_life_time 옵션이 정한
시간 만큼 유지해줍니다. 여타 DB Connect Pooler와 다른 부분이긴하지만 어찌보면 좋은듯 합니다
"기본" 게시물에서 설명드린바와 같이.
replication On 모드시 trust, clear text password이외의 인증 방식
replication Off 모드시 trust, clear text password, crypt, md5이외의 인증 방식
위 두가지 모드에서 지원되는 인증이 한정되어 있기는합니다. 앞으로 계선될것이고 일반적으로 많이 쓰이는 방식은
모두 지원하니 큰 문제는 되지 않을 것입니다.!!
(추가: "기본" 강좌코멘트의 수치를 보시면 아시겠지만 첫 pgbench에서 낮은 점수의 tps 수치를 보시는데 이유는 바로 위에 설명한것)
- 두근두근 pgpool을 꿈뜰겨려보장 -
pgpoll 설치폴더의 bin 디렉의 떨렁하나 있는 pgpoll을 이용해서 이제 슬슬 pgpool 사마를 깨우면 됩니다.
* pgpool 옵션들 *
-f : 설정파일의 위치를 정해줍니다.
-n : Daemon 모드가 아닌 Run Time 모드로 둡니다. 로그 모니터링을 하시거나 디버그 옵션을 On하여 로그를 쌓고 싶을때
쓰시면 됩니다. 추후에서는 설정의 logdir에 옵션으로 로그를 쌓이게 한다던지 뭔가 있을듯
-d : 디버그 옵션. 생각보다 엄청난 ?? 뭐 적은 편이기도 하지만 순식한 우루룩 쏳아지는 로그를 볼수 있습니다.
Consol에 계속 보지 않으실때는 -n 과 shell 명령으로 로그를 파일에 쌓게끔 하여야 합니다.
왠지 PostgreSQL 옛날 버전에서 쓰던 방식처럼 뭔가 냄새가 풍겨지는듯 음. 킁킁.^^
-h : Help Me.!!
stop : 종료 옵션이 있는데 몇가지 종료에 방식에 옵션이 있습니다. 아래 종료명령에서 설명 드림.
- pgpool Start -
실행시 -f로 설정파일의 위치를 정해주지만 기본 디렉토리로 잡혀는 있으니 따로 해줄 필요는 없지만
따로 설정파일을 /etc/등으로 옮기셨으면 지정해주싶시요.
실행 일반 : /database/pgpool/bin/pgpool -f /database/pgpool/etc/pgpool.conf
실행 디버깅 로깅 : /database/pgpool/bin/pgpool -f /database/pgpool/etc/pgpool.conf -n -d
>& /database/pgpool/pgpool.log &
종료 일반 : /database/pgpool/bin/pgpool stop
종료 알아서 상황에 맞게 종료 : /database/pgpool/bin/pgpool -m smart stop 또는 /database/pgpool/bin/pgpool -m s stop
종료 빨리 종료 : /database/pgpool/bin/pgpool -m fast stop 또는 /database/pgpool/bin/pgpool -m f stop
종료 알아서 상황에 맞게 종료 : /database/pgpool/bin/pgpool -m smart stop 또는 /database/pgpool/bin/pgpool -m s stop
종료 즉시종료 : /database/pgpool/bin/pgpool -m immediate stop 또는 /database/pgpool/bin/pgpool -m i stop
추천 드리는건 일반(smart)를 추천드리지만 응급복구나 현재의 Trasaction이 시스템에 과부하나 데이타 변조가 엉뚱하게 일어나거나등등
의 경우에만 fast나 immediate로 종료하시기를 권해드립니다.
자 이세 설정이 완료 되었습니다.!!!!!!!!!!!!!!!!!!!
- DB Application의 설정 하나 !만 변경 -
갑자기 Application 설정 변경이라니 "기본" 강좌에서는 않바꾼다더니 사기라고 하시겠지만.
Port를 변경 하셔야 합니다. 현재 디비 연결 소스의 Port가 5432로 된것을 pgpool.conf에 설정한 포트로 변경하셔야 하며
기본은 9999입니다.
너무 간단해서 의심스러우시면 연결후 잘되는거 보이시면 pgpool을 stop하시고 다시 해보시면 에러 메세지에서 여러분에
9999 살려주세요~ 메세지가 나올것입니다.
- Debug Log 살짜 엿보기 -
인용 또는 결과 :
DEBUG: pid 6713: key: listen_addresses
DEBUG: pid 6713: value: 'localhost' kind: 4
DEBUG: pid 6713: key: port
DEBUG: pid 6713: value: 9999 kind: 2
DEBUG: pid 6713: key: socket_dir
DEBUG: pid 6713: value: '/tmp' kind: 4
DEBUG: pid 6713: key: backend_host_name
DEBUG: pid 6713: value: '' kind: 4
DEBUG: pid 6713: ::
DEBUG: pid 6713: key: backend_port
DEBUG: pid 6713: value: 5432 kind: 2
DEBUG: pid 6713: key: backend_socket_dir
DEBUG: pid 6713: value: '/tmp' kind: 4
DEBUG: pid 6713: key: secondary_backend_host_name
DEBUG: pid 6713: value: '' kind: 4
DEBUG: pid 6713: ::
DEBUG: pid 6713: key: secondary_backend_port
DEBUG: pid 6713: value: 0 kind: 2
DEBUG: pid 6713: key: num_init_children
DEBUG: pid 6713: value: 20 kind: 2
DEBUG: pid 6713: key: max_pool
DEBUG: pid 6713: value: 4 kind: 2
DEBUG: pid 6713: key: child_life_time
DEBUG: pid 6713: value: 300 kind: 2
DEBUG: pid 6713: key: connection_life_time
DEBUG: pid 6713: value: 0 kind: 2
DEBUG: pid 6713: key: logdir
DEBUG: pid 6713: value: '/tmp' kind: 4
DEBUG: pid 6713: key: replication_mode
DEBUG: pid 6713: value: false kind: 1
DEBUG: pid 6713: key: replication_strict
DEBUG: pid 6713: value: true kind: 1
DEBUG: pid 6713: key: replication_timeout
DEBUG: pid 6713: value: 5000 kind: 2
DEBUG: pid 6713: key: load_balance_mode
DEBUG: pid 6713: value: false kind: 1
DEBUG: pid 6713: key: weight_master
DEBUG: pid 6713: value: 0.5 kind: 3
DEBUG: pid 6713: weight_master: 0.500000
DEBUG: pid 6713: key: weight_secondary
DEBUG: pid 6713: value: 0.5 kind: 3
DEBUG: pid 6713: weight_secondary: 0.500000
DEBUG: pid 6713: key: replication_stop_on_mismatch
DEBUG: pid 6713: value: false kind: 1
DEBUG: pid 6713: replication_stop_on_mismatch: 0
DEBUG: pid 6713: key: reset_query_list
DEBUG: pid 6713: value: 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT' kind: 4
DEBUG: pid 6713: extract_string_tokens: token: ABORT
DEBUG: pid 6713: extract_string_tokens: token: RESET ALL
DEBUG: pid 6713: extract_string_tokens: token: SET SESSION AUTHORIZATION DEFAULT
DEBUG: pid 6713: weight: 1073741823
DEBUG: pid 6714: I am 6714
DEBUG: pid 6715: I am 6715
DEBUG: pid 6716: I am 6716
DEBUG: pid 6717: I am 6717
DEBUG: pid 6718: I am 6718
DEBUG: pid 6719: I am 6719
DEBUG: pid 6720: I am 6720
DEBUG: pid 6721: I am 6721
DEBUG: pid 6722: I am 6722
DEBUG: pid 6723: I am 6723
DEBUG: pid 6724: I am 6724
DEBUG: pid 6725: I am 6725
DEBUG: pid 6726: I am 6726
DEBUG: pid 6727: I am 6727
DEBUG: pid 6728: I am 6728
DEBUG: pid 6729: I am 6729
DEBUG: pid 6730: I am 6730
DEBUG: pid 6731: I am 6731
DEBUG: pid 6732: I am 6732
DEBUG: pid 6733: I am 6733
[root@good /root]$ _
위는 pgpool 스타트와 동시에 나온 메세지입니다. 맨 마지막의 i am ^^ 압권입니다. 이 애기는 Chile Process가
나 잘실행되었구 내 Process ID는 몇번이라는걸 알려주는 것입니다. 즉 잘 기동 되었습니다 주인님하고 애기하는것입니다.
별다르게 오동작인 경고가 아닌 이상 로그는 쌓이지는 않습니다. 차후 버전에서는 Access 로그과 log rotate기능들이 생길듯하니
두고 봐야 할듯 싶네요... 암튼 앞으로 계속 발전 되었으면 하네요.
일단 실험을 더해봐야 할듯 하지만 2.4 라는 버전에 대한 불안감또는 기능이 많이 않은데 2.4라면 상당히 안정성에 신경 쓴듯한
또한 Change Log에도 보면 안정성위주 패치들이 많아서 그나마 작아도 우직한것 같아 맘에 듭니다.
- pgpool Status -
pgpool은 자체 API를 지원하지 않고 따로 관리 툴리 없는 핵심만 있다보니 다소 썰정하지만.
현재의 pgpoll status(상태)에 대해 알수가 있습니다.
psql -U postgres -p 9999 -c 'show pool_status' openphp
식으로 Consol에서 보실수도 있고 따로 쿼리분을 통해 show pool_status 쿼리로 확인이 가능합니다.
인용 또는 결과 :
item | value | de<script>ion
------------------------------+-----------+------------------------------------------------------------------------
listen_addresses | localhost | host name(s) or IP address(es) to listen to
port | 9999 | pgpool accepting port number
socket_dir | /tmp | pgpool socket directory
backend_host_name | | master backend host name
backend_port | 5432 | master backend port number
secondary_backend_host_name | | secondary backend host name
secondary_backend_port | 0 | secondary backend port number
num_init_children | 20 | # of children initially pre-forked
child_life_time | 300 | if idle for this seconds, child exits
connection_life_time | 0 | if idle for this seconds, connection closes
max_pool | 4 | max # of connection pool per child
logdir | /tmp | logging directory
backend_socket_dir | /tmp | Unix domain socket directory for the PostgreSQL server
replication_mode | 0 | non 0 if operating in replication mode
replication_strict | 1 | non 0 if operating in strict mode
replication_timeout | 5000 | if secondary does not respond in this milli seconds, abort the session
load_balance_mode | 0 | non 0 if operating in load balancing mode
weight_master | 0.500000 | weight of master
weight_secondary | 0.500000 | weight of secondary
replication_stop_on_mismatch | 0 | stop replication mode on fatal error
current_backend_host_name | | current master host name
current_backend_port | 5432 | current master port #
replication_enabled | 0 | non 0 if actually operating in replication mode
(23 rows)
[root@good /root]$ _
여기까지 설정과 기동에 대해 설명드렸습니다.!!
|