Note-Notice

➽|PostgreSQL 설치 > 확장옵션

  • PostgreSQL 15 기준으로 문서 작성됨
  • 기본적으로 PostgreSQL의 설치는 Linux OS 내에서 패키지 형태로 제공됨
  • 다만 필요에 따라 이진파일 설치(Binary Set) 확장옵션이 가능함.
  • 기본 설치 구성으로 설치된 PostrgreSQL은 부가 옵션들의 이유로 기본설치 필요 여부 확인!

↳ PostgreSQL 설치파일

title: | https://www.postgresql.org/ftp/source/
- Source File Download Link 
  - Version 별 디렉터리 상 postgresql-X.X.tar.gz 파일 대상
- 이외 RPM/DNF WGET 방식은 별도 확인

↘ 설치검토.01> OS 요구조건

  • References
    • OS Server Setup : PostgreSQL 15 Docs - Chapter 19
    • Packages : PostgreSQL 15 Docs - Chapter 17
  • 대부분의 Linux OS 에서 PostrgreSQL 설치 요건이 만족됨

↳ OS User 구성 요건

  • 별도의 사용자 계정을 추가하여 구성하는 것을 권장 (postgres)
    • 해당 서버에서 DBMS만 관리하는 별도 계정으로 구성 권고
    • 단, 해당 계정이 PostgreSQL 실행파일의 소유권을 갖지 않도록 구성

↳ Database Cluster 구성 요건

  • Database는 기본적으로 Disk 상에 구성되어야함
  • 구성된 Database는 PostgreSQL 상에서 Database Cluster라고 지칭
    • 기본 Initilize DB, postgres 포함함 (Default Database)
    • Default Database는 유틸리티나 3rd Party 어플리케이션을 사용하는 목적
    • 이외 기본 구성되는 template0/template1 존재

  • Database Cluster는 File System 구성 상 하나의 디렉터리와 그 안에 존재
    • 이 디렉터리를 data directory 또는 data area라 지칭 >> $PGDATA
    • Database의 데이터가 적재되는 공간

  • data Directory 구성 및 검토 사항
    • 해당 공간은 initial / initdb 수행 전에 설계되고 구성되어야함.
    • 기본 지정 공간 : /usr/local/pgsql/data | /var/lib/pgsql/data
      • 기본 지정 공간이라 할지라도 Default 및 필수가 아님, 별도 지정 가능
    • PostgreSQL 실행파일 구성 후 initdb -D|pgctl -D -- initdb 명령어로 구성 가능함
      • OS Parameter $PGDATA로 지정 관리됨
      • initdb 수행 시 별도 -D 옵션 없다면 기본 지정 공간에 설치됨
      • initdb 실행 시 Locale 구성을 기본 구성으로 쫓아감

    • initdb 실행 시 data directory 위치가 이미 존재하거나 파일이 존재하면 생성 거부됨
      • data directory는 데이터베이스의 모든 데이터가 담긴 공간임으로 생긴 제한사항
      • 비인가 접근 또한 권한 관리가 필요
        • postgres 계정 및 그룹 권한 외 계정의 접근 또는 권한 관리
        • 권한 외 접근이 필요할 경우라도 read-only 권한 정도만 권장
      • 권한 권장 사항
        • 계정/그룹 권한 : Directory : 0750 | Files : 0640
        • Only 계정 권한 : Directory : 0700 | Files : 0600

↳ System Storage 구성 요건 (File System/NFS)

  • 기본적으로 OS ROOT(/) 디렉터리 상에 공간이 아닌 별도의 Mount Point 된 볼륨 이용 권장
    • PostgreSQL 관리 시 향후 data directory 관리 및 pg_upgrade 등 작업에 문제를 예방하기 위함
    • data directory 공간을 일반 OS 영역과 분리하는 것을 권고
    • 공간 지정 시 File System 구성은 일반 POSIX 문법을 따름
    • File System 형태를 제공하는 Storage 구성(Block Device)을 지원함
      • 단 Storage Layer에서 발생하는 문제는 따로 분석 및 확인해야함

  • NFS 구성을 지원하며 일반 File System 구성으로 인식하여 PostgreSQL이 동작함
    • 단, PostgreSQL 용 NFS는 File System mount 시 “hard” 옵션으로 Mounting 되어야함.
    • NFS 구성에 sync 옵션으로 구성하는 것을 강력 권고
      • async 기능을 지원하나 write caches 동작의 문제로 데이터 손실 발생 가능
      • fsync 동작방식 또한 async와 동일하므로 async/fsync 권장하지 않음.

