Note-Notice
➽|PostgreSQL 설치 > 확장옵션
- PostgreSQL 15 기준으로 문서 작성됨
- File Check : postgresql-15-A4.pdf
- 기본적으로 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
- OS Server Setup :
- 대부분의 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존재
- 기본 Initilize DB,
- 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 구성을 기본 구성으로 쫓아감
- OS Parameter
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에서 발생하는 문제는 따로 분석 및 확인해야함
- 단 Storage Layer에서 발생하는 문제는 따로 분석 및 확인해야함
- PostgreSQL 관리 시 향후
- 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의 사전 설계 필수
- 전체 자원보다 큰 값에 대해서 PostgreSQL의 사전 설계 필수
- “System V” 방식의 공유메모리를 작은 사이즈로 할당받고
- “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
- 미지정 권장 / 최소 : 1
kernel.shmall>>/proc/sys/kernel/shmall- Shared Memory로 구성 가능한 최대/전체 사이즈 (Bytes)
- 설정 값
SHMMAX와 동일한 사이즈로 구성- PostgreSQL 외 별도 어플리케이션이 사용할 메모리량까지 합산 필요
kernel.shmseg>> “hardcore”- 각 프로세스의 Shared Memory Segment의 최대 값 지정
- 설정 값
- 최소 : 1 이상 / 기본 설정 값이 1보다 큼으로 지정 X
- 최소 : 1 이상 / 기본 설정 값이 1보다 큼으로 지정 X
kernel.shmmni>>/proc/sys/kernel/shmmni- 시스템 system-wide로 설정된 Shared Memory Segment의 최대 값
- 설정 값
- 다른 프로그램이 사용할 파라미터 | 기본 : 4096
- 다른 프로그램이 사용할 파라미터 | 기본 : 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
- 최소 : >= 17 | 기본 : 250
- 설정 값 기준 : 한개의 PostgreSQL Instance를 구성하기 위한 최소 요건
↳ Linux Memory Overcommit 요건
- 기본 Linux 가상 메모리 동작 시 커널의 메모리 오버커밋이 구현되면
PostgreSQL을 종료할 수 있으므로 최적의 구성이 아님.- 즉 다른 프로세스의 메모리 요구로 인한 가상 메모리가 부족할 수 있는 시스템
- 대부분의 동작상 PostgreSQL의 메모리 부족은 DBMS를 재시작해야만 해소됨.
- 해당 문제를 해결하기 위해 프로세스의 메모리가 부족하지 않도록 PostgreSQL을 운영하는 것
- 메모리가 부족한 경우 SWAP을 사용하는 것도 해결책이 될수 있으나 권장 X
- 실제 메모리/스왑 공간이 부족할 경우에만 메모리 부족 킬러(OOM)이 동작되기 때문
- 결국 SWAP 공간을 메모리로 사용하는 부분과 메모리 상의 속도차이로 인해
성능불균형 및 지연이 발생할수 있으므로 PostgreSQL은 메모리에서만
동작하도록 구성 권장
- 결국 SWAP 공간을 메모리로 사용하는 부분과 메모리 상의 속도차이로 인해
Kernel-vm.overcommit_memory설정-
설정 값
/etc/sysctl.conf -- vm.overcommit_memory=2- 또는 overcommit 비율을 지정
kernel--vm.overcommit_ratio(세부 옵션 확인)
- 또는 overcommit 비율을 지정
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 값에서 처리되지만 필요시 조정
- 프로세스 당 Open File / 유저 당 Open Process 설정에 대한 Hard/Soft 설정
- 대용량 client-connection 대응을 위한 socket_max_connection 조정
- 대량의 client 접속에 따른 maximum socket connection 값을 조정할 필요 있음.
- 대량의 접속이 짧은 시간안에 이루어질 경우, 접속에 장애 및 지연 장애 발생.
- 설정 값
- 기본값 128보다 크게 설정할 것을 권고 | 권고 2048 (Oracle)
/etc/sysctl.conf>>net.core.somaxconnFreeBSD | 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옵션을 활성화 해야함.
- 패키지명 libpython |
요건.03>PL/Tcl 필요 시 Tcl 프로그램 필요- 최소 Tcl >= 8.4
- 최소 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 요건 필요시 구성 가능
- Kerberos/OpenLDAP/PAM 요건 필요시 구성 가능
요건.07>LZ4/Zstandard 구성 요건- 데이터 압축 방식 중 LZ4/Zstandard 필요시 구성 가능
- default_toast_compression 및 wal_compression을 참조
↘ 설치수행.02> Advanced Source 설치
- PostgreSQL 설치는 전체 다음 단계로 이루어짐
- Configure >> Build >> Regression Tests >> Install Files
- 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디렉터리 생성 확인
-
- 업로드 시 postgresql을 구축/실행 할 계정으로 수행 |
↳ 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의 특이점 체크를 위한 단계
- 다양한 시스템 종속 변수 값을 경정하고, 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
- GNU Library 구성 필수 사전 확인 |
- 설치 구성 예제
# 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 설치 구간
- 실제 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-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