分享於

總覽

PostgreSQL 是一個功能強大的關聯式資料庫,能夠服務於許多不同的使用案例。在將其用於您的專案之前,最好先概略了解 PostgreSQL 的運作方式、它與其他關聯式資料庫的不同之處,以及有哪些功能可用於協助您塑模和管理資料。

本指南將介紹 PostgreSQL 的架構和屬性,讓您大致了解資料庫系統的運作方式。此總覽將幫助您了解應用程式架構、使用者通常與之互動的方式,以及它如何透過擴展和安全功能來支援資料完整性和成長。

PostgreSQL 的客戶端 / 伺服器架構

與許多關聯式資料庫系統一樣,PostgreSQL 的基本架構遵循客戶端-伺服器模型。

主要的 PostgreSQL 程式作為服務執行,負責定義資料結構、儲存資料和回應查詢。此常駐程式監聽來自客戶端的連線,客戶端可以驗證自己的身份,然後向伺服器發送指令。伺服器會以訊息回應,指示成功、失敗、查詢結果或其他適當資訊。

此架構允許 PostgreSQL 系統為許多不同的客戶端提供服務,這些客戶端可以本地或透過網路連線。主 PostgreSQL 程序會為接收到的每個客戶端連線 fork 一個新程序。因此,每個 fork 都專用於單一客戶端連線,因此連線數、fork 數和資料庫工作階段彼此對齊。

概念

  • 伺服器:在客戶端-伺服器架構中,伺服器是一種軟體,它接受來自外部客戶端的連線以執行工作。它監聽請求、處理適當的資訊,並將任何相關結果傳回給使用者。
  • 客戶端:在客戶端-伺服器架構中,客戶端是一種軟體,使用者與之互動以連線到伺服器並與之通訊。客戶端將使用者的請求轉發到伺服器,並傳回任何相關資訊。
  • Fork:Fork 是正在執行程序的複製品,通常用於協助控制資源使用、權限層級和建立新的執行環境。
  • 資料庫工作階段:資料庫工作階段是資料庫伺服器和客戶端之間的單一、持續連線。工作階段有自己的上下文,該上下文在工作階段的生命週期內持續存在,允許在每個工作階段的基礎上進行一定程度的狀態和組態。

PostgreSQL 的預設客戶端:psql

使用者可以使用各種客戶端連線到 PostgreSQL 伺服器。作為 PostgreSQL 發行版本一部分實作的預設命令列客戶端稱為 psql

psql 客戶端可以連線到本機或遠端資料庫,並以批次或互動方式處理查詢。對於自動化使用案例,身份驗證憑證可以儲存在專用的身份驗證檔案中,並且查詢可以由客戶端從檔案中讀取。

互動式 psql 工作階段會在身份驗證後將使用者置於 PostgreSQL 命令提示字元。從那裡,您可以將 SQL 發送到客戶端,並在終端機視窗中檢視結果,或將結果導向到輸出檔案。

您也可以透過在 psql 客戶端中實作的一系列 meta-command 來修改資料庫和管理 PostgreSQL 本身。Meta-command 是非 SQL 的「生活品質」捷徑,以「\」開頭,可讓您查詢有關資料結構和系統的資訊。

例如,您可以使用 \dt meta-command 列出所有可用的表格,或使用 \conninfo meta-command 顯示有關目前連線的資訊。您可以在 psql 工作階段期間使用 \h\? meta-command 分別取得有關 SQL 或 meta-command 的資訊。

概念

  • 批次處理:批次處理是一種策略,用於以群組方式執行一組操作,而不是逐一執行。批次處理通常是自動化工作流程的組成部分,因為它允許腳本和其他程序發送複合請求。
  • 互動式工作階段:互動式工作階段是使用者使用臨時命令與資料庫介面互動的資料庫工作階段。這與非互動式模式形成對比,在非互動式模式中,整組指令會在沒有使用者介入的情況下發送到伺服器。
  • Meta-command:在 psql 中,meta-command 是指由 psql 本身攔截和處理,而不是由資料庫系統作為 SQL 陳述式處理的命令。這些主要是生活品質的改進,讓使用者可以取得有關資料庫伺服器、連線和資料庫物件結構的資訊,而無需記住複雜的查詢。

使用 PostgreSQL 角色和權限進行身份驗證和授權

PostgreSQL 使用角色和權限來驗證誰在連線到系統,並確定他們被允許執行哪些操作。

在 PostgreSQL 中,角色是特定功能、權限和「擁有」實體的群組。PostgreSQL 沒有「使用者」和「群組」的獨特概念,而是使用角色來代表這兩種概念。角色可以對應於現實世界中的個人,也可以作為具有特定存取權限的群組運作,其他角色可以成為其成員。