↳ Kernel Shared Memory/Semaphores 요건 (최소/권장)

  • PostgreSQL은 IPC(Inter-process communication)과 공유메모리/세머포어를 이용
    • Linux / FreeBSD 계열에선 POSIX 세머포어, 이외 플랫폼은 System V 세머포어를 주로 사용
    • PostgreSQl 실행 시 상당 수의 POSIX 또는 System V의 세머포어가 생성되고 기동됨.
      • “System V” 방식의 공유메모리를 작은 사이즈로 할당받고
        매우 큰 사이즈의 mmap 공유메모리를 활용하는 프로그램
      • 또는 매우 큰 사이즈의 “System V” 공유 메모리 영역을 할당 받을 수 있음
        (shared_memory_type 활용)
      • “System V” 자원 구성은 system-wide에서 할당 제한하는 자원
        • 전체 자원보다 큰 값에 대해서 PostgreSQL의 사전 설계 필수

  • “System V” IPC - Kernel Parameter
    • 설정 값 기준 : 한개의 PostgreSQL Instance를 구성하기 위한 최소 요건

    • kernel.shmmax >> /proc/sys/kernel/shmmax
      • Shared Memory Segment 최대 사이즈 (Bytes)
      • 설정 값
        • 권장 : PostgreSQL 전체 공유 메모리 크기
        • 최소 : 1024 (1kb)

    • kernel.shmmin >> ipcs -lm|grep "min seg size"
      • Shared Memory Segment 최소 사이즈 (Bytes)
      • 설정 값
        • 미지정 권장 / 최소 : 1

    • kernel.shmall >> /proc/sys/kernel/shmall
      • Shared Memory로 구성 가능한 최대/전체 사이즈 (Bytes)
      • 설정 값
        • SHMMAX와 동일한 사이즈로 구성
        • PostgreSQL 외 별도 어플리케이션이 사용할 메모리량까지 합산 필요

    • kernel.shmseg >> “hardcore”
      • 각 프로세스의 Shared Memory Segment의 최대 값 지정
      • 설정 값
        • 최소 : 1 이상 / 기본 설정 값이 1보다 큼으로 지정 X

    • kernel.shmmni >> /proc/sys/kernel/shmmni
      • 시스템 system-wide로 설정된 Shared Memory Segment의 최대 값
      • 설정 값
        • 다른 프로그램이 사용할 파라미터 | 기본 : 4096

    • semmni | kernel.sem={4} >> /proc/sys/kernel/sem | awk '{print $4}'
      • 최대 세마포어 식별자 수
      • 설정 값
        • ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 6)/16) == (최소)
        • 별도 어플리케이션 사용할 세마포어 숫자도 포함 | 기본 : >= 128

    • semmns | kernel.sem={2} >> /proc/sys/kernel/sem | awk '{print $2}'
      • 시스템 전체의 최대 세마포어 수
      • 설정 값
        • ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 6) / 16) * 17
        • 별도 어플리케이션 사용할 세마포어 숫자도 포함 | 기본 : >= 32000

    • semmsl | kernel.sem={1} >> /proc/sys/kernel/sem | awk '{print $1}'
      • SET 하나당 최대 세마포어 수
      • 설정 값
        • 최소 : >= 17 | 기본 : 250

