PostgreSQL 9.5.5主從實現之非同步流複製(Hot Standby)

來源:互聯網
上載者:User

標籤:min   方便   注意   replicat   recovery   send   大於   非同步   ase   

前言

簡單記錄一下postgresql主從的實現方式之一——基於Standby的非同步流複製,這是PostgreSQL9.x版本(2010.9)之後提供的一個很nice的功能,類似的功能在Oracle中是11g之後才提供的active dataguard和SQL Server 2012版本之後才提供的記錄傳送,此處再次為pg鼓掌,確實是一個很棒的開來源資料庫。廢話不多說,本篇blog就詳細記錄一下在pg9.5中實現Hot Standby非同步流複製的完整配置過程和注意事項。

Standby資料庫原理

簡單介紹一些基礎概念與原理,首先我們做主從同步的目的就是實現db服務的高可用性,通常是一台主要資料庫提供讀寫,然後把資料同步到另一台從庫,然後從庫不斷apply從主庫接收到的資料,從庫不提供寫服務,只提供讀服務。在postgresql中提供讀寫全功能的伺服器稱為primary databasemaster database,在接收主庫同步資料的同時又能提供讀服務的從程式庫伺服器稱為hot standby server

PostgreSQL在資料目錄下的pg_xlog子目錄中維護了一個WAL記錄檔,該檔案用於記錄資料庫檔案的每次改變,這種記錄檔機制提供了一種資料庫熱備份的方案,即:在把資料庫使用檔案系統的方式備份出來的同時也把相應的WAL日誌進行備份,即使備份出來的資料區塊不一致,也可以重放WAL日誌把備份的內容推到一致狀態。這也就是基於時間點的備份(Point-in-Time Recovery),簡稱PITR。而把WAL記錄傳送到另一台伺服器有兩種方式,分別是:

  1. WAL日誌歸檔(base-file)
  2. 流複製(streaming replication)

第一種是寫完一個WAL日誌後,才把WAL記錄檔拷貝到standby資料庫中,簡言之就是通過cp命令實現遠程備份,這樣通常備庫會落後主庫一個WAL記錄檔。而第二種流複製是postgresql9.x之後才提供的新的傳遞WAL日誌的方法,它的好處是只要master庫一產生日誌,就會馬上傳遞到standby庫,同第一種相比有更低的同步延遲,所以我們肯定也會選擇流複製的方式。

在實際操作之前還有一點需要說明就是standby的搭建中最關鍵的一步——在standby中產生master的基礎備份。postgresql9.1之後提供了一個很方便的工具—— pg_basebackup,關於它的詳細介紹和參數說明可以在官網中查看(pg_basebackup tool),下面在搭建過程中再做相關具體說明,關於一些基礎概念和原理先介紹到這裡。

詳細配置

下面開始實戰,首先準備兩台伺服器,我這裡開了2個虛機做測試,分別是:

  1. 主庫(master) centos-release-7-2.1511 192.168.111.101 postgresql 9.5.5
  2. 從庫(standby) centos-release-7-2.1511 192.168.111.102 postgresql 9.5.5

從主庫配置開始。

主庫配置

注意此處的操作都是在主庫(192.168.111.101)上進行的,首先開啟資料目錄下的postgresql.conf檔案然後做以下修改:

  1. listen_address = ‘*’(預設localhost)
  2. wal_level = hot_standby(預設是minimal)
  3. max_wal_senders=2(預設是0)
  4. wal_keep_segments=64(預設是0)

下面稍作說明,第一個不用說了,wal_level表示啟動搭建Hot Standby,max_wal_senders則需要設定為一個大於0的數,它表示主庫最多可以有多少個並發的standby資料庫,而最後一個wal_keep_segments也應當設定為一個盡量大的值,以防止主庫產生WAL日誌太快,日誌還沒有來得及傳送到standby就被覆蓋,但是需要考慮磁碟空間允許,一個WAL記錄檔的大小是16M:

如,一個WAL記錄檔是16M,如果wal_keep_segments設定為64,也就是說將為standby庫保留64個WAL記錄檔,那麼就會佔用16*64=1GB的磁碟空間,所以需要綜合考慮,在磁碟空間允許的情況下設定大一些,就會減少standby重新搭建的風險。接下來還需要在主庫建立一個超級使用者來專門負責讓standby串連去拖WAL日誌:

create user repl superuser password ‘111111‘; 

接下來開啟資料目錄下的pg_hba.conf檔案然後做以下修改:

如,這行配置的意思是允許使用者repl從192.168.111.0/24網路上發起到本資料庫的流複製串連,簡言之即允許從程式庫伺服器串連主庫去拖WAL日誌資料。主庫配置很簡單,到此就算結束了,啟動主庫並繼續配置從庫。

從庫配置

從此處開始配置從庫(192.168.111.102),首先要通過pg_basebackup命令列工具在從庫上產生基礎備份,命令如下:

./pg_basebackup -h 192.168.111.101 -U repl -F p -x -P -R -D /usr/local/postgresql/data/ -l replbackup20161122

下面簡單做一下參數說明(可以通過pg_basebackup --help進行查看),-h指定串連的資料庫的主機名稱或IP地址,這裡就是主庫的ip。-U指定串連的使用者名稱,此處是我們剛才建立的專門負責流複製的repl使用者。-F指定了輸出的格式,支援p(原樣輸出)或者t(tar格式輸出)。-x表示備份開始後,啟動另一個流複製串連從主庫接收WAL日誌。-P表示允許在備份過程中即時的列印備份的進度。-R表示會在備份結束後自動產生recovery.conf檔案,這樣也就避免了手動建立。-D指定把備份寫到哪個目錄,這裡尤其要注意一點就是做基礎備份之前從庫的資料目錄(/usr/local/postgresql/data)目錄需要手動清空。-l表示指定一個備份的標識,運行命令後看到如下進度提示就說明產生基礎備份成功:

如,由於我們在pg_hba.conf中指定的md5認證方式,所以需要輸入密碼。最後還需要修改一下從庫資料目錄下的postgresql.conf檔案,將hot_standby改為啟用狀態,即hot_standby=on。到此為止就算配置結束了,我們現在可以啟動從庫,如果啟動成功就說明配置成功,在從庫運行pg_ctl start -l /usr/local/postgresql/log/pg_server.log啟動後看一下日誌:

如,確實報了一個嚴重錯誤,根據提示說明的是data目錄的許可權有問題,該目錄的許可權應當設定為rwx(0700),那麼我們切回root使用者重新給data目錄設定許可權:

chmod -R 0700 /usr/local/postgresql/data/

之後再次切回postgres使用者啟動從庫,這次發現並沒有任何錯誤記錄檔了,通過ps -ef|grep postgres查看一下進程:

如,可以看到流複製的進程,同樣的主庫也能看到該進程,現在就可以建表做測試了,在master伺服器(192.168.111.101)中的postgres庫下建一張表並添加幾條資料:

然後在standby伺服器(192.168.111.102)中進行查看同步情況:

如,可以看到完美同步,那麼從庫是否能刪除呢?測試一下:

如,standby的資料無法刪除,正如我們之前說的,standby只提供唯讀服務,而只有master才能進行讀寫操作,所以master才有許可權刪除資料,master刪除的同時standby中的資料也將同步刪除,關於非同步流複製的內容到這裡就已經全部介紹完畢了。

總結

簡單記錄一下PostgreSQL9.5.5通過流複製實現主從同步的過程,希望對遇到同樣問題的朋友有所協助,The End。

PostgreSQL 9.5.5主從實現之非同步流複製(Hot Standby)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.