1. 程式人生 > 其它 >PostgreSQL資料目錄深度揭祕

PostgreSQL資料目錄深度揭祕

簡介:PostgreSQL是一個功能非常強大的、原始碼開放的客戶/伺服器關係型資料庫管理系統(RDBMS),被業界譽為“先進的開源資料庫”,支援NoSQL資料型別,主要面向企業複雜查詢SQL的OLTP業務場景,提供PostGIS地理資訊引擎、阿里雲自研多維多模時空資訊引擎等。本文著重介紹PostgreSQL的資料目錄,其中儲存著配置檔案、資料檔案、事務日誌和WAL日誌等重要檔案,所有客戶建立的資料檔案和初始配置檔案都可以在資料目錄中找到,因此資料目錄是重要的客戶價值所在。

作者 | 市隱
來源 | 阿里技術公眾號

一 概述

PostgreSQL是一個功能非常強大的、原始碼開放的客戶/伺服器關係型資料庫管理系統(RDBMS),PostgreSQL被業界譽為“先進的開源資料庫”,支援NoSQL資料型別(JSON/XML/hstore),主要面向企業複雜查詢SQL的OLTP業務場景,提供PostGIS地理資訊引擎、阿里雲自研多維多模時空資訊引擎等。

本文著重介紹PostgreSQL的資料目錄,其中儲存著配置檔案、資料檔案、事務日誌和WAL日誌等重要檔案,所有客戶建立的資料檔案和初始配置檔案都可以在資料目錄中找到,因此資料目錄是重要的客戶價值所在。

二 名詞

1 OID

資料庫物件是資料庫儲存或引用的資料結構體,資料庫本身也是資料庫物件,同時包括表、索引、檢視、序列和函式等。Object ID是資料庫物件的唯一識別符號,儲存在無符號四位元組的整形變數中,所有資料庫物件各自對應一個OID。PostgreSQL有兩個檢視各司其職,分別儲存著不同類別的OID,其中pg_database儲存資料庫本身物件的OID,pg_class儲存表、索引和序列等物件的OID。

2 Relation

關係代表非資料庫本身的資料庫物件,包括表、檢視、索引和toast等,不包括資料庫本身。

3 MVCC

Multi-Version-Concurrency-Control是一種併發控制機制,資料庫引擎根據不同的事務隔離級別,通過查詢事務快照和事務提交日誌來完成元組的可見性檢查。如果希望理解資料庫機制原理,MVCC是必不可少的學習知識。

4 Page

資料庫檔案在Linux平臺被劃分為預設8K固定長度的page進行管理,通過啟動引數BLCKSZ可以預設page的大小。如果page設低了,相同資料量的檔案需要分裂成更多的page,IO次數和索引分裂次數都會增加,效能會降低較多;如果page設高了,page內部的資料檢索效率會降低,效能一樣會降低不少,一般來說8K和16K對於資料庫系統來說是最優解。

三 資料目錄

資料目錄預設在/var/lib/pgsql/data下,支援使用環境變數$PG_DATA管理。下圖所示是資料目錄的一級結構,後續會重點介紹具有代表性的重要檔案和目錄,比如base、pg_xact等。

四 base

1 概述

base目錄儲存使用者建立的資料庫檔案,及隸屬於使用者資料庫的所有關係,比如表、索引等。

2 一級目錄

目錄結構分為兩級,第一級結構如下圖所示,一級目錄名是使用者資料庫物件的OID,1代表的是postgres資料庫,一級目錄內的二級子檔案都是隸屬於該資料庫物件的關係,包括表、索引、檢視等。

3 二級檔案

二級子檔案如下圖所示,儲存著某個資料庫內的所有關係,包括表、索引、檢視等,這裡以postgres資料庫目錄示例。二級子檔案分為三大類,第一類是以關係OID命名的主資料檔案,第二類是檔名以_fsm結尾的空閒空間對映檔案,第三類是檔名以_vm結尾的可見性對映檔案。