↳ Linux Memory Overcommit 요건

  • 기본 Linux 가상 메모리 동작 시 커널의 메모리 오버커밋이 구현되면
    PostgreSQL을 종료할 수 있으므로 최적의 구성이 아님.
    • 즉 다른 프로세스의 메모리 요구로 인한 가상 메모리가 부족할 수 있는 시스템
    • 대부분의 동작상 PostgreSQL의 메모리 부족은 DBMS를 재시작해야만 해소됨.

  • 해당 문제를 해결하기 위해 프로세스의 메모리가 부족하지 않도록 PostgreSQL을 운영하는 것
    • 메모리가 부족한 경우 SWAP을 사용하는 것도 해결책이 될수 있으나 권장 X
    • 실제 메모리/스왑 공간이 부족할 경우에만 메모리 부족 킬러(OOM)이 동작되기 때문
      • 결국 SWAP 공간을 메모리로 사용하는 부분과 메모리 상의 속도차이로 인해
        성능불균형 및 지연이 발생할수 있으므로 PostgreSQL은 메모리에서만
        동작하도록 구성 권장

  • Kernel-vm.overcommit_memory 설정
    • 설정 값

      • /etc/sysctl.conf -- vm.overcommit_memory=2
        • 또는 overcommit 비율을 지정 kernel--vm.overcommit_ratio (세부 옵션 확인)
      • sysctl -w vm.overcommit_memory=2
      • 제일 권장하는 방안

    • 커널 동작을 수정하여 메모리를 “오버커밋”하지 않도록 구성하는 것을 권장

      • OOM 킬러의 메모리 조정 값을 조정하는 방법도 가능
      # PostgreSQL 실행 스크립트 상
        echo -1000 > /proc/self/oom_score_adj
       
      # or User Profile 설정
        export PG_OOM_ADJUST_FILE=/proc/self/oom_score_abj
        export PG_OOM_ADJUST_VALUE=0 
    • 이외 메모리 관련 구성 매개 변수를 조정하거나 max_connection을 줄이는 형태로도
      문제를 해결 할 수 있다.

      • shared_buffers/work_mem/hash_mem_multiplier 설정을 조정
      • max_connections의 수를 줄이고, AP/WAS의 Connection_Pool 활용 증가 형태로 조정

↳ Linux Huge Pages 요건

  • 메모리 HugePage 사용으로 메모리 부하(chunks of memory)를 줄일 수 있음
  • Shared_buffers의 거대한 값을 사용시 PostgreSQL가 사용 가능
    • 설정 값
      • CONFIG_HUGETLBFS=y | CONFIG_HUGETLB_PAGE=y
      • 필요한 페이지수를 결정하기 위해선 postgres 명령어 통해서 확인 가능
      # run Postgres - HugePage 값 확인 >> PostgreSQL 종료 후 수행해야함
        postgres -D $PGDATA -C shared_memory_size_in_huge_pages #출력되는 페이지 값 확인
        grep ^Hugepagesize /proc/meminfo # Default 2048kb (2MB)
        ls /syskernel/mm/hugepages # 사용가능한 HugePage Unit 확인
       
      # HugePage 값 구성
        vi /etc/sysctl.conf
        vm.nr_hugepages=#(shared_memory_size_in_huge_pages 결과)
        # 서버 재기동 수행
       
      # 설명
        - Linux 기본 Hugepage는 2048kB(2MB) 또는 1GB 이나, 2MB 기준으로 HugePage 구성!
        - Postgres가 사용하여 계산한 페이지 값은 shared_memory_size_in_huge_pages로 확인가능
        - 해당 페이지 값은 2MB 기준으로 계산된 페이지 값을 표현
      	  - 해당 값을 HugePage 값으로 구성하여 준다면 가능
        - HugePage 사용을 위해 별도의 권한이나 그룹 지정이 필요할 있음 (추가 확인)

