適用於 PostgreSQL 的 Azure 資料庫簡介
適用於 PostgreSQL 的 Azure 資料庫適用於多伺服器版本。
身為具有多年執行和管理內部部署PostgreSQL安裝經驗的資料庫開發人員,您想要探索適用於PostgreSQL的 Azure 資料庫如何支援及調整其功能。
在此單元中,您將探索適用於 PostgreSQL 的 Azure 資料庫定價、版本支援、複寫和調整選項。
適用於 PostgreSQL 的 Azure 資料庫
適用於 PostgreSQL 的 Azure 資料庫服務是 PostgreSQL 社群版本的實作。 此服務提供一般 PostgreSQL 系統所使用的一般功能,包括地理空間支援和全文搜索。
Microsoft已針對 Azure 平台調整 PostgreSQL,並與許多 Azure 服務緊密整合。 適用於 PostgreSQL 的 Azure 資料庫服務完全由 Microsoft 管理。 Microsoft處理軟體的更新和修補程式,並提供 99.99% 可用性 SLA。 這表示您可以只專注於使用服務執行的資料庫和應用程式。
您可以在此服務的每個實體中部署多個資料庫。
價格級距
當您建立「適用於 PostgreSQL 的 Azure 資料庫」服務的實例時,您可以選取 定價層來指定您想要設定的計算和記憶體資源。 定價層結合了虛擬處理器核心數目、可用的記憶體數量,以及各種備份選項。 您配置的資源越多,成本就越高。
適用於 PostgreSQL 的 Azure 資料庫服務會使用記憶體來保存資料庫檔案、暫存盤、事務歷史記錄和伺服器記錄。 您可以選擇性地指定當您接近目前容量時,想要增加可用的記憶體。 如果您未選取此選項,耗盡記憶體的伺服器將會繼續執行,但會以唯讀方式運作。
Azure 入口網站會將定價層分成三個範圍:
- 基本,適用於小型系統和開發環境,但具有可變的 I/O 效能。
- 一般用途,根據處理器核心數目和可用的儲存空間,提供高達 6000 IOPS 的可預測效能。
- 記憶體優化,其最多可使用 32 個記憶體優化虛擬處理器核心,並提供高達 6000 IOPS 的可預測效能。
Microsoft預覽版中也有 大型記憶體 選項,最多可布建 16 TB 的記憶體,並支援最多 20,000 IOPS。
您可以微調所需的處理器核心數目和記憶體。 您可以在建立資料庫之後,視需要相應增加和減少處理資源,而無法相應減少記憶體、增加,以及在一般用途和記憶體優化定價層之間切換。 您只需支付所需的費用。
備註
如果您變更處理器核心數目,Azure 會使用此計算配置建立新的伺服器。 當伺服器執行時,用戶端聯機會切換至新的伺服器。 此切換最多可能需要一分鐘的時間。 在此間隔期間,無法建立任何新的連線,而且任何進行中的交易都會回復。
如果您只變更備份選項的記憶體大小,服務不會中斷。
定價層和配置的處理資源會決定服務將支援的並行連線數目上限。 例如,如果您選取 [一般用途] 定價層並配置 64 個虛擬核心,則服務支援 1900 個並行連線。 基本層具有兩個虛擬核心,最多可處理100個並行連線。 Azure 本身需要其中五個連線來監視伺服器。 如果您超過可用的連線數目,用戶端將會收到錯誤 嚴重:很抱歉,已經太多用戶端。
價格可能會改變。 如需最新資訊,請流覽 適用於 PostgreSQL 的 Azure 資料庫定價 頁面。
伺服器參數
在 PostgreSQL 的內部部署安裝中,您會在 postgresql.conf 檔案中設定伺服器組態參數。 使用適用於 PostgreSQL 的 Azure 資料庫,透過 伺服器參數 頁面修改組態參數。 並非所有適用於 PostgreSQL 的內部部署安裝參數都與適用於 PostgreSQL 的 Azure 資料庫有關,因此 [伺服器參數] 頁面只會列出適用於 Azure 的參數。
標示為 Dynamic 的參數變更會立即生效。 靜態參數需要重新啟動伺服器。 您可以使用入口網站中 [概觀] 頁面上的 [重新啟動] 按鈕來重新啟動伺服器:
高可用性
適用於 PostgreSQL 的 Azure 資料庫服務是高可用性服務。 其包含內建的失敗偵測與容錯移轉機制。 如果處理節點因硬體或軟體問題而停滯,則會切換新的節點來取代它。 目前使用該節點的任何連線都會卸除,但會自動針對新節點開啟。 失敗節點所執行的任何交易都會復原。 基於這個理由,您應該一律確定客戶端已設定為偵測和重試失敗的作業。
支援的 PostgreSQL 版本
適用於 PostgreSQL 的 Azure 資料庫服務目前支援 PostgreSQL 11 版,回到 9.5 版。 您可以指定要在建立服務實例時使用的 PostgreSQL 版本。 Microsoft目標是在新版本的 PostgreSQL 可用時更新服務,並維持與前兩個主要版本的相容性。
Azure 會在次要版本的 PostgreSQL 之間自動管理資料庫的升級,但不會管理主要版本。 例如,如果您有使用 PostgreSQL 第 10 版的資料庫,Azure 可以自動將資料庫升級至 10.1 版。 如果您想要切換至第 11 版,您必須從目前服務實例中的資料庫匯出數據、建立適用於 PostgreSQL 的 Azure 資料庫服務的新實例,並將您的數據匯入這個新實例。
協調器和背景工作節點
數據會分區化,並在背景工作節點之間散發。 協調器中的查詢引擎可以平行處理複雜的查詢,並將處理導向適當的背景工作節點。 系統會根據所處理數據的分區選取背景工作節點。 協調器接著會先從背景工作節點累積結果,再將它們傳回用戶端。 可能只會使用單一背景工作節點來執行更直接的查詢。 用戶端也會連線到協調器,而且永遠不會直接與背景工作節點通訊。
您可以視需要相應增加和減少服務中的背景工作節點數目。
散發數據
您可以建立 分散式 數據表,將數據分散到背景工作節點。 分散式數據表會分割成分區,而每個分區都會配置給背景工作節點上的記憶體。 您可以指示如何將資料行定義為資料行 散發 資料行來分割數據。 數據會根據此數據行中的數據值進行分區化。 當您設計分散式數據表時,請務必仔細選取散發數據行;您應該使用具有大量相異值的數據行,通常用來將相關數據列分組。 例如,在儲存客戶訂單相關信息的電子商務系統的數據表中,客戶標識元可能是合理的散發數據行。 指定客戶的所有訂單都會保留在相同的分區中,但所有客戶的訂單都會分散在分區中。
您也可以建立資料表 參考。 這些數據表包含查閱數據,例如城市名稱或狀態代碼。 參考數據表會完整復寫至每個背景工作節點。 參考數據表中的數據應該相對靜態;每個變更都需要更新數據表的每個複本。
最後,您可以建立 本機 數據表。 本機數據表不是分區化,而是儲存在協調器節點上。 使用本機數據表來存放小型數據表,其中包含聯結不太可能需要的數據。 範例包括用戶的名稱及其登入詳細數據。
在適用於 PostgreSQL 的 Azure 資料庫中復寫數據
只讀複本對於處理大量讀取工作負載很有用。 用戶端連線可以分散到複本,減輕服務單一實例的負擔。 如果您的用戶端位於世界各地的不同區域,您可以使用跨區域複寫來將數據放在每個用戶端集附近,並減少延遲。
您也可以使用複本作為災害復原應變計劃的一部分。 如果主伺服器變得無法使用,您仍然可以連線到複本。
備註
如果主複本遺失或刪除,則所有只讀複本會改為變成讀寫伺服器。 不過,這些伺服器會彼此獨立,因此對一部伺服器中的數據所做的任何變更都不會複製到其餘伺服器。
建立複本
唯讀複本包含原始伺服器中儲存的資料庫複本,稱為 master。 您可以使用 Azure 入口網站或 CLI 來建立主要複本。
當您建立只讀複本時,Azure 會建立適用於 PostgreSQL 的 Azure 資料庫服務的新實例,然後將資料庫從主伺服器複製到新的伺服器。 複本會以唯讀模式執行。 任何修改數據的嘗試都會失敗。
復本延隔時間
復寫不是同步的,而且對主伺服器中數據所做的任何變更可能需要一些時間才會出現在複本中。 連接到複本的用戶端應用程式必須能夠應付這種最終一致性層級。 Azure 監視器可讓您使用複本之間的 最大延隔時間 和 複本延遲 計量來追蹤復寫的時間延隔時間。
管理和監視
您可以使用熟悉的工具,例如 pgAdmin,連線到適用於 PostgreSQL 的 Azure 資料庫來管理和監視資料庫。 不過,某些以伺服器為主的功能,例如執行伺服器備份和還原,無法使用,因為伺服器是由Microsoft管理和維護。
用於監視適用於PostgreSQL的 Azure 資料庫 Azure 工具
Azure 提供一組廣泛的服務,可用來監視伺服器和資料庫效能,並針對問題進行疑難解答。 這些服務可讓您檢視 PostgreSQL 如何使用您配置的 Azure 資源。 您可以使用這項資訊來評估是否需要調整系統、修改資料庫中數據表和索引的結構,以及可視化運行時間統計數據和其他事件。 可用的服務包括:
Azure 監視器。 適用於 PostgreSQL 的 Azure 資料庫提供計量,可讓您追蹤 CPU 和記憶體使用率、I/O 速率、記憶體佔用率、作用中聯機數目和復寫延遲等專案:
伺服器記錄。 Azure 會讓記錄可供每個 PostgreSQL 伺服器使用。 您可以從 Azure 入口網站下載它們:
查詢存放區和查詢效能深入解析。 適用於 PostgreSQL 的 Azure 資料庫會儲存伺服器上針對資料庫執行的查詢相關信息,並將查詢儲存在 query_store 架構中名為 azure_sys的資料庫。 您可以查詢 query_store.qs_view 檢視,以查看此資訊。 根據預設,「適用於 PostgreSQL 的 Azure 資料庫」不會擷取任何查詢資訊,因為它造成少量的額外負荷,但是您可以將 pg_qs.query_capture_mode 伺服器屬性設定為 ALL 或 TOP來啟用追蹤。
您也可以設定查詢存放區來擷取花費等候時間的查詢資訊。 查詢可能需要等候另一個查詢釋放數據表上的鎖定,或因為查詢執行大量 I/O,或因為記憶體執行短。 您會在 query_store.runtime_stats_view 檢視中看到此資訊。
如果您想要將這些統計數據可視化,而不是執行 SQL 語句,請在 Azure 入口網站中使用查詢效能深入解析:
顯示查詢效能深入解析影像
效能建議。 Azure 入口網站中也提供效能建議公用程式,會檢查應用程式正在執行的查詢。 它也會查看資料庫中的結構,並建議如何組織您的數據,以及是否應考慮新增或移除索引。
用戶端連線能力
適用於 PostgreSQL 的 Azure 資料庫會在防火牆後方執行。 若要存取您的服務和資料庫,您必須為用戶端連線的IP位址範圍新增防火牆規則。 如果您需要從 Azure 記憶體取服務,例如使用 Azure App Services 執行的應用程式,您也必須啟用 Azure 服務的存取權。
設定防火牆
設定防火牆最簡單的方式是在 Azure 入口網站中使用您服務的連線安全性設定。 為每個用戶端IP位址範圍新增規則。 您也可以使用此頁面來強制執行服務的 SSL 連線。
您可以在工具列中按兩下 [新增用戶端IP],以新增桌面電腦的IP位址。
如果您已設定只讀複本,則必須將防火牆規則新增至每個複本,讓用戶端存取它們。
用戶端連線連結庫
如果您要撰寫自己的用戶端應用程式,則必須使用適當的資料庫驅動程式來連線到 PostgreSQL 資料庫。 其中許多連結庫都相依於程式設計語言。 它們由獨立第三方維護。 適用於 PostgreSQL 的 Azure 資料庫支援適用於 Python、PHP、Node.js、Java、Ruby、Go、C# (.NET)、ODBC、C 和 C++ 的用戶端連結庫。
用戶端重試邏輯
如先前所述,某些事件,例如在高可用性復原期間故障轉移,以及相應增加 CPU 資源,可能會導致連線短暫遺失。 任何進行中的交易都會回復。 適用於 PostgreSQL 的 Azure 資料庫會自動將連線的用戶端重新導向至工作節點,但客戶端當時所執行的任何作業都會傳回錯誤。 您應該將此發生視為暫時性例外狀況。 您的應用程式程式代碼應該準備好攔截這些例外狀況,然後再試一次。
適用於 PostgreSQL 的 Azure 資料庫中支援的 PostgreSQL 功能
適用於 PostgreSQL 的 Azure 資料庫支援 PostgreSQL 資料庫最常使用的功能,但有一些例外狀況。 如果您需要不支援的功能,您必須重新作業資料庫和應用程式程式代碼以移除此相依性,或考慮在虛擬機中執行 PostgreSQL。 在後者的情況下,您必須負責管理和維護伺服器。
適用於 PostgreSQL 的 Azure 資料庫中支援的擴充功能
許多 PostgreSQL 功能會封裝在延伸模組中。 延伸模組是儲存在伺服器上的 SQL 物件和程式代碼套件,可以使用 CREATE EXTENSION
命令載入資料庫。 適用於 PostgreSQL 的 Azure 資料庫目前提供許多常用的擴充功能:
- 數據類型
- 功能
- 全文搜索
- 索引(盛開、btree_gist和btree_gin)
- plpgsql 語言
- PostGIS
- 許多系統管理功能
您可以使用 dblink 和 postgres_fdw 套件,將一部 PostgreSQL 伺服器連線到另一部伺服器,這可讓一部伺服器中的程式代碼存取另一部伺服器中保存的數據。 在適用於 PostgreSQL 的 Azure 資料庫中,您只能在使用適用於 PostgreSQL 的 Azure 資料庫所建立的伺服器之間進行連線。 您無法建立裝載於其他地方的 PostgreSQL 伺服器的輸出連線,例如內部部署或虛擬機中。
備註
支援的延伸模組清單會持續受到檢閱,而且可能會變更。 您將產生下列查詢所支援的延伸模組清單。 請注意,您無法建立自己的自定義延伸模組,並將其上傳至適用於 PostgreSQL 的 Azure 資料庫:
SELECT * FROM pg_available_extensions;
適用於 PostgreSQL 的 Azure 資料庫包含 TimescaleDB 資料庫作為選擇性擴充功能。 此資料庫包含時間導向的分析函式,以及其他支援時間序列工作負載的功能。 若要使用此資料庫,請在 shared_preload_libraries 伺服器參數中選取 [TIMESCALEDB] 選項,然後重新啟動伺服器。
預存程式和觸發程式的語言支援
plpgsql 以外的語言支援通常需要您個別編譯預存程式或觸發程序代碼,並將編譯的連結庫上傳至伺服器。 主要是因為安全性原因,您無法使用適用於 PostgreSQL 的 Azure 資料庫來執行此動作。 如果您有以其他語言撰寫的程式碼,則必須將其移植到 plpgsql。