4 主資料檔案

主資料檔案儲存隸屬於對應資料庫下的資料庫關係檔案,包括資料、索引等,客戶最重要的業務資料便是儲存在主資料檔案中。

當關系檔案大小低於RELSEG_SIZE × BLCKSZ時,資料庫引擎建立名稱為pg_class.relfilenode的單檔案,反之會切分為名稱如pg_class.relfilenode.segno的多個檔案。單個關係檔案內部被劃分為預設8K固定大小的多個page並存儲在磁碟上,8K可以在initdb時通過BLCKSZ引數修改配置。主資料檔案寫入時,會先將元組資料從行指標陣列的底部開始堆疊,直到空間耗盡。

使用者通過SQL查詢到的單行資料記錄對應單個元組(tuple),因為MVCC機制的原因,元組可能是無法查詢到舊版本資料,也可能是活躍的新版本資料,舊版本資料會在未來的某個時刻被清理。當查詢沒有命中索引觸發順序掃描時,資料庫引擎順序掃描page的行指標讀取到元組,反之如果命中B樹索引,引擎會通過索引檔案的元組,通過索引鍵的TID值讀取到元組。

下圖是主資料檔案的層級結構。

下表格是上圖所示page內部結構的元資料資訊。

下表格是上圖所示tuple內部結構的元資料資訊。

5 FSM

FSM是空閒空間對映檔案,記錄著heap和index的每個page的空閒空間資訊,有利於快速定位到有充足空閒空間的page以便儲存tuple,如果沒有定位到則需要擴充套件新page。除了Hash Index檔案沒有FSM檔案,其他heap和index都需要FSM檔案。

總體上,FSM採用3-4級多叉樹的結構組織FSM page,單個FSM page內部採用完全二叉樹的結構進行管理,高級別FSM page的葉子節點關聯低級別的FSM page,低級別FSM Page的葉子節點儲存著heap、index page的可用空間數目,而非葉子結點依次儲存葉子節點的最大可用空間數目,每個節點佔用1個位元組。

6 VM

VM是可見性對映檔案,記錄著每個heap page的可見性資訊,因此index page並沒有vm檔案。一方面它可以提高vacumn的執行效率,另一方面通過vm檔案可以感知到page內的元組是否全部可見,如果全部可見的話,查詢引擎查詢索引元組直接獲取到資料即可,不必再訪問資料元組檢查可見性,減少了回表次數,極大提升了查詢的效率。

VM採用點陣圖的結構儲存可見性資訊,每個heap page只在vm檔案中儲存2位,第一位代表元組是否全部可見,第二位代表元組是否全部被凍結。

#define VISIBILITYMAP_ALL_VISIBLE  0x01
#define VISIBILITYMAP_ALL_FROZEN  0x02

五 global

1 概述

global目錄儲存pg_control及資料庫叢集維度的資料庫及其關係,非客戶維度的資料,例如pg_database、pg_class等。目錄內的檔案結構和base是一致的。

global目錄檔案結構如下圖所示。

2 pg_control

pg_control檔案記錄資料庫叢集控制資訊,包括initdb初始化、WAL和checkpoint的資訊。

六 pg_wal

1 概述

pg_wal是WAL機制中的wal日誌儲存目錄。PG10及之後的高版本改目錄名為pg_wal,10之前目錄名稱是pg_xlog。

2 WAL機制

Write-Ahead-Logging:日誌先行機制。資料變更優先寫入日誌檔案,事務失敗則變更記錄被忽略,事務成功再選擇合適時機寫入資料檔案,資料的刷盤速度慢於日誌刷盤速度。當資料庫系統崩潰後,引擎會從上一次成功的checkpoint點開始依次重放wal記錄,如果LSN>pd_lsn則重放wal記錄,反之跳過,確保資料記錄恢復到崩潰前的狀態。

3 檔案結構

4 wal segment