↳ User Resource Limits 요건 (최소/권장)

  • Postgres 운영 간 유저의 Resource Limit 별도 구성이 필요할 수 있음
    • 프로세스 당 Open File / 유저 당 Open Process 설정에 대한 Hard/Soft 설정
      • maxproc|openfiles|datasize
    • /etc/login.conf 상에서 설정 (Setrlimit 값 의미 | ulimit/limit)
    • 대부분 Default system-wide 값에서 처리되지만 필요시 조정

  • 대용량 client-connection 대응을 위한 socket_max_connection 조정
    • 대량의 client 접속에 따른 maximum socket connection 값을 조정할 필요 있음.
    • 대량의 접속이 짧은 시간안에 이루어질 경우, 접속에 장애 및 지연 장애 발생.
    • 설정 값
      • 기본값 128보다 크게 설정할 것을 권고 | 권고 2048 (Oracle)
      • /etc/sysctl.conf >> net.core.somaxconn
      • FreeBSD | kern.ipc.soacceptqueue | BSD,MacOS | kern.ipc.somaxconn

↳ Systemd RemoveIPC 요건

  • systemd 사용 시, IPC 자원(공유 메모리 포함)가 사용되지않도록 구성 필요
    • Source Advanced 구성 시 문제 발생 많음, 일반 배포 패키지(RPM) 구성 시 영향도 적음
    • logind.conf로 RemoveIPC를 제어하여 유저 로그아웃 시 제거되는 IPC 개체여부를 제어해야함
  • /etc/systemd/logind.conf >> RemoveIPC=no 옵션 작성

↳ 필수 패키지 요건

  • 요건.01> GNU Version >= 3.81
    • 패키지명 gmake : make --version

    • 3.81 이하 버전의 경우 DBMS가 동작하지 않음



  • 요건.02> ISO/ANSI C Compiler
    • 패키지명 gcc/libgcc

    • GCC / C99-compliant 필요



  • 요건.03> 압축 제어용 프로그램 - gzip/bzip2
    • 패키지명 gzip or bzip2



  • 요건.04> GNU Readline Library
    • psql(PostrgreSQL command line SQL Interpreter) 구성을 위해 필수

      • 설치 간 --without-readline 옵션과 함께 구성은 가능하지만 권장X
    • 해당 라이브러리 대산 BSD-License libedit 사용 가능

      • 단 설치 간 --with-libedit-preferred 옵션 설치 필요
    • 패키지명 readline/readline-devel



  • 요건.05> zlib library
    • PostgreSQL의 압축기능 사용에 필수 (pg_dump/pg_restore 기능 간)

      • 압축기능 미필요시 --without-zlib 옵션 설치 진행
    • 패키지명 zlib



↳ 옵션 패키지 요건

  • 요건.01> PL/Perl 필요 시 전체 Perl 프로그램 필요
    • 패키지명 libperl + perl Language 관련 전체
    • 구성 시 libperl은 시스템 상에서 공유 라이브러리로 제공되어야함.
    • 각 시스템 상에서 제공되는 최신버전으로 설치, 이전 버전 지원 X

  • 요건.02> PL/Python 필요 시 전체 Python>=3.2 프로그램 필요
    • 패키지명 libpython | pythonXX-devel 패키지
    • 구성 시 libpython은 시스템 상에서 공유 라이브러리로 제공되어야함.
    • configure 옵션 구성에서 --enable-shared 옵션을 활성화 해야함.

  • 요건.03> PL/Tcl 필요 시 Tcl 프로그램 필요
    • 최소 Tcl >= 8.4

  • 요건.04> NLS (Native Language Support) 관련
    • NLs 활성화 하여 언어 표시 변경 가능 , 단 Gettext API 구현 필요
    • 일부 운영 체제에는 내장형이 이미 존재(Linux, NetBSD, Solaris)
      • 없을 경우 GNU 상에서 패키지 다운로드 후 설치
      • GNU C 라이브러리에서 구현할 경우, 별도 추가 유틸리티 필요

  • 요건.05> OpenSSL 구성
    • 클라이언트의 암호화 접근 필요 시 구성요건
    • OpenSSL Version >= 1.0.1
      • 난수 생성 기능이 없는 플랫폼(/dev/urandom)의 경우에 암호화 필요시 필수

  • 요건.06> 접근제어 요건
    • Kerberos/OpenLDAP/PAM 요건 필요시 구성 가능

  • 요건.07> LZ4/Zstandard 구성 요건
    • 데이터 압축 방식 중 LZ4/Zstandard 필요시 구성 가능
    • default_toast_compression 및 wal_compression을 참조

