3. PostgreSQL Cluster의 정의
단일 PostgreSQL 서버 인스턴스가 관리하는 데이터베이스 모음
FROM - https://www.postgresql.org/docs/14/tutorial-concepts.html
이 내용을 풀어보면 test, template, template1 등의 데이터베이스가 Postgres 도구 및
프로세스에 의해 생성 및 관리되는 파일 세트가 있는 데이터 디렉토리를 말한다.
이러한 파일에는 데이터베이스, 테이블 및 상호 작용하는 기타 모든 논리적 엔터티가
포함됩니다.
postgres 라는 마스터 프로세스는 실행할 때 이 디렉토리의 파일을 관리하고 콘텐츠를 조작하기
위한 인터페이스를 제공합니다.
4. PostgreSQL 클러스터는 언제 쓰나?
한 줄 정의 - PostgreSQL 데이터베이스를 사용하려면 처음에 반드시 사용하게 된다.
초기 클러스터는 다음과 같이 만든다.
initdb <data_directory>
또는 다음과 같이 만들 수 있다.
pg_createcluster <option> <version> <cluster_name>
5. PG 클러스터를 쉽게 사용하기 위한 여러 명령어들
pg_createcluster - 클러스터 생성
pg_ctlcluster - start/stop/restart/reload a PostgreSQL cluster
pg_dropcluster - 클러스터 제거
pg_lsclusters - show information about all PostgreSQL clusters
pg_renamecluster - 클러스터의 이름 변경
pg_upgradecluster - PostgreSQL 클러스터 업그레이드 명령
6. pg_ctlcluster
pg_ctlcluster [options] cluster-version cluster-name action [-- pg_ctl options]
options = man pg_ctlcluster
action = start|stop|restart|reload|status|promote
promote = 실행 중인 대기 서버에 복구를 종료하고 읽기-쓰기 작업을
시작하도록 명령
pg_ctl options는 pg_ctl가 전달받은 인자를 기술
7. pg_dropcluster
pg_dropcluster [--stop] cluster-version cluster-name
이 프로그램은 주어진 PostgreSQL 클러스터에 속한 모든 파일을 제거합니다. data, wal 및
tablespace 디렉토리, 로그 파일 및 pg_createcluster(1)에 의해 생성된 모든 구성 파일이 포함됩니다.
이후 구성 디렉토리(/etc/postgresql/version/cluster)가 비어 있으면 이 디렉토리도 제거됩니다.
/var/run/postgresql 또는 /tmp 이외의 빈 소켓 디렉토리도 제거됩니다.
일반적으로 실행 중인 서버가 연결되어 있는 클러스터는 삭제되지 않습니다. 이를 무시하기 위해
--stop 옵션은 파일이 제거되기 전에 서버를 강제로 종료합니다.
8. pg_lsclusters
pg_lsclusters [options] [version [cluster]]
이 명령은 모든 클러스터의 상태 및 일부 구성 세부 정보를 나열합니다. 버전 및
선택적으로 클러스터 이름이 제공되면 이들만 표시됩니다.
options에 -j 옵션을 제공하면 json 형태의 값도 받을 수 있음(단, libjson-perl 패키지
필요)
9. pg_renamecluster
pg_renamecluster version oldname newname
pg_renamecluster는 PostgreSQL 클러스터의 이름을 변경합니다. /var/log/postgresql/의 기존 로그
파일도 이름이 바뀝니다. 클러스터는 작업을 위해 중지되고 시작됩니다.
변경된 경로 이름을 참조하도록 postgresql.conf 구성 옵션이 업데이트되었습니다: data_directory,
hba_file, ident_file, external_pid_file, stats_temp_directory, cluster_name.
10. pg_upgradecluster
pg_upgradecluster [-v newversion] oldversion name [newdatadir]
pg_upgradecluster는 기존 PostgreSQL 서버 클러스터(예: postgres 인스턴스가 제공하는 데이터베이스모음)를
newversion(기본값: 사용 가능한 최신 버전)으로 지정된 새 버전으로 업그레이드합니다. 이전 버전의 구성 파일이 새
클러스터에 복사되고 새 버전에 맞게 조정됩니다. 새 클러스터는 이전 클러스터가 데이터 페이지 체크섬을 사용하는
경우 데이터 페이지 체크섬을 사용하도록 설정됩니다.
업그레이드된클러스터는 원래 포트를 사용하므로 이전 버전의 클러스터는 이전에 사용하지 않은 포트를 사용하도록
구성됩니다. 이전 클러스터는 자동으로 제거되지 않습니다. 업그레이드 후 새 클러스터가 실제로 예상대로
작동하는지 확인하십시오. 그렇다면 pg_dropcluster로 이전 클러스터를 제거해야 합니다. 이전 클러스터는 실수로
변경하는 것을 방지하기 위해 "수동" 시작 모드로 설정되어 있습니다. 이것은 시스템 부팅 시 자동으로 시작되지
않는다는 것을 의미하며, 시작/중지하려면 pg_ctlcluster를 사용해야 합니다.
11. PG 업그레이드를 클러스터 단위로 사용하는 방법
1. pg_lsclusters로 동작중인 클러스터 확인
2. 동작중인 구 버전 PostgreSQL 정지
3. 동작중인 새 버전의 클러스터 이름 변경 (main -> main_pristine)
4. pg_upgradecluster 명령으로 클러스터 업그레이드
5. 정지해놓았던 PostgreSQL 구동
12. PG 클러스터의 백업과 이전
PG 클러스터를 정지하고 클러스터 디렉터리를 압축하거나 다른 곳으로 복사하면
완벽한 백업이 됨
단, 복원 시 기존에 사용하던 클러스터 버전과 동일한 버전을 사용해야 함(클러스터
서버가 정지되어 있어야 함)
13. 테이블 클러스터링 이야기 #1
테이블 클러스터링 왜 하나?
데이터를 다른 데이터 보다 더 자주 접근하고 자주 사용하는 데이터들을 그룹핑할 수 있는 인덱스가
존재한다면 클러스터를 사용하는 것이 도움이 된다. 만약 인덱스로 쓰이는 값들 중 특정 범위의 것들을
찾으려고 한다면 또는 단일 인덱스에 여러 행이 매치되는 경우 클러스터는 도움이 된다. 왜냐하면 한번
인덱스가 테이블의 페이지에서 첫번째 행에서 일치하는 것을 찾았다면 다른 모든 일치하는 행들은 같은
페이지 안에 속해있을 확률이 높기 때문에 디스크 접근 을 줄일 수 있고 쿼리의 속도를 높일 수 있다.
14. 테이블 클러스터링 이야기 #2
테이블 클러스터링을 하는 방법 (단, 테이블 클러스터링은 이미 인덱스가 있어야만 사용할 수 있음)
CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER ( option [, ...] ) table_name [ USING index_name ]
CLUSTER [VERBOSE]
where option can be one of:
VERBOSE [ boolean ]
클러스터링이 실행된 백엔드는 pg_stat_progress_cluster 뷰를 통해서 클러스터링 상태를 파악할 수 있다.
15. 테이블 클러스터링 이야기 #3
테이블 클러스터링을 할 때 주의할 내용
- 테이블 클러스터링은 일회성 작업으로 새로 업데이트되는 자료는 테이블 클러스터링으로 변경된
인덱스를 반영하지 않는다.
- 테이블 클러스터링을 하기에 앞서 maintenance_work_mem 설정값을 가능한 큰 값으로 설정하는
것을 권장한다.
- 잦은 클러스터링이 필요한 경우 테이블의 fillfactor 스토리지 파라메터를 기본값 100%에서 조금 더
낮은 값으로 지정하는 것이 유리하다.
- 클러스터링은 운영자가 수동으로 명령을 내려주어야 한다.
16. 테이블 클러스터링 이야기 #4
테이블 클러스터링의 특징
테이블이 클러스터 될 경우 postgreSQL은 어떤 인덱스로 클러스터 되었는지 기억한다. 덕분에 인덱스
이름이 없어도 이전에 클러스터 했던 인덱스로 클러스터링을 해준다.
ALTER TABLE 명령어로 CLUSTER 또는 SET WITHOUT CLUSTER 로 미래에 클러스터에 사용될 인덱스의
설정하거나 이전의 모든 클러스터 관련 설정을 지울 수 있다.
아무런 인수 없이 CLUSTER 를 하면 현재 데이터베이스에서 가장 최근에 클러스터 된 테이블이 다시
클러스터된다. 트랜잭션 블록 내에서는 클러스터를 사용할 수 없다.
테이블이 클러스터 될 때에는 ACCESS EXCLUSICE LOCK이 걸린다. 이 락은 클러스터가 끝날 때 까지 이
테이블 내에서 읽기 쓰기가 모두 제한됨