wal段檔案儲存著資料庫行記錄明細,每一條記錄明細都是服務於資料庫恢復操作的,確保前後資料一致。首先針對資料的任意一次修改操作均被記錄在wal段檔案中,包括insert、update和delete,其次系統的一些管理行為也會被記錄在wal段檔案中,例如事務提交和vacuum等行為。

wal段檔案命名形如00000001 00000001 00000092,檔名共24位,前8位是timeline,中間8位是logid,後8位是logseg,logseg的前6位始終是0,後2位是lsn的前2位。根據wal段檔名的最後2位,wal記錄根據對應的LSN分別記錄在不同的wal段檔案中。

5 .history

.history檔案內容包括原.history檔案,當前時間線切換記錄和切換原因,作用於資料庫的時間點恢復行為。當資料庫引擎從多個時間線的備份中恢復時,資料庫從.history檔案中找到從pg_control的start_timeline到指定的recovery_target_timeline間的所有wal段檔案進行恢復。

6 archive_status

archive_status是wal段檔案的備份目錄,包括.ready和.done檔案。超出wal_keep_segments數目限制的wal日誌會在archive_status目錄內被打標,歸檔操作完成後被進一步移除。

7 .ready

.ready是同名wal段檔案在archive_status目錄內的標記檔案,代表該wal段檔案可被歸檔。wal段檔案在資料目錄中的儲存檔案數量是有上限的,一般通過wal_keep_segments引數來約束,因此資料庫引擎在wal段檔案個數達到上限後會在archive_status目錄內增加可移除的wal段檔案的標記檔案,檔名是原wal段檔名後增加.ready字尾,等待歸檔工具進行歸檔。

8 .done

.done是同名wal段檔案在archive_status目錄內的標記檔案,代表該wal段檔案已被歸檔,可以被清理。資料庫引擎預設通過archive_command命令對.ready檔案進行歸檔,歸檔成功與否取決於archive_command命令返回true還是false,當archive_command返回true時,代表與.ready檔案同名的wal段檔案已被歸檔,引擎再將該檔案的副檔名重新命名為.done,等待資料庫引擎在下一次的checkpoint時進一步清理原wal段檔案。

七 pg_xact

1 概述

pg_xact是事務提交日誌(Commit Log)的儲存目錄,事務提交日誌預設256KB,檔名形如NNNN,系統初始化後從0000開始遞增至FFFF。PG 10及之後的高版本改目錄名為pg_xact,10之前目錄名稱是pg_clog。

下圖是pg_xact目錄下的clog檔案,027E前的檔案因為事務已被凍結,所以被vacuum清理完畢。

2 Commit Log

事務提交日誌儲存資料庫的單個事務執行狀態。Commit Log由共享記憶體中一組8KB的page組成,每個page包含一列陣列,每個陣列元素包含XID和該事物的實時狀態。當page不足時,建立新的page來儲存新的事務。

八 配置檔案

1 postgresql.conf

postgresql.conf檔案儲存著配置檔案的位置、資源限制、叢集複製等引數資料,是資料庫執行時最重要的配置檔案。

2 postgresql.auto.conf

postgresql.auto.conf檔案儲存著資料庫的全域性配置引數,資料庫引擎在啟動時載入postgresql.auto.conf檔案後,覆蓋postgresql.conf檔案中已有的配置,形成最終的資料庫啟動配置。

3 pg_hba.conf

pg_hba.conf檔案負責客戶端的連線和認證,起到防火牆的作用,格式是:TYPE / DATABASE / USER / ADDRESS / METHOD。

九 總結

本文從肉眼可見的資料目錄及其子檔案開始展開,由淺入深直到不可見的原始碼結構體維度,詳細介紹了資料目錄及其子檔案的結構和作用。大家通過了解資料目錄的檔案體系結構,能夠對PostgreSQL資料庫全貌有個總體概覽,無論是日常運維、核心研發,還是業務開發,這些都是必須掌握的基礎知識。

原文連結
本文為阿里雲原創內容,未經允許不得轉載。