PostgreSQL資料庫複製綜合指南

PostgreSQL資料庫複製綜合指南

正如任何網站所有者都會告訴您的那樣,資料丟失和停機時間,即使是最小的劑量,也可能是災難性的。他們可以隨時打擊措手不及的人,從而導致生產力、可訪問性和產品信心降低。

為了保護您的站點的完整性,構建防止停機或資料丟失可能性的保護措施至關重要。

這就是資料複製的用武之地。

資料複製是一個自動備份過程,在該過程中,您的資料會從其主資料庫重複複製到另一個遠端位置以進行安全保護。對於任何執行資料庫伺服器的站點或應用程式來說,它都是一項不可或缺的技術。您還可以利用複製的資料庫來處理只讀SQL,從而允許在系統內執行更多程序。

在兩個資料庫之間設定複製提供了針對意外事故的容錯能力。它被認為是在災難期間實現高可用性的最佳策略。在本文中,我們將深入探討後端開發人員可以為無縫PostgreSQL複製實施的不同策略。

  1. 什麼是PostgreSQL複製?
  2. 使用PostgreSQL複製的好處
  3. PostgreSQL複製的工作原理
  4. PostgreSQL複製的元素
  5. 如何設定PostgreSQL複製
  6. 手動切換PostgreSQL故障伺服器步驟
  7. 如何實現PostgreSQL故障伺服器自動切換

什麼是PostgreSQL複製?

PostgreSQL複製圖解

