2. DBMS이야기/01. PostgreSQL

[PostgreSQL ADMIN] 접속 및 인증

OSSW(Open Source System SoftWare 2014. 9. 29. 10:49

Server 시작, 중지, 리로드


Postgresql 의 시작, 중지는 다음과 같습니다.


pg_ctl -D datadir -m [smart|fast|immediate] [start|stop|reload|restart]

SHUTDOWN-MODE


-m 은 'SHUTDOWN-MODE'라고 하는데 대부분 기본값은 'smart' 입니다. smart 의 경우 서버를 중지했을 때에, 서버는 새로운 접속을 거부하고 클라이언트의 접속이 끊길때까지 중지를 대기합니다. 클라이언트 접속이 모두 끊기면 그때 서버는 중지 됩니다. 'fast'의 경우 즉시 중지를 실행하며, 모든 사용자의 트랜잭션은 중단되고 모든 접속은 바로 끊깁니다. 'immediate'의 경우에도 fast 와 동일한 현상이 발생합니다. 그러나 immediate 의 경우에는 'clean shutdown'이 아닙니다.


Postgresql은 중지되기전에 'checkpoint'를 중지 합니다. checkpoint 는 트랜잭션 로그에 설정하는 지점을 말하는데 'immediate'의 경우 이러한 chekcpoint 를 다루지 않습니다. 결국 'immediate'의 경우 데이터 크래쉬와 같은 상황이 발생하며 서버를 시작할때에 데이터 리커버리가 발생할 수 있습니다.


릴로드 - 설정파일 재인식


Postgresql 의 설정파일을 변경하게 되면 기본적으로 서버를 재시작해줘야 합니다. 재시작은 stop했다가 start 를 해주던가 restart를 해주면 됩니다. restart는 내부적으로 stop, start를 해주는 것 뿐입니다. 이렇게 할 경우에 서버에 갑자기 접속이 안되거나 접속이 갑자기 끊길 수 있음으로 설정파일만 재적용하는 프로세스를 만드는 것이 더 좋을 것입니다.


'reload'는 설정파일 변경시에 서버가 이 새로바뀌 설정파일의 내용을 서버에 적용해줍니다. 사실 이것은 Postgresql의 메인 프로세스인 'postmaster'에 행업(Hang Up) 시그널을 보내 설정파일을 다시 읽어오게 하는 것입니다. 따라서 실제로 'postmaster' 프로세스에 행업 시그널을 줘도 똑같습니다.


kill -SIGUP `cat /usr/local/pgsql9.0/data/postmaster.pid | head -1`

설정 파일을 다시 읽어오게 하는 또 다른 방법은 psql 로 쿼리를 이용하는 것입니다.


postgres=# SELECT pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)

그런데 여기서 한가지 문제가 있습니다. 행업 시그널을 보냈다고 해서 모든게 적용되는 것은 아닙니다. 행업 시그널로 설정이 가능한 것들이 있는데 이는 다음의 쿼리로 확인 가능합니다.


postgres=# select name, setting, unit, context, extra_desc from pg_settings where context='sighup';

접속 관리


Postgresql 은 이미 사용중인 클라이언트, 데이터베이스, 사용자에 대해서 접속제한을 할 수 있습니다.
가장 흔한 방법은 pg_hba.conf 파일에서 제한을 두고 싶은 클라이언트에 제한을 거는 것입니다.


# TYPE DATABASE USER CIDR-ADDRESS METHOD
local all all 192.168.0.16/32 reject

위와 같이 하면 192.168.0.16 클라이언트는 어떤한 접속도 할 수 없습니다. 어떤한 사용자, 어떤 데이터베이스에도 접속 할 수 없게 됩니다.


접속자 수 조절을 통한 접속 제한


Postgresql은 접속자 수를 실시간으로 설정할 수 있습니다. 특정 사용자의 접속자 수, 특정 데이터베이스의 접속자 수등을 쿼리를 통해서 조작할 수 있다는 것입니다.


ALTER USER robotCat CONNECTION LIMIT 0;

위의 쿼리는 사용자의 접속자 수를 0 으로 설정하도록 하는 것입니다. 결국에는 접속을 못하게 하는 효과를 주어 접속에 제한을 주게 됩니다. 'LIMIT -1' 로 하면 설정이 해제됩니다.


ALTER DATABASE robtCat CONNECTION LIMIT 0

위 쿼리는 데이터베이스의 접속자 수를 0 으로 설정하도록 하는 것이니다. 데이터베이스의 접속를 0으로 설정했기 때문에 아무도 접속할 수 없습니다. 'LIMIT -1'로 하면 설정이 해제됩니다.


롤(Role)에도 다음과 같이 접속을 제한할 수 있습니다.


ALTER ROLE robot CONNECTION LIMIT 0;

위 경우은 접속제한 수를 다음과 같이 확인할 수 있습니다.


SELECT rolconnlimit FROM pg_roles WHERE rolname = 'robot';

postgresql 접속 및 인증


Postgresql 은 가끔 "Database Cluster" 라고도 불리웁니다. 한대의 Postgresql 서버에 여러개의 데이터베이스를 가질 수 있다는 것입니다. 이러한 구조 때문에 접속 요청이 들어왔을때에 Postgresql은 정확하게 하나의 데이터베이스에 세션 연결을 해줘야 합니다. 이러한 연결을 위해 Postgresql 은 다음과 같이 접속에 관한 설정파일들을 가집니다.

  1. postgresql.conf
  2. pg_hba.conf
  3. pg_ident.conf

postgresql.conf 파일은 Postgresql 의 전반적인 운영에 관한 설정을 할 수 있는 곳입니다. 여기에 접속에 관련해서 다음과 같은 설정을 할 수 있습니다.


listen_addresses = '*'
port = 5432
max_connections = 100

접속에 관해서 설정은 위와 같이 하시면 됩니다. 'listen_addresses'의 '*'는 어떤 주소든지 Listenning 하겠다는 것입니다. 서버의 Listenning Port 도 지정할 수 있습니다. Postgresql 의 기본 포트는 5432 입니다. 또 최대 동시접속자도 조절할 수 있습니다. 대부분 Postgresql 서비를 할때는 위의 설정 그대로 유지한채 최대 동시접속자수만 서비스 양에 따라서 조절해줌으로서 접속문제는 해결할 수 있습니다.


 

출처 : http://histlinux.egloos.com

by. 백준 (2014.09.29)