↘ 설치수행.02> Advanced Source 설치

  • PostgreSQL 설치는 전체 다음 단계로 이루어짐
    • Configure >> Build >> Regression Tests >> Install Files

2.01> 설치파일 구성

title: PostgreSQL Install File Check
- https://www.postgresql.org/ftp/source/
- postgresql-X.X.tar / poastgresql-X.X.tar.bz2 파일 확인
	- X.X는 PostgreSQL의 버전을 의미
  • 설치 파일을 OS 상에 업로드 및 압축해제 수행
    • 업로드 시 postgresql을 구축/실행 할 계정으로 수행 | User : postgre
    • 업로드 대상 디렉터리는 PostgreSQL이 설치될 영역의 상위 디렉터리로 이동
    • /pgsql/eng에 설치 시 /pgsql 상에 파일 업로드 후 압축해제 수행
      • 압축 해제시 postgresql-X.X 디렉터리 생성 확인



2.02> User Profile 구성 및 사전 작업

  • PostgreSQL 설치 전 유저 프로파일 구성 수행

  • User Profile 구성 (BASH 기준)

    # PostgreSQL Profile - SYSTEM
      export PGROOT=/pgsql
      export PGBASE=${PGROOT}/base
      export PGHOME=${PGROOT}/15.6
      export PGDATA=${PGROOT}/data
      export PGCONF=${PGDATA}
     
    # PostgreSQL Profile - USER
      export PGDATABASE=postgres
      export PGUSER=postgre
      export PGPORT=5432
      export PGPASSWORD=postgre
     
    # PostgreSQL System Env
      PATH=$PATH:/bin:/sbin:/usr/sbin:/usr/ccs/bin ; export PATH
      [ -z ${__BASE_PATH} ] && export __BASE_PATH=$PATH
      export PATH=${PGHOME}/bin:${__BASE_PATH}
      export LD_LIBRARY_PATH=${PGHOME}/lib
      export MANPATH=${PGHOME}/share/man:$MANPATH
     
    # PostgreSQL Alias
      alias pr='cd ${PGROOT}'
      alias pb='cd ${PGBASE}'
      alias ph='cd ${PGHOME}'
      alias pd='cd ${PGDATA}'
      
      alias  pg_start='pg_ctl -D "${PGDATA}" "-o -c config_file=${PGCONF}/postgresql.conf" start'
      alias   pg_stop='pg_ctl -D "${PGDATA}" "-o -c config_file=${PGCONF}/postgresql.conf" stop'
      alias pg_status='pg_ctl -D "${PGDATA}" "-o -c config_file=${PGCONF}/postgresql.conf" status'
  • 사전 작업

    # PosgreSQL Install Pre Action
      mkdir -p ${PGHOME} ${PGBASE} ${PGDATA}

