最近隨着學習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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。