PostgreSQL複製圖解(圖片來源:EnterpriseDB

PostgreSQL複製被定義為將資料從PostgreSQL資料庫伺服器複製到另一臺伺服器的過程。源資料庫伺服器也稱為“主”伺服器,而接收復制資料的資料庫伺服器稱為“副本”伺服器。

PostgreSQL資料庫遵循簡單的複製模型,其中所有寫入都轉到主節點。然後主節點可以應用這些更改並將它們廣播到輔助節點。

什麼是自動故障轉移?

一旦在PostgreSQL中配置了物理流複製,如果資料庫的主伺服器發生故障,就會發生故障轉移。故障轉移用於定義恢復過程,這可能需要一段時間,因為它不提供用於確定伺服器故障範圍的內建工具。

您不必依賴PostgreSQL進行故障轉移。有專用工具允許自動故障轉移和自動切換到備用資料庫,從而減少資料庫停機時間。

通過設定故障轉移複製,您幾乎可以通過確保在主伺服器崩潰時備用伺服器可用來保證高可用性。

使用PostgreSQL複製的好處

以下是利用PostgreSQL複製的幾個主要好處:

  • 資料遷移:您可以通過更改資料庫伺服器硬體或通過系統部署利用PostgreSQL複製進行資料遷移。
  • 容錯:如果主伺服器發生故障,備用伺服器可以充當伺服器,因為主伺服器和備用伺服器包含的資料相同。
  • 線上事務處理 (OLTP) 效能:您可以通過消除報告查詢負載來提高OLTP系統的事務處理時間和查詢時間。事務處理時間是在事務完成之前執行給定查詢所需的持續時間。
  • 並行系統測試:升級新系統時,您需要確保系統能夠很好地處理現有資料,因此需要在部署之前使用生產資料庫副本進行測試。

PostgreSQL複製的工作原理

通常,人們認為當您涉足主要和次要架構時,只有一種方法可以設定備份和複製,但PostgreSQL部署遵循以下三種方法之一:

  1. 卷級複製,在儲存層從主節點複製到輔助節點,然後將其備份到Blob/S3儲存。
  2. PostgreSQL流複製將資料從主節點複製到輔助節點,然後將其備份到blob/S3儲存。
  3. 從主節點到S3進行增量備份,同時從S3重建新的輔助節點。當輔助節點在主節點附近時,您可以從主節點開始流式傳輸。

方法 1:流式傳輸

在所有伺服器上安裝PostgreSQL後,可以無縫設定PostgreSQL流複製也稱為WAL複製。這種複製方法基於將WAL檔案從主資料庫移動到目標資料庫。

您可以使用主從配置來實現PostgreSQL流式複製。主伺服器是處理主資料庫及其所有操作的主要例項。輔助伺服器充當補充例項,並在其自身上執行對主資料庫所做的所有更改,並在此過程中生成相同的副本。主伺服器是讀/寫伺服器,而輔助伺服器只是只讀的。

對於這種方法,您需要同時配置主節點和備用節點。以下部分將闡明輕鬆配置它們所涉及的步驟。

配置主節點

您可以通過執行以下步驟來配置主節點以進行流式複製:

第 1 步:初始化資料庫

要初始化資料庫,您可以利用該initidb utility命令。接下來,您可以使用以下命令建立具有複製許可權的新使用者:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
CREATE USER REPLICATION LOGIN ENCRYPTED PASSWORD '';
CREATE USER REPLICATION LOGIN ENCRYPTED PASSWORD '';
 CREATE USER  REPLICATION LOGIN ENCRYPTED PASSWORD '';

使用者必須為給定的查詢提供密碼和使用者名稱。replication關鍵字用於為使用者提供所需的許可權。示例查詢如下所示:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
CREATE USER rep_user REPLICATION LOGIN ENCRYPTED PASSWORD 'rep_pass'
CREATE USER rep_user REPLICATION LOGIN ENCRYPTED PASSWORD 'rep_pass'
 CREATE USER rep_user REPLICATION LOGIN ENCRYPTED PASSWORD 'rep_pass'

第 2 步:配置流媒體屬性

接下來,您可以使用PostgreSQL配置檔案 ( postgresql.conf ) 配置流屬性,該檔案可以修改如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
wal_level = logical
wal_log_hints = on
max_wal_senders = 8
max_wal_size = 1GB
hot_standby = on
wal_level = logical wal_log_hints = on max_wal_senders = 8 max_wal_size = 1GB hot_standby = on
wal_level = logical
wal_log_hints = on
max_wal_senders = 8
max_wal_size = 1GB
hot_standby = on

以下是上一個片段中使用的引數的一些背景知識:

  • wal_log_hints:當備用伺服器與主伺服器不同步時,該引數是pg_rewind功能所必需的。
  • wal_level:您可以使用此引數啟用PostgreSQL流式複製,可能的值包括minimalreplicalogical
  • max_wal_size:這可用於指定可以保留在日誌檔案中的WAL檔案的大小。
  • hot_standby:當它設定為ON時,您可以利用此引數與輔助節點建立讀取連線。
  • max_wal_senders:您可以使用max_wal_senders指定可以與備用伺服器建立的最大併發連線數。

第 3 步:建立新條目

修改postgresql.conf檔案中的引數後,pg_hba.conf檔案中的新複製條目可以允許伺服器相互建立連線以進行復制。

您通常可以在PostgreSQL的資料目錄中找到該檔案。您可以使用以下程式碼片段:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
host replication rep_user IPaddress md5
host replication rep_user IPaddress md5
 host replication rep_user IPaddress md5

一旦程式碼段被執行,主伺服器就允許名為rep_user的使用者通過使用指定的IP進行復制來連線並充當備用伺服器。例如:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
host replication rep_user 192.168.0.22/32 md5
host replication rep_user 192.168.0.22/32 md5
 host replication rep_user 192.168.0.22/32 md5

配置備用節點

要為流複製配置備用節點,請執行以下步驟:

步驟 1:備份主節點

要配置備用節點,請利用pg_basebackup實用程式生成主節點的備份。這將作為備用節點的起點。您可以使用以下語法使用此實用程式:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pg_basebackp -D -h -X stream -c fast -U rep_user -W
pg_basebackp -D -h -X stream -c fast -U rep_user -W
 pg_basebackp -D  -h  -X stream -c fast -U rep_user -W

上述語法中使用的引數如下:

  • -h: 你可以用這個來提及主主機。
  • -D:此參數列示您當前正在處理的目錄。
  • -C:您可以使用它來設定檢查點。
  • -X:此引數可用於包含必要的事務日誌檔案。
  • -W:您可以使用此引數在連結到資料庫之前提示使用者輸入密碼。

步驟 2:設定複製配置檔案

接下來,您需要檢查複製配置檔案是否存在。如果沒有,您可以將複製配置檔案生成為recovery.conf。

您應該在PostgreSQL安裝的資料目錄中建立此檔案。您可以使用實用程式pg_basebackup中的-R選項自動生成它。

recovery.conf檔案應包含以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
standby_mode = ‘on’
primary_conninfo = ‘host=<master_host> port=<postgres_port> user=<replication_user> password=<password> application_name=”host_name”‘
recovery_target_timeline = ‘latest’
standby_mode = ‘on’ primary_conninfo = ‘host=<master_host> port=<postgres_port> user=<replication_user> password=<password> application_name=”host_name”‘ recovery_target_timeline = ‘latest’
standby_mode = ‘on’

primary_conninfo = ‘host=<master_host> port=<postgres_port> user=<replication_user> password=<password> application_name=”host_name”‘

recovery_target_timeline = ‘latest’

上述命令中使用的引數如下:

  • primary_conninfo:您可以使用它通過利用連線字串在主伺服器和輔助伺服器之間建立連線。
  • standby_mode:此引數可以使主伺服器在開啟時作為備用伺服器啟動。
  • recovery_target_timeline:您可以使用它來設定恢復時間。

要建立連線,您需要提供使用者名稱、IP地址和密碼作為primary_conninfo引數的值。例如:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
primary_conninfo = 'host=192.168.0.26 port=5432 user=rep_user password=rep_pass'
primary_conninfo = 'host=192.168.0.26 port=5432 user=rep_user password=rep_pass'
 primary_conninfo = 'host=192.168.0.26 port=5432 user=rep_user password=rep_pass'

步驟 3:重新啟動輔助伺服器

最後,您可以重新啟動輔助伺服器以完成配置過程。

但是,流式複製帶來了一些挑戰,例如:

  • 各種PostgreSQL客戶端(用不同的程式語言編寫)與單個端點進行通訊。當主節點出現故障時,這些客戶端將繼續重試相同的DNS或IP名稱。這使得故障轉移對應用程式可見。
  • PostgreSQL複製沒有內建故障轉移和監控功能。當主節點發生故障時,您需要將輔助節點提升為新的主節點。此提升需要以客戶端僅寫入一個主節點的方式執行,並且他們不會觀察到資料不一致。
  • PostgreSQL複製它的整個狀態。當你需要開發一個新的從節點時,從節點需要從主節點回顧整個狀態變化的歷史,這是資源密集型的,並且使得消除頭部節點並建立新節點的成本很高。

方法二:複製塊裝置

複製塊裝置方法依賴於磁碟映象(也稱為卷複製)。在這種方法中,更改被寫入持久卷,該卷被同步映象到另一個卷。

這種方法的額外好處是它在雲環境中與所有關聯式資料庫(包括PostgreSQL、MySQL和SQL Server等)的相容性和資料永續性。

但是,PostgreSQL複製的磁碟映象方法需要您複製 WAL 日誌和表資料。由於現在對資料庫的每次寫入都需要通過網路同步進行,因此您不能丟失一個位元組,因為這可能會使您的資料庫處於損壞狀態。

這種方法通常使用Azure PostgreSQL和Amazon RDS。

方法三:WAL

WAL由段檔案組成(預設為16MB)。每個段都有一個或多個記錄。日誌序列記錄 (LSN) 是指向WAL中記錄的指標,讓您知道記錄在日誌檔案中儲存的位置/位置。

備用伺服器利用WAL段(在PostgreSQL術語中也稱為XLOGS)來不斷複製其主伺服器的更改。您可以使用預寫日誌記錄來授予DBMS中的永續性和原子性,方法是在將位元組陣列資料塊(每個都有一個唯一的LSN)序列化到穩定儲存之前,然後再將它們應用於資料庫。

將突變應用於資料庫可能會導致各種檔案系統操作。出現的一個相關問題是資料庫如何在檔案系統更新過程中由於斷電而導致伺服器故障的情況下確保原子性。當資料庫啟動時,它會開始一個啟動或重放過程,該過程可以讀取可用的WAL段並將它們與儲存在每個資料頁上的LSN進行比較(每個資料頁都標記有影響該頁的最新WAL記錄的LSN)。

基於日誌傳送的複製(塊級)

流式複製改進了日誌傳送過程。與等待WAL切換相反,記錄在建立時傳送,從而減少複製延遲。

流複製還勝過日誌傳送,因為備用伺服器通過利用複製協議通過網路與主伺服器連結。然後,主伺服器可以直接通過此連線傳送WAL記錄,而無需依賴終端使用者提供的指令碼。

基於日誌傳送的複製(檔案級)

日誌傳送定義為將日誌檔案複製到另一個PostgreSQL伺服器以通過重放 WAL 檔案來生成另一個備用伺服器。該伺服器被配置為在恢復模式下工作,其唯一目的是應用任何出現的新WAL檔案。

然後,此輔助伺服器將成為主PostgreSQL伺服器的熱備份。它還可以配置為只讀副本,它可以提供只讀查詢,也稱為熱備用。

連續WAL歸檔

在建立WAL檔案時將它們複製到除pg_wal子目錄以外的任何位置以將它們歸檔稱為WAL歸檔。每次建立WAL檔案時,PostgreSQL都會呼叫使用者提供的指令碼進行歸檔。

該指令碼可以利用scp命令將檔案複製到一個或多個位置,例如NFS掛載。歸檔後,可以利用WAL段檔案在任何給定時間點恢復資料庫。

其他基於日誌的配置包括:

  • 同步複製:在每個同步複製事務被提交之前,主伺服器等待直到備用伺服器確認他們獲得了資料。這種配置的好處是不會因為並行寫入過程而引起任何衝突。
  • 同步多主複製:在這裡,每個伺服器都可以接受寫入請求,並且在每個事務提交之前,將修改的資料從原始伺服器傳輸到每個其他伺服器。它利用2PC協議並遵守全有或全無規則。

WAL流協議詳細資訊

在備用伺服器上執行的稱為 WAL 接收器的程序利用recovery.confprimary_conninfo引數中提供的連線詳細資訊,並通過利用TCP/IP連線連線到主伺服器。

要開始流式複製,前端可以在啟動訊息中傳送複製引數。布林值true、yes、1或ON讓後端知道它需要進入物理複製walsender模式。

WAL sender是另一個在主伺服器上執行的程序,負責在WAL記錄生成時將其傳送到備用伺服器。WAL接收器將WAL記錄儲存在WAL中,就好像它們是由本地連線的客戶端的客戶端活動建立的一樣。

一旦WAL記錄到達WAL段檔案,備用伺服器會不斷地重播WAL,以便主伺服器和備用伺服器是最新的。

WAL流協議流程圖

WAL流協議流程圖(圖片來源:EnterpriseDB

PostgreSQL複製的元素

在本節中,您將深入瞭解PostgreSQL複製的常用模型(單主和多主複製)、型別(物理和邏輯複製)和模式(同步和非同步)。

PostgreSQL資料庫複製的模型

可擴充套件性是指在現有節點上增加更多的資源/硬體,以增強資料庫儲存和處理更多資料的能力,可以橫向和縱向實現。PostgreSQL複製是水平可伸縮性的一個例子,它比垂直可伸縮性更難實現。我們主要通過單主複製(SMR)和多主複製(MMR)來實現橫向擴充套件。

單主複製允許僅在單個節點上修改資料,並將這些修改複製到一個或多個節點。副本資料庫中的複製表不允許接受任何更改,除了來自主伺服器的更改。即使他們這樣做了,更改也不會複製回主伺服器。

大多數時候,SMR對應用程式來說已經足夠了,因為它的配置和管理不太複雜,而且沒有衝突的機會。單主複製也是單向的,因為複製資料主要沿一個方向流動,從主資料庫到副本資料庫。

在某些情況下,僅SMR可能還不夠,您可能需要實施MMR。MMR允許多個節點充當主節點。對多個指定主資料庫中表行的更改將複製到每個其他主資料庫中的對應表。在這個模型中,經常使用衝突解決方案來避免重複主鍵等問題。

使用MMR有幾個優點,即:

  • 在主機故障的情況下,其他主機仍然可以提供更新和插入服務。
  • 主節點分佈在幾個不同的位置,因此所有主節點發生故障的機會非常小。
  • 能夠使用主要資料庫的廣域網 (WAN),該資料庫在地理位置上可以靠近客戶端組,同時保持整個網路的資料一致性。

然而,實施MMR的缺點是複雜性和解決衝突的難度。

一些分支和應用程式提供了MMR解決方案,因為PostgreSQL本身並不支援它。這些解決方案可能是開源的、免費的或付費的。一種這樣的擴充套件是雙向複製 (BDR),它是非同步的並且基於PostgreSQL邏輯解碼功能。

由於BDR應用程式在其他節點上重放事務,如果正在應用的事務與在接收節點上提交的事務之間存在衝突,則重放操作可能會失敗。

PostgreSQL複製的型別

PostgreSQL複製有兩種型別:邏輯複製和物理複製。

一個簡單的邏輯操作“initdb”將執行為叢集建立基本目錄的物理操作。同樣,一個簡單的邏輯操作“CREATE DATABASE”將執行在基本目錄中建立子目錄的物理操作。

物理複製通常處理檔案和目錄。它不知道這些檔案和目錄代表什麼。這些方法用於維護單個叢集的全部資料的完整副本,通常在另一臺機器上,並且在檔案系統級別或磁碟級別完成,並使用確切的塊地址。

邏輯複製是一種複製資料實體及其修改的方法,基於它們的複製身份(通常是主鍵)。與物理複製不同,它處理資料庫、表和DML操作,並在資料庫叢集級別完成。它使用釋出訂閱模型,其中一個或多個訂閱者訂閱釋出者節點上的一個或多個釋出。

複製過程首先對釋出者資料庫上的資料進行快照,然後將其複製到訂閱者。訂閱者從他們訂閱的釋出中提取資料,並且可以稍後重新發布資料以允許級聯複製或更復雜的配置。訂閱者以與釋出者相同的順序應用資料,從而保證單個訂閱中釋出的事務一致性,也稱為事務複製。

邏輯複製的典型用例是:

  • 將單個資料庫(或資料庫子集)中的增量更改傳送給訂閱者。
  • 在多個資料庫之間共享資料庫的一個子集。
  • 當單個更改到達訂閱者時觸發它們的觸發。
  • 將多個資料庫合併為一個。
  • 向不同的使用者組提供對複製資料的訪問。

訂閱者資料庫的行為方式與任何其他PostgreSQL例項相同,並且可以通過定義其釋出來用作其他資料庫的釋出者。

當訂閱者被應用程式視為只讀時,單個訂閱不會發生衝突。另一方面,如果應用程式或其他訂閱者對同一組表進行了其他寫入,則可能會出現衝突。

PostgreSQL同時支援這兩種機制。邏輯複製允許對資料複製和安全性進行細粒度控制。

複製模式

PostgreSQL複製主要有兩種模式:同步和非同步。同步複製允許資料同時寫入主伺服器和從伺服器,而非同步複製確保資料先寫入主機,然後再複製到從伺服器。

在同步模式複製中,僅當這些更改已複製到所有副本時,主資料庫上的事務才被視為完成。副本伺服器必須始終可用,以便在主伺服器上完成事務。同步複製模式用於具有即時故障轉移要求的高階事務環境。

在非同步模式下,當僅在主伺服器上完成更改時,可以宣告主伺服器上的事務完成。然後這些更改會在稍後的時間複製到副本中。副本伺服器可以在一定時間內保持不同步,稱為複製滯後。在崩潰的情況下,可能會發生資料丟失,但非同步複製提供的開銷很小,因此在大多數情況下是可以接受的(它不會使主機負擔過重)。從主資料庫故障轉移到輔助資料庫的時間比同步複製要長。

如何設定PostgreSQL複製

在本節中,我們將演示如何在Linux作業系統上設定PostgreSQL複製過程。在本例中,我們將使用Ubuntu 18.04 LTS和PostgreSQL 10。

important 確保您已安裝Linux Ubuntu伺服器。下面提到了在Linux伺服器上安裝PostgreSQL的步驟,然後是在主伺服器和輔助伺服器中設定複製。

安裝

您將首先通過以下步驟在Linux上安裝PostgreSQL:

  1. 首先,您必須通過在終端中鍵入以下命令來匯入PostgreSQL簽名金鑰:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O- | sudo apt-key add -
    wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O- | sudo apt-key add -
     wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O- | sudo apt-key add -
  2. 然後,通過在終端中鍵入以下命令來新增PostgreSQL儲存庫:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql.list
    echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql.list
     echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql.list
  3. 通過在終端中鍵入以下命令來更新儲存庫索引:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    sudo apt-get update
    sudo apt-get update
     sudo apt-get update
  4. 使用apt命令安裝PostgreSQL包:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    sudo apt-get install -y postgresql-10
    sudo apt-get install -y postgresql-10
     sudo apt-get install -y postgresql-10
  5. 最後,使用以下命令設定PostgreSQL使用者的密碼:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    sudo passwd postgres
    sudo passwd postgres
     sudo passwd postgres

在開始PostgreSQL複製過程之前,主伺服器和輔助伺服器都必須安裝PostgreSQL。

為兩臺伺服器設定PostgreSQL後,您可以繼續進行主伺服器和輔助伺服器的複製設定。

在主伺服器中設定複製

在主伺服器和輔助伺服器上安裝PostgreSQL後執行這些步驟。

  1. 首先,使用以下命令登入PostgreSQL資料庫:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    su - postgres
    su - postgres
     su - postgres
  2. 使用以下命令建立複製使用者:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    psql -c "CREATEUSER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD'YOUR_PASSWORD';"
    psql -c "CREATEUSER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD'YOUR_PASSWORD';"
     psql -c "CREATEUSER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD'YOUR_PASSWORD';"
  3. 在Ubuntu中使用任何nano應用程式編輯pg_hba.cnf並新增以下配置:
    檔案編輯命令

    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    nano /etc/postgresql/10/main/pg_hba.conf
    nano /etc/postgresql/10/main/pg_hba.conf
     nano /etc/postgresql/10/main/pg_hba.conf

    要配置檔案,請使用以下命令:

    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    host replication replication MasterIP/24 md5
    host replication replication MasterIP/24 md5
     host replication  replication  MasterIP/24  md5
  4. 開啟並編輯postgresql.conf並將以下配置放入主伺服器:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    nano /etc/postgresql/10/main/postgresql.conf
    nano /etc/postgresql/10/main/postgresql.conf
     nano /etc/postgresql/10/main/postgresql.conf

    使用以下配置設定:

    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    listen_addresses = 'localhost,MasterIP'
    wal_level = replica
    wal_keep_segments = 64
    max_wal_senders = 10
    listen_addresses = 'localhost,MasterIP' wal_level = replica wal_keep_segments = 64 max_wal_senders = 10
     listen_addresses = 'localhost,MasterIP'
     wal_level = replica
     wal_keep_segments = 64
     max_wal_senders = 10
  5. 最後,在主主伺服器中重新啟動PostgreSQL:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
systemctl restart postgresql
systemctl restart postgresql
 systemctl restart postgresql

您現在已經完成了主伺服器中的設定。

在輔助伺服器中設定複製

按照以下步驟在輔助伺服器中設定複製:

  1. 使用以下命令登入PostgreSQL RDMS:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    su - postgres
    su - postgres
     su - postgres
  2. 停止PostgreSQL服務的工作以使我們能夠使用以下命令對其進行處理:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    systemctl stop postgresql
    systemctl stop postgresql
     systemctl stop postgresql
  3. 使用此命令編輯pg_hba.conf檔案並新增以下配置:
    編輯命令

    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    nano /etc/postgresql/10/main/pg_hba.conf
    nano /etc/postgresql/10/main/pg_hba.conf
     nano /etc/postgresql/10/main/pg_hba.conf

    配置

    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    host replication replication MasterIP/24 md5
    host replication replication MasterIP/24 md5
     host replication  replication  MasterIP/24  md5
  4. 在輔助伺服器中開啟並編輯postgresql.conf並放置以下配置或取消註釋(如果已註釋):
    編輯命令配置

    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    nano /etc/postgresql/10/main/postgresql.conf
    nano /etc/postgresql/10/main/postgresql.conf
     nano /etc/postgresql/10/main/postgresql.conf
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    listen_addresses = 'localhost,SecondaryIP'
    listen_addresses = 'localhost,SecondaryIP'
     listen_addresses = 'localhost,SecondaryIP'
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    wal_keep_segments = 64
    wal_keep_segments = 64
     wal_keep_segments = 64
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    wal_level = replica
    wal_level = replica
     wal_level = replica
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    hot_standby = on
    hot_standby = on
     hot_standby = on
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    max_wal_senders = 10
    max_wal_senders = 10
     max_wal_senders = 10

    SecondaryIP是輔助伺服器的地址

  5. 訪問輔助伺服器中的PostgreSQL資料目錄並刪除所有內容:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    cd /var/lib/postgresql/10/main
    cd /var/lib/postgresql/10/main
     cd /var/lib/postgresql/10/main
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    rm -rfv *
    rm -rfv *
    rm -rfv *
  6. 將PostgreSQL主伺服器資料目錄檔案複製到PostgreSQL輔助伺服器資料目錄,並在輔助伺服器中寫入此命令:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    pg_basebackup -h MasterIP -D /var/lib/postgresql/11/main/ -P -U
    pg_basebackup -h MasterIP -D /var/lib/postgresql/11/main/ -P -U
     pg_basebackup -h MasterIP -D /var/lib/postgresql/11/main/ -P -U
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    replication --wal-method=fetch
    replication --wal-method=fetch
    replication --wal-method=fetch
  7. 輸入主伺服器PostgreSQL密碼並回車。接下來,為恢復配置新增以下命令:編輯命令
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    nano /var/lib/postgresql/10/main/recovery.conf
    nano /var/lib/postgresql/10/main/recovery.conf
     nano /var/lib/postgresql/10/main/recovery.conf

    配置

    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    standby_mode = 'on'
    primary_conninfo = 'host=MasterIP port=5432 user=replication password=YOUR_PASSWORD'
    trigger_file = '/tmp/MasterNow'
    standby_mode = 'on' primary_conninfo = 'host=MasterIP port=5432 user=replication password=YOUR_PASSWORD' trigger_file = '/tmp/MasterNow'
    standby_mode   = 'on'
    primary_conninfo = 'host=MasterIP port=5432 user=replication password=YOUR_PASSWORD'
    trigger_file = '/tmp/MasterNow'
    

    這裡,YOUR_PASSWORD是PostgreSQL建立的主伺服器中複製使用者的密碼

  8. 設定密碼後,您必須重新啟動輔助PostgreSQL資料庫,因為它已停止:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
systemctl start postgresql
systemctl start postgresql
systemctl start postgresql

測試您的設定

現在我們已經執行了這些步驟,讓我們測試複製過程並觀察輔助伺服器資料庫。為此,我們在主伺服器中建立一個表,並觀察它是否反映在輔助伺服器上。

  1. 由於我們在主伺服器中建立表,您需要登入到主伺服器:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    su - postgres
    psql
    su - postgres psql
     su - postgres
    psql
  2. 現在我們建立一個名為“testtable”的簡單表,並通過在終端中執行以下PostgreSQL查詢將資料插入到表中:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    CREATE TABLE testtable (websites varchar(100));
    INSERT INTO testtable VALUES ('section.com');
    INSERT INTO testtable VALUES ('google.com');
    INSERT INTO testtable VALUES ('github.com');
    CREATE TABLE testtable (websites varchar(100)); INSERT INTO testtable VALUES ('section.com'); INSERT INTO testtable VALUES ('google.com'); INSERT INTO testtable VALUES ('github.com');
     CREATE TABLE testtable (websites varchar(100));
    INSERT INTO testtable VALUES ('section.com');
    INSERT INTO testtable VALUES ('google.com');
    INSERT INTO testtable VALUES ('github.com');
  3. 登入從伺服器觀察從伺服器PostgreSQL資料庫:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    su - postgres psql
    su - postgres psql
     su - postgres psql
  4. 現在,我們檢查表 ‘testtable’ 是否存在,並且可以通過在終端中執行以下PostgreSQL查詢來返回資料。該命令實質上顯示了整個表格。
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    select * from testtable;
    select * from testtable;
     select * from testtable;

這是測試表的輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
| websites |
-------------------
| section.com |
| google.com |
| github.com |
--------------------
| websites | ------------------- | section.com | | google.com | | github.com | --------------------
|  websites  |
-------------------
| section.com |
| google.com |
| github.com  |
--------------------

您應該能夠觀察到與主伺服器中的資料相同的資料。

如果您看到以上內容,那麼您已經成功進行了複製過程!

手動切換PostgreSQL故障伺服器步驟

讓我們回顧一下PostgreSQL手動切換故障伺服器的步驟:

  1. 主伺服器崩潰。
  2. 通過在備用伺服器上執行以下命令來提升備用伺服器:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    ./pg_ctl promote -D ../sb_data/
    server promoting
    ./pg_ctl promote -D ../sb_data/ server promoting
    ./pg_ctl promote -D ../sb_data/
    server promoting
  3. 連線到提升的備用伺服器並插入一行:
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    -bash-4.2$ ./edb-psql -p 5432 edb
    Password:
    psql.bin (10.7)
    Type "help" for help.
    edb=# insert into abc values(4,'Four');
    -bash-4.2$ ./edb-psql -p 5432 edb Password: psql.bin (10.7) Type "help" for help. edb=# insert into abc values(4,'Four');
     -bash-4.2$ ./edb-psql -p 5432 edb
    Password:
    psql.bin (10.7)
    Type "help" for help.
    edb=# insert into abc values(4,'Four');
    

如果插入工作正常,則備用伺服器(以前是隻讀伺服器)已升級為新的主伺服器。

如何在PostgreSQL中進行故障伺服器自動切換

設定故障伺服器自動切換很容易。

您將需要EDB PostgreSQL故障切換管理器 (EFM)。在每個主節點和備用節點上下載並安裝EFM後,您可以建立一個EFM叢集,該叢集由一個主節點、一個或多個備用節點以及一個在發生故障時確認斷言的可選見證節點組成。

EFM持續監控系統執行狀況並根據系統事件傳送電子郵件警報。當發生故障時,它會自動切換到最新的備用伺服器並重新配置所有其他備用伺服器以識別新的主節點。

它還重新配置負載平衡器(例如pgPool)並防止“split-brain”(當兩個節點都認為它們是主節點時)發生。

小結

由於資料量大,可伸縮性和安全性已成為資料庫管理中最重要的兩個標準,尤其是在事務環境中。雖然我們可以通過向現有節點新增更多資源/硬體來縱向提高可擴充套件性,但這並不總是可行的,通常是由於新增新硬體的成本或限制。

因此,需要水平可擴充套件性,這意味著向現有網路節點新增更多節點,而不是增強現有節點的功能。這就是PostgreSQL複製出現的地方。

在本文中,我們討論了PostgreSQL複製的型別、優勢、複製模式、安裝以及SMR和MMR之間的PostgreSQL故障伺服器切換。

評論留言