Database/PostgreSQL

PostgreSQL 설정 변경 및 실행 (RHEL7 환경)

갈색왜성 2018. 9. 13. 19:02
반응형

지난 포스팅 'RHEL7에 PostgreSQL 설치' 에 이어 실행하는 과정을 정리한다.


1.  pg_hba.conf, postgresql.conf 수정

Postgresql을 사용하면서 설정을 변경해야 하는 일이 생기는데 주로 pg_hba.conf와 postgresql.conf이다. 대략적인 설명은 아래와 같다. 이외에 pg_indent.conf라 해서 System 사용자와 PostgreSQL 사용자 Mapping Table을 관리하는 설정 파일이 있는데 사용을 안 해서 설명을 못하겠다. (필자는 향후 Replication Streaming 과 pgpool을 활용한 HA 구성을 위해 이 두 파일의 설정 변경이 필수적이다)

  • postgresql.conf : Main 설정 파일. 접속 Thread 숫자, 데이터 File 정보, Listening IP 정보, Log 등을 설정
  • pg_hba.conf : 인증 관련 정보를 담고 있는 설정 파일

이 두 파일은 'RHEL7에 PostgreSQL 설치'에서 초기 DB가 생성된 위치에 있다.

[brown@ha-test-1 /]$ ls -l -a /var/lib/pgsql/9.6/data
합계 52
drwx------. 20 postgres postgres  4096  9월 11 18:21 .
drwxr-xr-x.  3 root     root        36  9월 11 18:21 ..
-rw-------.  1 postgres postgres     4  9월 11 18:21 PG_VERSION
drwx------.  5 postgres postgres    41  9월 11 18:21 base
drwx------.  2 postgres postgres  4096  9월 11 18:21 global
drwx------.  2 postgres postgres    18  9월 11 18:21 pg_clog
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_commit_ts
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_dynshmem
-rw-------.  1 postgres postgres  4224  9월 11 18:21 pg_hba.conf
-rw-------.  1 postgres postgres  1636  9월 11 18:21 pg_ident.conf
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_log
drwx------.  4 postgres postgres    39  9월 11 18:21 pg_logical
drwx------.  4 postgres postgres    36  9월 11 18:21 pg_multixact
drwx------.  2 postgres postgres    18  9월 11 18:21 pg_notify
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_replslot
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_serial
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_snapshots
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_stat
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_stat_tmp
drwx------.  2 postgres postgres    18  9월 11 18:21 pg_subtrans
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_tblspc
drwx------.  2 postgres postgres     6  9월 11 18:21 pg_twophase
drwx------.  3 postgres postgres    60  9월 11 18:21 pg_xlog
-rw-------.  1 postgres postgres    88  9월 11 18:21 postgresql.auto.conf
-rw-------.  1 postgres postgres 22304  9월 11 18:21 postgresql.conf
...

보다시피 전체 파일이 소유권자가 'postgres'로 되어있다. 특별한 상황이 없으면 별다른 변경 없이 사용하면 되고, 변경할 필요가 있을 때는 root 권한을 가지고 변경하거나 사용자를 postgres로 변경해서 수정하면 된다.


pg_hba.conf는 16.8.35.x로부터 오는 접속만 허용하고(localhost 접속도 허용), Method를 'trust'로 설정하였다.(*) 거의 Comment 나 Bolierplate Code 이니 아래 내용만 남기고 주석 처리하면 된다. (참조 >>> pg_hba.conf 관련 )

...
host    all             all             16.8.35.0/24            trust
host    all             all             ::1/128                 trust
...

postgresql.conf는 정말 양이 방대하다. listen_address 하나만 '*'로 변경해서 어디 서나 원격으로도 접속이 가능하게 한다. 참고로 별다른 정의가 없을 때는 'localhost'로  인식해서 같은 PC 에서만 접속이 가능하다. 참고로 postgresql.conf 설명은 여기(9.6 기준) 부터 나온다. (내용이 참 많다.)

...
listen_addresses = '*'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
...


2. Firewall 설정

