概述
PostgreSQL 是一個功能強大的關係型資料庫,能夠服務於許多不同的用例。在專案中使用它之前,最好先了解 PostgreSQL 的工作原理、它與其他關係型資料庫有何不同,以及有哪些功能可以幫助你建模和管理資料。
本指南將介紹 PostgreSQL 的架構和屬性,讓你對資料庫系統的工作原理有一個大致的瞭解。本概述將幫助你理解應用程式架構、使用者通常如何與它互動,以及它如何透過擴充套件和安全功能支援資料完整性和增長。
PostgreSQL 的客戶端/伺服器架構
像許多關係型資料庫系統一樣,PostgreSQL 的基本架構遵循客戶端-伺服器模型。
主要的 PostgreSQL 程式作為一個服務執行,負責定義資料結構、儲存資料和響應查詢。此守護程序監聽來自客戶端的連線,客戶端可以進行身份驗證,然後向伺服器傳送指令。伺服器會返回訊息,指示成功、失敗、查詢結果或其他適當的資訊。
這種架構允許 PostgreSQL 系統服務於許多可以透過本地或網路連線的不同客戶端。主 PostgreSQL 程序為每個接收到的客戶端連線派生一個新程序。因此,每個派生程序都專用於一個客戶端連線,從而使連線、派生程序和資料庫會話的數量相互一致。
概念
- 伺服器:在客戶端-伺服器架構中,伺服器是接受外部客戶端連線以執行工作的軟體。它監聽請求,處理相應的資訊,並向用戶返回任何相關結果。
- 客戶端:在客戶端-伺服器架構中,客戶端是使用者用於連線和與伺服器通訊的軟體。客戶端將使用者的請求轉發給伺服器,並將任何相關資訊傳回。
- fork(派生):派生是執行中程序的克隆,常用於幫助控制資源使用、許可權級別和建立新的執行環境。
- 資料庫會話:資料庫會話是資料庫伺服器和客戶端之間單一、持續的連線。會話擁有自己的上下文,在會話生命週期內持續存在,從而允許每個會話擁有一定程度的狀態和配置。
PostgreSQL 的預設客戶端:psql
使用者可以使用多種客戶端連線到 PostgreSQL 伺服器。作為 PostgreSQL 發行版一部分實現的預設命令列客戶端稱為 psql。
psql 客戶端可以連線到本地或遠端資料庫,並以批處理或互動方式處理查詢。對於自動化用例,認證憑據可以儲存在專用認證檔案中,查詢可以透過客戶端從檔案中讀取。
互動式 psql 會話在認證後會將使用者帶到 PostgreSQL 命令提示符。從那裡,你可以向客戶端傳送 SQL,並在終端視窗中檢視結果或將其透過管道輸出到檔案。
你還可以透過 psql 客戶端中實現的一系列元命令來修改資料庫和管理 PostgreSQL 本身。元命令是非 SQL 的“生活質量”快捷方式,以“\”開頭,允許你查詢有關資料結構和系統的資訊。
例如,你可以使用 \dt 元命令列出所有可用表,或使用 \conninfo 元命令顯示有關當前連線的資訊。在 psql 會話期間,你可以分別使用 \h 和 \? 元命令獲取有關 SQL 或元命令的資訊。
概念
- 批處理:批處理是一種一次性執行一組操作而不是逐個執行的策略。批處理通常是自動化工作流的一個組成部分,因為它允許指令碼和其他程序傳送複合請求。
- 互動式會話:互動式會話是使用者使用臨時命令與資料庫介面互動的資料庫會話。這與非互動模式形成對比,在非互動模式下,完整的指令集在沒有使用者干預的情況下發送到伺服器。
- 元命令:在
psql中,元命令是由psql本身而不是資料庫系統作為 SQL 語句攔截和處理的命令。這些主要是生活質量的改進,允許使用者獲取有關資料庫伺服器、連線和資料庫物件結構的資訊,而無需記住複雜的查詢。
Prisma Client 是使用 PostgreSQL 聯結器處理 PostgreSQL 資料庫的另一種強大方式。你可以按照我們的 PostgreSQL 入門指南進行嘗試。
使用 PostgreSQL 角色和許可權進行認證和授權
PostgreSQL 使用角色和許可權來驗證連線到系統的是誰,並確定他們被允許執行哪些操作。
在 PostgreSQL 中,角色是特定能力、許可權和“擁有”實體的集合。PostgreSQL 沒有“使用者”和“組”的獨立概念,而是使用角色來表示這兩種思想。角色可以對應現實世界中的個人,也可以作為一個具有特定訪問許可權的組,其他角色可以成為其成員。
該系統在組織訪問級別方面提供了很大的靈活性。認證方法可以根據角色定義,對特定資料庫實體的授權可以賦予特定角色。作為其他角色成員的角色將繼承這些角色的訪問許可權。
PostgreSQL 有一些重要的預設設定,會影響使用者登入和許可權的開箱即用行為。新安裝通常配置為對等認證,它允許使用者自動認證到與其作業系統使用者匹配的任何 PostgreSQL 角色。本質上,這會將使用者認證解除安裝到作業系統。任何具有匹配 PostgreSQL 角色名的作業系統使用者都被認為是可信的身份。對資料庫執行有用工作的授權必須單獨授予。
概念
- 角色:在 PostgreSQL 中,角色是個人使用者和使用者組的替代和組合。使用者可以認證到一個角色以獲得其許可權。角色可以成為其他角色的成員,以繼承其許可權。
- 對等認證:對等認證是大多數 PostgreSQL 安裝預設配置的認證機制。對等認證允許使用者無需提供其他憑據即可認證到與其作業系統使用者名稱匹配的 PostgreSQL 角色。對等認證基於系統管理員也是資料庫管理員的假設。
- 授權(grants):在 PostgreSQL 中,授權是分配給角色以執行特定操作的許可權宣告。角色也可以被“授予”成為另一個角色的成員,從而繼承父角色的任何授權。
瞭解 PostgreSQL 物件層次結構:資料庫、模式和表
大部分情況下,PostgreSQL 在資料庫物件命名方面遵循傳統關係型資料庫的約定。然而,PostgreSQL 與常見定義不同的一點在於它定義“模式”(schema)的方式。
大多數資料庫使用“模式”一詞來指代資料庫中的通用資料庫結構或表定義。例如,你可能會看到定義了包含產品 ID、描述和計數字段以及相關約束的 product 表的 SQL,這被稱為 product 表的模式。
然而,PostgreSQL 模式是一個可以在系統內建立和管理的特定資料庫物件。瞭解 PostgreSQL 中的物件層次結構可以幫助你在熟悉系統和查閱文件時避免混淆。
PostgreSQL 的主要“全域性”物件是資料庫叢集,它只是 PostgreSQL 伺服器管理的一組資料庫的名稱。資料庫叢集包含資料庫、角色和其他“全域性”實體。
模式在資料庫中定義,作為表、函式、資料型別和運算子的容器。物件名稱在模式內部必須是唯一的,但可以在不同的模式中重複使用,這允許使用者在不發生命名衝突的情況下共享資料庫。它們還有助於透過對資料庫中的物件進行分段和隔離來分組物件或管理第三方應用程式。
表和其他物件在模式中建立。預設情況下,如果在定義表和其他物件時未指定替代模式,則使用名為“public”的模式。實際上,這使得使用模式進行分段成為一種可選實踐。在許多情況下使用 PostgreSQL 模式很有幫助,但如果你不需要它們,則可以忽略它們。
概念
- 資料庫叢集:在 PostgreSQL 術語中,資料庫叢集是由單個 PostgreSQL 伺服器管理的一組資料庫和相關物件的集合。資料庫叢集是 PostgreSQL 伺服器管理的環境。
- 資料庫:資料庫是資料庫叢集中的一個物件,它定義了模式、角色和其他物件。由於角色在資料庫中定義,因此資料庫是使用者進行認證的物件。
- 模式:在 PostgreSQL 中,模式是資料庫內部的一個名稱空間物件。模式包含表、資料型別、函式和運算子。物件名稱在模式內部必須是唯一的,但相同的名稱可以存在於不同的模式中。
- 表:表是 PostgreSQL 中主要的資料定義結構。表定義了欄位和約束,以控制可輸入的資料型別。表以記錄的形式儲存其定義結構內的資料。
使用 Prisma Client 時,Prisma 模式中的資料模型等同於 PostgreSQL 中的表。
併發和隔離控制
資料庫併發和隔離控制幫助系統管理多個使用者同時嘗試訪問相同資料的情況。資料庫必須有處理這種情況的策略,以避免不一致的讀取、提交衝突的更改和競態條件。
PostgreSQL 使用一種稱為多版本併發控制(MVCC)的策略來處理這些情況。MVCC 透過在相關資料的快照上執行 SQL 語句來工作。此資料快照提供事務隔離,確保每個事務可以獨立應用或回滾,並且它們操作的是一致的資料集。
這種併發管理讓 PostgreSQL 避免了鎖定,鎖定是一種在操作持續期間將資料獨佔訪問權授予一個程序的技術。雖然有助於隔離控制,但鎖定會阻止併發訪問,並影響效能,因為查詢會等待鎖釋放才能訪問資料。
PostgreSQL 的 MVCC 實現允許讀寫語句永不相互阻塞,這可能對效能產生深遠影響。多種事務隔離級別可用,具體取決於你對不同型別隔離問題的容忍度。如果你想用自己的系統管理更精細的併發範圍,表級和行級鎖定也可用。
概念
- 事務隔離:事務隔離是一種確保事務原子性和一致性的特性。這意味著事務中的操作要麼全部應用於資料,要麼全部回滾。事務隔離還保證在事務期間,外部程序無法更改事務正在操作的資料。
- MVCC:MVCC,即多版本併發控制,是一種透過對資料的一致性快照執行操作來實現事務隔離的策略。每個事務都將獲得自己的資料副本,供事務內部使用。
- 鎖定:資料庫、表或行鎖定是一種策略,透過在事務生命週期內賦予程序對特定資料範圍的獨佔訪問許可權,來防止不準確的讀取並避免衝突的寫入。鎖定是有效的,但由於不允許併發訪問,因此會嚴重影響效能。
複製、負載均衡和高可用性
PostgreSQL 提供了多種解決方案,用於將工作負載分散到多個伺服器上,或者在主伺服器出現問題時切換到備用伺服器。
負載均衡是一種策略,涉及在多個數據庫伺服器上覆制資料並在它們之間交替請求,以增加可併發執行的工作量。類似地,高可用性是一種策略,允許備用資料庫伺服器在出現問題時接管主伺服器的職責,從而減少資料不可用的時間。這兩種策略在 PostgreSQL 中都可以透過結合預寫日誌(WAL)和複製來實現。
預寫日誌是一種透過在實際將所有更改應用到資料庫之前將其寫入日誌檔案來保證資料完整性的技術。在事務期間發生故障時,PostgreSQL 可以透過檢查日誌準確確定哪些操作已應用於資料庫。由於系統確切知道預期更改是什麼,因此任何部分應用的事務都可以回滾。
WAL 對於負載均衡和高可用性很重要,因為它與複製有關係。複製是在兩個或多個數據庫伺服器之間映象資料和所有資料庫操作的過程。它是透過提供在伺服器之間複製資料的手段來實現負載均衡和高可用性的主要方法。
PostgreSQL 可以支援多種不同型別的複製,每種都有在粒度、資料丟失保護、效能和複雜性方面的權衡。複製架構可以是直接的,例如將資料複製到單個備用伺服器;也可以是複雜的,例如透過多個主機以不同程度的延遲進行復制。這些選擇為你提供了配置環境的靈活性,以滿足你對效能、擴充套件和資料可用性的需求。
概念
- 預寫日誌(Write-Ahead Logging):預寫日誌,或 WAL,是一種在執行資料庫操作之前將預期操作寫入持久日誌以防止伺服器故障期間資料丟失的策略。WAL 允許資料庫透過回滾部分應用的操作從故障中恢復。這有助於確保系統中的資料處於一致狀態。
- 複製:複製是一個涉及將資料和資料操作從一個伺服器複製到另一個伺服器的過程。這允許不同的伺服器維護同步的資料集。有不同型別的複製可用,以平衡不同級別的可用性、容錯能力、效能和複雜性。
- 主伺服器:在複製資料時,主伺服器(在某些上下文中也稱為 master server)是指可以接受寫入查詢並維護初始資料集和操作的“主”伺服器。
- 輔助伺服器:在複製資料時,輔助伺服器(在某些上下文中也稱為 standby server)是透過複製執行的每個操作來將其資料與主伺服器同步的伺服器。
結論
PostgreSQL 是一個功能極其強大的資料庫,其靈活性足以在許多不同任務中表現出色。客戶端-伺服器模型、使用者管理系統、物件層次結構以及併發和複製功能是使 PostgreSQL 良好執行的基礎部分。瞭解 PostgreSQL 開發人員所做的基礎設計選擇可以幫助你更輕鬆地高效使用該系統。