2.03> Configure

  • 시스템 내에서 소스트리를 구성하는 작업

    • 다양한 시스템 종속 변수 값을 경정하고, OS의 특이점 체크를 위한 단계

  • 사전 검토 수행

    # Configure Option 검토
      #.01 Install Location
        --prefix=${PGHOME}
         # PREFIX는 기본 위치 /usr/local/pgsql 대신에 DBMS설치 할 정소 지정
    	
        --exec-prefix=EXEC-PREFIX
         # PREFIX와는 별개로 아키텍처 종속파일을 구성할 공간 지정
         # 호스트 간 아키텍처 독립파일을 공유하는대 유용할 수 있음
         # 생략시 PREFIX를 EXEC-PREFIX기준으로 사용함.
    	
        --bindir=
         # EXEC-PREFIX/bin
         # 실행프로그램 디렉터리 위치 지정
    	 
        --sysconfdir=
         # PREFIX/etc
         # various configuration files 위치 지정
         
        --libdir=
         # EXEC-PREFIX/lib
         # libraries 및 dynamic loadable module 파일 위치 지정
         
        --includedir=
         # PREFIX/include
         # C 및 C++ 해더파일 위치 
         
        --datarootdir=
         # PREFIX/share
         # 다양한 형태의 read-only data 파일의 root directory 값 지정
         # locale|man|doc|html 파일을 포함
         
        --datadir=
         # DATAROOTDIR 위치
         # 설치된 프로그램의 read-only 데이터 파일의 디렉터리를 지정
         
        --{localedir=|mandir=|docdir=|htmldir=}
         # DATAROOTDIR 위치 활용 read-only 데이터파일 구성
         # 별도 지정 X, 기본 값 확인
  • 설치 구성 예제

    # Configure Execution
      cd ${PGROOT}/postgresql-X.X
      [ -z ${PGROOT} ] || [ -z ${PGHOME} ] || \
      time ./configure \
      --prefix=${PGHOME}  \
      --with-python



2.04> make & Regression Tests

  • 시스템 내 소스트리 구성 후 컴파일 수행
    • GNU Library 구성 필수 사전 확인 | make --version

  • 설치 구성 예제
    # make commands Execution
      cd ${PGROOT}/postgresql-X.X
      time make all #Default
     
      # !!권장!!
      # 모든 설명과 모듈을 포함하여 구축할 수 있는 모든 것을 구성할 경우
      # - HTML/man Page + contrib 모듈 포함
      time make world
     
    # make Regression Tests
    # Tests Passed 확인
      time make check

2.05> Install File - make

  • DBMS 설치 구성 대상의 디렉터리의 권한/소유권 재확인 후 수행
    • 실제 DBMS 구성 EXECUTE BINARY 설치 구간

  • 설치 구성 예제
    # Install File - make
      cd ${PGROOT}/postgresql-X.X
      time make install-world
      time make install-docs
     
     
    # Install LIB TEST
      echo "su - root -c 'ldconfig ${PGHOME}/lib'"

2.06> Create - Database Cluster

  • 최초 Postgres 구성을 위한 initdb 작업 수행 >> PostgreSQL 15 Docs - Chapter 19.2/3

    • 최초 initdb-postgres DB 구성 작업

  • 설치 구성 예제 - initdb

    # Init DB - Catalog Postgres DB구성
      pg_ctl -D ${PGDATA} initdb

    # PostgreSQL Server Start Test
      postgres -D ${PGDATA}

    # PostgreSQL Server Start
      pg_ctl -D ${PGDATA} -l ${PGBASE}/logfile start
      ps -ef | grep postgres

    # Postgres InitDB - User Password Setup
      psql postgres
      # 접속 확인
      \password =>> 이후 패스워드 지정 postgre

2.07> 기본 Configure File 수정

  • LogFile 및 Network 대역 관련 기본 수정 사항 반영

  • 설정 구성 방안 >> ${PGDATA}/postgresql.conf

    # postgreSQL Server Configure File 수정
     
    # .01 Logfile 관련 옵션 수정
      log_destination = 'stderr'
      log_directory = 'log'
      logging_collector = on
      log_filename = 'postgresql-%Y-%m-%d.log'
      log_file_mode = 0600
      log_rotation_age = 1d
      log_rotation_size = 10MB
      log_truncate_on_rotation = on
      log_timezone = 'Asia/Seoul'
     
    # .02 Network 접속 대역 관련 옵션 수정
    # conf 파일 내 CONNECTIONS AND AUTHENTICATION 영역
      listen_addresses = '*'
  • 설정 구성 방안 >> {PGDATA}/pg_hba.conf

    # postgreSQL hba Configure File 수정
    # .01 Network Table 수정
      #IPv4 Local Connection Setup 중 추가
      host all all 0.0.0.0/0 scram-sha-256