postgresql.conf에서 port 설정을 별도로 하지 않았다면 5432를 기본 Port로 사용하게 된다. 위에서 언급한 바와 같이 필자는 16.8.35.x에서 오는 모든  접속을 허용하려고 하기 때문에 5432 port에 대해 방화벽 예외 설정을 했다. (물론 PostgreSQL 서비스에 대해서 방화벽 예외 설정을 할 수도 있다.) 방화벽 관련 설정은 RHEL7 계열에서는 firewall-cmd를 사용한다. (하위 버전에서는 iptables를 사용해야 하고, Ubuntu에서는 ufw를 사용해야 하는 것으로 알고 있다. 자세히 아는 것이 아니니 확인할 것을 권장한다.)

...
[root@ha-test-1 /]$ firewall-cmd --zone=public --add-port=5432/tcp  --permanent       // 5432 Port에 대해 방화벽 예외 설정
success
[root@ha-test-1 /]$ firewall-cmd --reload       // 수정된 방화벽 설정 내용 반영
success
[root@ha-test-1 /]$ firewall-cmd --list-all        // 최종 방화벽 상태 확인
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eno1
  sources:
  services: ssh  dhcpv6-client
  ports: 80/tcp 443/tcp 5432/tcp 21/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
...

참고로 Service Name으로 방화벽 설정을 할 경우에는 아래와 같이 하면 된다. (어떤 게 더 좋은 지는 모릅니다. ^^;)

...
[root@ha-test-1 /]$ firewall-cmd --permanent --zone=public --add-service=postgresql
success
[root@ha-test-1 /]$ firewall-cmd --reload
success
[root@ha-test-1 /]$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eno1
  sources:
  services: ssh dhcpv6-client postgresql
  ports: 80/tcp 443/tcp 5432/tcp 21/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
...


3, Postgresql 서비스 실행

systemctl 명령어를 통해 Postgresql Service를 실행시킨다. 실행시킨 후 status 옵션으로 Service 실행 상태를 확인할 수 있다.

...
[root@ha-test-1 /]# systemctl enable postgresql-9.6.service
  Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-9.6.service to /usr/lib/systemd/system/postgresql-9.6.service.
[root@ha-test-1 /]# systemctl start postgresql-9.6.service 
[root@ha-test-1 /]# systemctl status postgresql-9.6.service
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-9.6.service; enabled; vendor preset: disabled)
   Active: active (running) since 금 2018-09-14 17:05:47 KST; 28s ago
   Docs: https://www.postgresql.org/docs/9.6/static/
   Process: 1615 ExecStartPre=/usr/pgsql-9.6/bin/postgresql96-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS) Main PID: 1625 (postmaster)
   CGroup: /system.slice/postgresql-9.6.service
   ├─1625 /usr/pgsql-9.6/bin/postmaster -D /var/lib/pgsql/9.6/data/
   ├─1626 postgres: logger process
   ├─1628 postgres: checkpointer process
   ├─1632 postgres: writer process
   ├─1633 postgres: wal writer process
   ├─1634 postgres: autovacuum launcher process
   └─1635 postgres: stats collector process
   9월 14 17:05:46 ha-test-2 systemd[1]: Starting PostgreSQL 9.6 database server...
   9월 14 17:05:47 ha-test-2 postmaster[1625]: < 2018-09-14 17:05:47.094 KST > 로그:  redirecting log output to logging … process
   9월 14 17:05:47 ha-test-2 postmaster[1625]: < 2018-09-14 17:05:47.094 KST > 힌트:  Future log output will appear in d…pg_log".
   9월 14 17:05:47 ha-test-2 systemd[1]: Started PostgreSQL 9.6 database server.Hint: Some lines were ellipsized, use -l to show in full.
...

psql을 아래와 같이 실행시킨다. pg_hba.conf 에서 인증 방법을 'trust'로 설정해서 User를 postgres로 사용하면 별다른 문제 없이 실행이 될 것이다. Host 명을 옵션으로 명시하지 않으면 [local]로 접속하게 되는데 RHEL7에서 설치한 후에 별다른 변경을 안 했을 경우 [local]이라는 host를 인식하지 못해서 명시적으로 localhost라고 했다.