此系統在組織存取層級方面提供了極大的彈性。身份驗證方法可以根據角色定義,並且可以將特定資料庫實體的授權授予特定角色。作為其他角色成員的角色將繼承來自這些角色的存取權限。

PostgreSQL 有一些重要的預設值,這些預設值會影響使用者登入和權限方面的開箱即用行為。新的安裝通常配置為對等身份驗證,這允許使用者自動驗證到任何與其作業系統使用者相符的 PostgreSQL 角色。基本上,這將使用者身份驗證卸載到作業系統。任何具有相符 PostgreSQL 角色名稱的作業系統使用者都被假定為信任該身份。必須單獨授予在資料庫上執行有用工作的授權。

概念

  • 角色:在 PostgreSQL 中,角色是個人使用者和使用者群組的替代和組合。使用者可以驗證角色以取得對其權限的存取權。角色可以成為其他角色的成員以繼承其權限。
  • 對等身份驗證:對等身份驗證是預設為大多數 PostgreSQL 安裝配置的預設身份驗證機制。對等身份驗證允許使用者在沒有其他憑證的情況下驗證到與其作業系統使用者名稱相符的 PostgreSQL 角色。對等身份驗證基於系統管理員也是資料庫管理員的假設。
  • 授與:PostgreSQL 中的授與是宣告授予角色的執行特定操作的權限。角色也可以被「授與」另一個角色的成員資格,使其繼承父角色的任何授與。

了解 PostgreSQL 物件階層:資料庫、結構描述和表格

在大多數情況下,PostgreSQL 在資料庫物件方面遵循傳統的關聯式資料庫命名慣例。但是,PostgreSQL 與常見定義不同的其中一點是它定義結構描述的方式。

大多數資料庫使用結構描述一詞來指代資料庫中的一般資料庫結構或表格定義。例如,您可能會看到或 SQL,它定義了具有產品 ID、描述和計數字段以及相關約束的 product 表格,稱為 product 表格的結構描述。

但是,PostgreSQL 結構描述是一個特定的資料庫物件,可以在系統中建立和管理。了解 PostgreSQL 中物件的階層可以幫助您在熟悉系統和閱讀文件時避免混淆。

PostgreSQL 的主要「全域」物件是資料庫叢集,它只是 PostgreSQL 伺服器管理的資料庫集合的名稱。資料庫叢集包含資料庫、角色和其他「全域」實體。

結構描述在資料庫中定義為表格、函數、資料類型和運算子的容器。物件名稱在結構描述必須是唯一的,但可以在不同的結構描述中重複使用,這允許使用者在沒有命名衝突的情況下共用資料庫。它們還有助於透過區隔和隔離資料庫中的物件來分組物件或管理第三方應用程式。

表格和其他物件在結構描述中建立。預設情況下,如果未命名替代結構描述,則在定義表格和其他物件時會使用名為「public」的結構描述。實際上,這使得使用結構描述進行區隔成為一種可選的做法。在許多情況下使用 PostgreSQL 結構描述很有幫助,但如果您不需要它們,則可以忽略它們。

概念

  • 資料庫叢集:在 PostgreSQL 術語中,資料庫叢集是由單個 PostgreSQL 伺服器管理的資料庫和相關物件的集合。資料庫叢集是由 PostgreSQL 伺服器管理的環境。
  • 資料庫:資料庫是資料庫叢集中的一個物件,它定義了結構描述、角色和其他物件。由於角色是在資料庫中定義的,因此資料庫是使用者針對其進行身份驗證的物件。
  • 結構描述:在 PostgreSQL 中,結構描述是資料庫中的命名空間物件。結構描述包含表格、資料類型、函數和運算子。物件名稱在結構描述內必須是唯一的,但相同的名稱可能存在於不同的結構描述中。
  • 表格:表格是 PostgreSQL 中的主要資料定義結構。表格定義欄位和約束,以控制可以輸入的資料類型。表格將資料儲存在它們定義為記錄的結構中。

並行和隔離控制

資料庫並行和隔離控制有助於系統管理多個使用者嘗試同時存取相同資料的實例。對於資料庫來說,制定處理此問題的策略非常重要,以避免不一致的讀取、提交衝突的變更和競爭條件。

PostgreSQL 使用稱為多版本並行控制 (MVCC) 的策略來處理這些情況。MVCC 的運作方式是對相關資料的快照執行 SQL 陳述式。此資料快照提供交易隔離,確保每個交易都可以獨立套用或回滾,並且它們在一致的資料集上運作。

