PostgreSQL 流複製搭建和原理理解

最近隨着學習PostgreSQL 的深刻,愈加的喜歡這個數據庫,以前曾經寫過關於PostgreSQL 關於模糊查詢的文字,在我使用的時候,的確是驚豔到了,ORACLE ,SQL SERVER 這樣的收費數據庫不能作的,PG輕易的化解,無愧是世界上最好的開源數據庫了(其實去掉開源那兩個字也不是擔當不起)。數據庫

和MYSQL 不一樣,MYSQL的複製是基於邏輯複製,而PG 具備流複製和邏輯複製兩個功能。提到流複製若是讓我理解,想到就是ORACLE Dataguard 這樣的功能,固然ORALCE 也有流複製和高級複製等功能,這裏就再也不說起。安全


這裏複製的技術不少,有shared disk failover , write-Ahead log shipping , logincal replication , 等等今天咱們要學習的就是 微信

Write-ahead log shipping ,這個功能。app

那使用這個功能對咱們有什麼好處異步

 

1 它是一個內建功能tcp

2 鏈接的方式是經過 wal ahead log 的方式學習

3 沒有特別的硬件需求spa

4 對主機的運行基本沒有影響.net

5 能夠設置數據的同步和異步 3d

6 Standy 庫是能夠進行只讀的活動


讀完上面的點,發現經過流的方式複製其實比邏輯的複製好的地方,就是1 沒有事務衝突  2 不會有事務較大,形成延遲的問題  3 數據在切換過程當中,不會有數據丟失的擔憂。


以上都是MYSQL 在複製的過程當中,我可能會擔憂的問題。

流複製是PostgreSQL 在 9.0 推出的功能,其中主要由三個進程

1  walsender

2  walreceiver

3  startup

這三者是怎麼工做的咱們的畫一個圖來 分析一下。


1  Standby 庫經過 walreciever 來嘗試鏈接到 主庫

2  Primary 主庫會經過wal sender來進行 tcp -IP 方式的鏈接,握手確認鏈接

3  從庫的standby 會發送目前他最後的一次的LSN 號碼給主庫,從庫的LSN 號必然必須小於主庫(若是是反向的,說明主庫的數據落後於從庫,或是其餘問題,這樣的複製是沒有辦法進行的)

4 主庫會提供 WAL Segments 並開始進行復制的數據發送的工做


經過

select application_name,state from pg_stat_replication;如下的語句來查看當前庫是否在進行sender 的狀態。



說到這裏,其實每種數據庫的複製都會存在一個問題就是若是STANDBY 庫從新啓動或者STANDBY 沒有跟上 PRIMARY 庫的發送日誌的速度,則結果就是複製失敗。而PostgreSQL有兩個方法來盡力拯救這樣的事情,

1  提升 wal_keep_segments  這讓我想起了 MONGODB 提升OPLOG 的存儲大小來讓MONGODB 複製不會產生相似的問題。

2  使用replication slot 的方式和功能來靈活的進行WAL 數據的發送。


其實大白話就是  要不我在 發送端作點什麼,要不我在接收端作點什麼。

同時咱們能夠經過 sent_lsn, write_lsn,flush_lsn, replay_lsn, 來判斷咱們的複製的狀態如何。



3  PG 的複製中,能夠是多從的結構。


說完這些,須要探討配置流複製中的參數了


首先要打開 POSTGRESQL 的複製


1   wal_level =  replica

肯定寫入WAL 的信息的多少, 若是想調整這個參數,須要在開啓服務前就進行設置

若是設置爲 minimal level 則相似 create table as  create index , copy 等命令的日誌就不會被記錄



2  synchronous_commit    相關的選項

   on , remote_apply , remote_write , local

默認的安全值是ON  同時 若是你選擇 remote_apply  或者 remote_write  則會等待standby的主機進行相關的回饋,主庫才能繼續後面操做。


3 max_wal_sender  設置最大的primary standby的 鏈接數,默認爲10


4  wal_keep_segments 這裏指定最大能夠保持多少  wal 日誌的數量,一個WAL 的日誌數量是 16MB 。 


5 wal_sender_timeout  默認檢測 standby 的沒有響應的時間默認是60 秒


6  synchronous_standby_name = 'standby_name one by one'

  在PG的設置中有一個功能是能夠設置一個備用機,與PG 的主機進行流複製,當備用機中止工做的時候,主機也中止工做。在上面的參數選項中,須要填寫具體的那臺standby機器須要,與主庫中這樣的關係。

同時須要在standby庫去設置


須要在從庫的recovery.conf 中來設置


7  如下的設置時在 standby下進行的

hot_standby = on   容許在recovery 的狀態下,進行查詢的語句


 

其餘,在配置完相關的參數後,須要使用 pg_basebackup 將主庫的數據拉到備庫,配置參數後啓動備庫,則相似 ORACLE dataguard  的PG 流複製就生效了。


今天就這樣了,休息,休息, 下次見吧  (找個時間的研究一下複製槽slot 的問題)


本文分享自微信公衆號 - AustinDatabases(AustinDatabases)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索