본문 바로가기
엑셈 경쟁력/DB 인사이드

DB 인사이드 | PostgreSQL Architecture - 3. Logical Structure

by EXEM 2022. 4. 27.

 

 

Logical Structure

앞서 Physical Structure를 통해 공간 및 파일 관점에서의 PostgreSQL 구성요소를 확인했습니다. 본 문서에서는 사용자 입장에서 실제 관리 대상인 Object, Schema, Database, Tablespace 및 Cluster에 대해 알아보겠습니다.

 

아래는 PostgreSQL의 Logical Structure를 도식화한 것으로 Object로 표현한 가장 하위개념 부터 최상위 요소인 Cluster에 대해 순서대로 알아보도록 하겠습니다.

Object

Object는 Data를 저장하거나 참조하는데 사용되는 데이터 구조를 말합니다. 우리에게 익숙한 테이블(Table), 인덱스(Index), 프로시저(Stored Procedure), 시퀀스(Sequence), 뷰(View) 등이 여기 포함됩니다. 아래 표를 통해 Oracle에서 주로 사용되는 Object와 비교 가능합니다.

 

Schema

PostgreSQL에서 Schema란 다양한 Object들의 집합을 의미합니다. 하나의 Database는 다수의 Schema를 가질 수 있으며 이 중 Public Schema는 CREATE 권한을 포함한 모든 권한이 부여된 기본 Schema입니다.

Schema는 아래와 같은 특징을 가집니다.

  • Schema Owner는 필요에 따라 Schema에 대한 Access를 제어할 수 있습니다.
  • 소유권은 양도할 수 있습니다.
  • Schema 별로 동일한 이름의 Object(테이블, 함수 등)가 존재할 수 있습니다.
📌 Oracle에 익숙한 사람에게는 조금 생소한 개념일 수 있습니다. Oracle의 경우 Schema와 Owner가 합쳐진 형태로 사용되기 때문에 Owner=Schema로 인식되기 때문입니다. 하지만 PostgreSQL에서 이야기하는 Schema란 Role, User, Owner 등 사용자 계정과는 상관없는 단순한 Object들의 집합을 의미합니다.

 

Database

PostgreSQL의 Database는 여러 Schema의 집합을 의미합니다. 타 DBMS와 다르게 PostgreSQL은 Database와 Schema를 엄격히 분리합니다. 그래서, User(Owner)와 Schema가 동일한 의미를 갖는 Oracle과 달리 PostgreSQL에서는 Database → Schema 순서로 접속하여, 해당 Schema에 Object를 구성해야 합니다.

 

특징

  • PostgreSQL 초기화(initDB) 시 template0, template1, postgres 라는 3개의 Database가 생성됩니다. template0과 template1 Database는 사용자 Database를 생성하기 위한 템플릿 Database이며, System Catalog 테이블이 포함되어 있습니다.
  • template0과 template1 Database의 테이블 목록은 initDB 직후에는 동일합니다. 하지만, template1 Database는 필요에 따라 사용자가 Object를 생성할 수 있습니다.
  • Database 생성 시 특정 template 옵션을 사용하지 않으면 template1 Database를 복제하여 생성됩니다.
📌 template1 Database : Database 생성시 참조되는 기본 Database
     template0 Datebase : template1이 문제 생겼을 때 사용되는 Database

 

Role

Role이란 PostgreSQL에서 제공되는 Database 관련 권한들을 특정 이름으로 모아 놓은 것을 의미합니다. 8.0 버전까지는 User와 Group에 의한 계정 및 권한 관리를 하였지만 8.1 버전부터 User와 Group의 개념이 Role로 통합되었습니다.

즉, 현재버전에서는 아래 예제와 같이 User와 Role의 기능적인 차이는 없으며, Role에 LOGIN 권한을 부여하면 일반 사용자 계정처럼 사용 가능합니다.

 

CREATE ROLE user01       PASSWORD '12345' ;
CREATE ROLE user02 LOGIN PASSWORD '12345' ;
CREATE USER user03       PASSWORD '12345' ;
postgres=# \du
                                    List of roles
 Role name |                         Attributes                         |  Member of
-----------+------------------------------------------------------------+--------------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 user01    | Cannot login                                               | {}
 user02    |                                                            | {}
 user03    |                                                            | {}

 

📌 PostgreSQL 8.1 Document 내용 중 CREATE USER 부분
CREATE USER는 새로운 데이터베이스 Role을 정의하는 것으로, 현재(PostgreSQL 8.1이상)는 CREATE ROLE의 별칭이다. 차이점은 CREATE USER는 Login 옵션이 포함되어 있고, CREATE ROLE은 Login 옵션이 포함되어 있지 않다.