這種並行管理讓 PostgreSQL 可以避免鎖定,鎖定是一種技術,它在操作期間將資料的獨佔存取權授予一個程序。鎖定在協助隔離控制的同時,會阻止並行存取並影響效能,因為查詢會等待鎖定被釋放才能存取資料。

PostgreSQL 的 MVCC 實作允許讀取和寫入陳述式永遠不會互相阻止,這可能會對效能產生深遠的影響。多個交易隔離層級可用,具體取決於您對不同類型隔離問題的容忍度。如果您想使用自己的系統管理更精細的並行範圍,也可以使用表格和列層級鎖定。

概念

  • 交易隔離:交易隔離是一種品質,可確保交易是原子且一致的。這表示交易中的操作要么全部套用到資料,要么全部回滾。交易隔離還保證外部程序無法在交易期間更改交易正在運作的資料。
  • MVCC:MVCC,或多版本並行控制,是一種透過對資料的一致快照執行操作來實現交易隔離的策略。每個交易都將收到自己的資料副本,以在交易中使用。
  • 鎖定:資料庫、表格或列鎖定是一種策略,它透過在交易的生命週期內授予程序對特定資料範圍的獨佔存取權,來防止不準確的讀取並避免衝突的寫入。鎖定是有效的,但會嚴重影響效能,因為不允許並行存取。

複寫、負載平衡和高可用性

PostgreSQL 提供了各種解決方案,用於將工作負載分散到多個伺服器上,或在主伺服器出現問題時切換到輔助伺服器。

負載平衡是一種策略,涉及在多個資料庫伺服器上複製資料,並在它們之間交替請求,以增加可以並行執行的工作量。同樣,高可用性是一種策略,它允許輔助資料庫伺服器在第一個伺服器出現問題時接管其職責,從而減少資料不可用的時間量。這兩種策略都可以在 PostgreSQL 中透過結合預寫式日誌 (WAL)複寫來實現。

預寫式日誌是一種用於保證資料完整性的技術,方法是在實際將所有變更套用到資料庫之前,將所有變更寫入日誌檔案。如果在交易期間發生故障,PostgreSQL 可以透過檢查日誌來準確判斷哪些操作已套用到資料庫。任何部分套用的交易都可以回滾,因為系統確切知道預期的變更。

WAL 對於負載平衡和高可用性非常重要,因為它與複寫有關。複寫是在兩個或多個資料庫伺服器之間鏡像資料和所有資料庫操作的過程。它是實作負載平衡和高可用性的主要方法,它提供了一種在伺服器之間複製資料的方法。

PostgreSQL 可以支援許多不同類型的複寫,每種類型在粒度、資料遺失保護、效能和複雜性方面都有權衡。複寫架構可以很簡單,例如將資料複製到單個備用伺服器,也可以很複雜,例如透過多個主機中繼複寫的架構,延遲程度各不相同。這些選擇讓您可以靈活地配置您的環境,以符合您對效能、擴展和資料可用性的需求。

概念

  • 預寫式日誌:預寫式日誌或 WAL 是一種策略,用於透過在伺服器故障期間將預期的資料庫操作寫入持久性日誌,然後再在資料庫上執行該操作,從而防止資料遺失。WAL 允許資料庫透過回滾部分套用的操作從故障中恢復。這有助於確保系統中的資料處於一致的狀態。
  • 複寫:複寫是一個涉及將資料和資料操作從一個伺服器複製到另一個伺服器的過程。這允許單獨的伺服器維護同步的資料集。提供不同類型的複寫,以平衡不同層級的可用性、容錯能力、效能和複雜性。
  • 主伺服器:在複寫資料時,主伺服器(在某些上下文中稱為主伺服器)是「主要」伺服器的指定,它可以接受寫入查詢並維護初始資料集和操作。
  • 輔助伺服器:在複寫資料時,輔助伺服器(在某些上下文中稱為備用伺服器)是透過複寫執行的每個操作將其資料同步到主伺服器的伺服器。

結論

PostgreSQL 是一個功能非常強大的資料庫,它具有足夠的彈性,可以在許多不同的任務中表現出色。客戶端-伺服器模型、使用者管理系統、物件階層以及並行和複寫功能是使 PostgreSQL 能夠如此出色運作的基本組成部分。了解 PostgreSQL 開發人員所做的基本設計選擇可以簡化您掌握該系統並提高生產力的過程。

關於作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以來一直撰寫有關資料庫、Linux、基礎架構和開發人員工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不必以第三人稱寫作,這對所有相關方來說都是一種解脫。