...
[brown@ha-test-1 /]$ psql -h localhost -U postgres
(9.6.10)
postgres=# 
...

\list나 \list+로 현재 DB List를 조회해보자.

...
postgres-# \list
                                 데이터베이스 목록
    이름    |  소유주  | 인코딩 |   Collate   |    Ctype    |      액세스 권한
-----------+----------+--------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 |
 template0 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
		   |          |        |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
		   |          |        |             |             | postgres=CTc/postgres
(3개 행)
postgres-# \list+
                                                                     데이터베이스 목록
   이름    |  소유주  | 인코딩 |   Collate   |    Ctype    |      액세스 권한      |  크기   | 테이블스페이스 |                    설명                    
-----------+----------+--------+-------------+-------------+-----------------------+---------+----------------+--------------------------------------------
 postgres  | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 |                       | 7343 kB | pg_default     | default administrative connection database
 template0 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +| 7233 kB | pg_default     | unmodifiable empty database
           |          |        |             |             | postgres=CTc/postgres |         |                | 
 template1 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +| 7233 kB | pg_default     | default template for new databases
           |          |        |             |             | postgres=CTc/postgres |         |                |
 (3개 행)
...


(*) 처음 접속할 때는 Password 없이 접속한 후에 Password를 설정하고, 이후에 pg_hba.conf의 인증 방식을 변경해서 재시작 하는 것이 가장 쉽게 시작하는 방법이다.


<Fail log>

이 내용은 설정 실패 사례이다. 현재 필자가 구성할 환경 특수성으로 인해 임의의 사용자로 맞춰 전체 설정을 변경하려 했는데 잘 안됐다. 일단 작업한 내용은 다음과 같다.

  1. User를 'postgres' 가 아닌 다른 User로 변경('brown' 으로 변경) 이를 위해 chown을 이용해 /var/lib/pgsql 하위 폴더의 소유주 전체를 변경

    ...
    [root@ha-test-1 /]# chown -R brown:brown /var/lib/pgsql
    ...
    

  2. brown으로 postgresql.service 실행. 아래와 같은 에러 발생.
    ...
    [root@ha-test-2 /]# systemctl enable postgresql-9.6.service
    [root@ha-test-2 /]# systemctl start postgresql-9.6.service
    Job for postgresql-9.6.service failed because the control process exited with error code. See "systemctl status postgresql-9.6.service" and "journalctl -xe" for details.
    [root@ha-test-2 /]# systemctl status postgresql-9.6.service
    ● postgresql-9.6.service - PostgreSQL 9.6 database server
       Loaded: loaded (/usr/lib/systemd/system/postgresql-9.6.service; enabled;
       vendor preset: disabled)
       Active: failed (Result: exit-code) since 금 2018-09-14 16:30:17 KST; 14s ago
       Docs: https://www.postgresql.org/docs/9.6/static/
       Process: 32301 ExecStartPre=/usr/pgsql-9.6/bin/postgresql96-check-db-dir ${PGDATA} (code=exited, status=1/FAILURE)
       Main PID: 21632 (code=exited, status=0/SUCCESS) 
       9월 14 16:30:17 ha-test-1 systemd[1]: Starting PostgreSQL 9.6 database server... 
       9월 14 16:30:17 ha-test-1 systemd[1]: postgresql-9.6.service: control process exited, co...s=1 
       9월 14 16:30:17 ha-test-1 systemd[1]: Failed to start PostgreSQL 9.6 database server. 
       9월 14 16:30:17 ha-test-1 systemd[1]: Unit postgresql-9.6.service entered failed state. 
       9월 14 16:30:17 ha-test-1 systemd[1]: postgresql-9.6.service failed.Hint: Some lines were ellipsized, use -l to show in full.
    ...
    
  3. /usr/lib/systemd/system/postgresql-9.6.service 의 내용을 아래와 같이 수정해서 재시도 했지만 역시 실패
    ...
    [Service]
    Type=notify
    User=brown
    Group=brown
    ...