PostgreSQL 8.1 Document 내용 중 CREATE GROUP 부분
CREATE GROUP은 새로운 데이터베이스 Role을 정의하는 것으로, 현재(PostgreSQL 8.1이상)는 CREATE ROLE의 별칭이다.

 

특징

  • Role은 개별 Database가 아닌 Cluster 레벨에서 공통으로 사용됩니다.
  • Role은 Object(테이블, 함수 등)를 소유할 수 있으며, Object에 대한 권한관리를 할 수 있습니다.
  • Role 삭제 시 Role이 소유한 Object에 대한 처리(삭제 또는 owner변경)가 먼저 수행되어야 합니다.
  • Role 권한의 종류는 아래와 같습니다.

Tablespace

Tablespace란 Object(테이블, 인덱스 등)가 저장되는 파일시스템의 위치를 정의해 놓은 것을 의미하며 일반적으로 공간 관리의 목적으로 사용됩니다. 또한 PostgreSQL의 Tablespace는 Oracle과 달리 여러 Database가 함께 사용할 수 있습니다.

PostgreSQL은 기본적으로 다음과 같은 두개의 Default Tablespace가 존재합니다.

  • pg_default : 모든 사용자의 Data를 저장 (위치 : $PGDATA/base)
  • pg_global : 모든 Global 데이터(Cluster)를 저장 (위치 : $PGDATA/global)
📌 테이블스페이스 디렉토리 구조는 Physical Structure 을 참조하세요.

위와 같은 Default Tablespace 외에 사용자 Tablespace도 사용이 가능한데, 생성시 OWNER 정보와 LOCATION 정보를 기술할 수 있습니다. 이런 경우 Tablespace의 실제 Data는 LOCATION 경로에 위치하게 되며, $PGDATA/tblspc 경로에는 LOCATION 위치를 가리키는 심볼릭 링크가 생성됩니다.

 

CREATE TABLESPACE tbs01
OWNER user01
LOCATION '/pg_tbs' ;

postgres=# \db
       List of tablespaces
    Name    |  Owner   | Location
------------+----------+----------
 pg_default | postgres |
 pg_global  | postgres |
 tbs01      | user01   | /pg_tbs

 

특징

  • Tablespace를 생성하는 User(Role)가 Tablespace의 소유자(Owner)입니다.
  • Tablespace 생성 시 OWNER 절에 이름을 지정하여 소유권을 지정할 수 있습니다.
  • Tablespace 생성 시 LOCATION 절에 정의된 경로가 실제 Data를 저장하는 위치이므로 해당 파일시스템은 PostgreSQL의 시스템 사용자(OS User)가 소유해야 합니다. (읽기/쓰기 권한)
  • Object 사용 패턴에 따라 저장 공간을 달리 하여 성능 최적화를 할 수 있습니다. 한 예로, 자주 사용되는 Object는 SSD와 같은 빠른 Disk에 Tablespace를 구성하고, 자주 사용되지 않는 Object는 보다 느린 Disk에 Tablespace를 구성하여 위치시킬 수 있습니다.
📌 하나의 Tablespace는 하나의 파일시스템 위치로 구성됩니다. 반면, 하나의 파일시스템에는 여러 개의 Tablespace를 구성할 수 있습니다. 

 

주의사항

  • Tablespace는 data 디렉토리에 포함된 메타데이터에 종속되므로, 다른 Database Cluster에 연결해 사용하거나 개별적으로 백업 할 수 없습니다.
  • Tablespace의 장애(파일삭제, 디스크장애)가 발생하면, Database Cluster가 동작하지 않습니다.

Cluster

PostgreSQL에서 Cluster란 여러 Database와 Role, Tablespace의 집합을 의미합니다. Cluster 내부에는 서로 격리되어 있는 여러 개의 Database가 존재합니다. 최초 PostgreSQL 설치 시 기본적으로 postgres, template0, template1 Database가 생성되는데, 이러한 Database 집합체를 Cluster라고 부릅니다.

  • Object의 집합 → Schema
  • Schema의 집합 → Database
  • Database의 집합 + Role + Tablespace → Cluster
📌 Oracle에서 Cluster는 RAC 환경의 공유 노드 개념으로 하나의 스토리지를 바라보는 여러 대의 노드, Oracle Grid Instructure(Clusterware Software)를 통한 Active-Active 환경을 조성하고 Clusterware를 통해 이루어진 공유 노드를 Cluster라고 합니다.

 

 

기획 및 글 | 기술기획팀

이미지 제작 | 디자인그룹 이민석

 

 

 

댓글