pitr 原理_PostgreSQL热备原理研究及流复制运用
付莎
摘要:高可用性(HA-High Availability)是所有商用數據庫系統必須具備的一項基本功能。該文闡述了PostgreSQL數據庫的高可用性的實現原理及方法,并對PostgreSQL數據庫的原生流復制功能實現高可用性熱備功能進行了應用描述。
關鍵詞:PostgreSQL;高可用性;熱備;流復制
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)12-0001-03
Abstract: HA-High Availability is a basic function that all commercial database systems must have. This paper describes the realization principles and methods of HA-high availability PostgreSQL database, and describes the application of PostgreSQL database's native streaming replication function to achieve high availability hot standby function.
Key words: PostgreSQL; HA-High Availability; hot standby; streaming replication
PostgreSQL是一套企業級的、跨平臺、高度可定制的、功能強大的開源數據庫系統。其可靠性、穩定性、數據一致性等獲得了業界內極高的聲譽。是唯一能實現數據零丟失的開源數據庫系統。隨著PostgreSQL的商用逐漸推動,在數據庫市場上成為對標Oracle,MSSQL等傳統大型商業數據庫的有力競爭者[1]。
數據庫系統中,數據是所有一切的基礎。數據的安全性和一致性是數據庫系統中的重中之重。數據可能由于不可預見的各種原因丟失或損壞,因此數據的備份成為保證數據安全性的一個重要的后備手段。在此方面,企業級的PostgreSQL提供了多種功能特性保障數據的安全和可用性。
1 PostgreSQL數據備份
PostgreSQL可實現三種不同級別的數據備份方法:
SQL轉儲:利用pg_dump工具將數據轉儲為標準SQL語句組成的文件。需要時執行SQL語句即可恢復數據。此種方式通用性最好,實現簡便,可在不同版本及不同操作系統間遷移和恢復數據。缺點為只能實現數據庫的定期及全量備份。
文件系統級別備份:利用文件系統直接復制PostgreSQL數據文件進行備份操作,獲取一個數據文件的“快照”。需要恢復或遷移時,再將“快照”文件拷貝至目標路徑。此種方式實現簡便,但限制條件也比較苛刻。(1)備份和恢復時,目標數據庫必須停機操作。在一些特定系統中,停機是無法接受的。(2)只能備份和恢復整臺服務器,不能有針對性的操作某一特定的數據庫,數據容量巨大。(3)操作系統和PostgreSQL版本必須一致。
連續歸檔和時間點恢復(PITR):利用PostgreSQL提供的WAL(預寫式日志)文件的連續歸檔特性,“備份”WAL文件。在“基礎備份”的基礎上,當需要恢復和遷移數據時,目標數據庫上“重放”WAL,使目標數據庫與原始數據庫數據保持一致?;凇爸胤拧盬AL,可實現“增量”備份、“任意時間點”恢復、“溫備”和“熱備”等多種備份方式。此種方式技術實現相比較最為復雜,但可靠性和靈活性上卻最高。在保障系統高可用性情況下,應是首選備份技術[2][4]。
以上三種數據備份方式各有優缺點,但相比較下,只有使用WAL連續歸檔技術實現數據備份、故障遷移,保障高可用性最為有效和便捷。
2 備份原理
2.1 WAL文件
WAL(Write Ahead Log)預寫式日志文件是PostgreSQL中一個重要機制。作用與Oracle中redo log文件作用類似。用于保障數據的一致性以及事務的完整性。避免系統在崩潰時數據還在某級緩沖中,沒來得及寫入持久化文件中的臟數據產生的數據不一致性。具體來說,WAL的核心概念是數據文件的修改必須在這些動作被日志記錄之后才被寫入。WAL記錄了完整的操作數據以及動作,先于數據被寫入數據文件前順序寫入文件系統。WAL中的每一條記錄使用CRC-32校驗碼保護,首先就保證了WAL的完整性。當系統需要重建數據時,由于WAL先于數據寫入,則可順序“回放”WAL文件中的先前數據和操作,直至某一設定時間點或WAL文件末尾停止,從而達到和先前一致的數據庫狀態。
WAL被PostgreSQL默認劃分成16MB的段文件,按一定規則順序命名文件并保存于系統pg_xlog目錄下。默認情況下WAL被設置為minimal級別,該級別下某些批量操作的WAL可以被安全的跳過,這樣這些操作能更快地完成。但該級別不包含有足夠的信息來從基礎備份和WAL來重建數據。因此構架高可用性系統時必須設置高于minimal的級別使用,例如archive或更高級別,以保證WAL包含有足夠的重建數據信息[2]。
2.2 啟用WAL歸檔、傳輸實現備份
當系統啟用archive或更高級別的WAL級別時,我們可通過歸檔WAL文件實現數據的備份。Postgresql并沒有限定我們怎么樣歸檔數據,而是提供了一個參數來自定義歸檔動作。當WAL文件產生后,我們可以簡單的設置參數為拷貝WAL文件至另一磁盤驅動器目錄,或執行復雜腳本將WAL傳輸至網絡上另一臺服務器。
利用上述WAL技術特性,我們可以簡單的描述實現“雙機熱備”的過程。(1)設置主機歸檔模式wal_level為archive;(2)主機使用PostgreSQL提供的pg_basebackup等工具制作一次基礎備份并將備份文件拷貝至備機,完成一次主被機間的基礎備份;(3)主機產生WAL文件后通過archive_command參數調度命令傳輸至備機;(4)備機接收到WAL文件后,持續恢復主機的WAL文件,最大限度跟上主機數據產生速度[1][7]。
當主機發生故障時,此時由于主備機間傳輸WAL文件可能具有一定的延時原因或主機WAL文件并沒有填充完一塊(默認16MB),還沒有開始傳輸,主備機間數據可能并不一致,備機落后于主機。此時如果使用故障遷移并使用備機提供數據服可能存在一定的數據丟失,但在某種程度上已經最大限度地保證了系統的可用性[2]。
2.3 PostgreSQL熱備
通過上述WAL文件在主備服務器間的歸檔、傳輸以及重放,我們已經了解了PostgreSQL的“溫備”原理。如需進一步提升備份級別,實現真正意義上的熱備,我們必須通過其他技術手段減小主備服務器間的數據同步延時,實現主備服務器間的快速同步。
3流復制
3.1 流復制原理
PostgreSQL流復制是PostgreSQL9.0版本后才提供的功能,它的基本原理與上述主服務器WAL日志歸檔后傳輸至備服務器并重放以保證主備服務器數據一致情形類似。但流復制從PostgreSQL系統層面對這一過程進行了簡化。首先主備服務器間使用PostgreSQL提供的TCP協議建立網絡連接,不再使用archive_command參數命令進行第三方WAL文件傳輸。主服務器在數據變動并產生WAL記錄后(并不需要完整一塊16MB文件,僅為一次操作記錄)立即將記錄以TCP數據流的方式傳送給備服務器,而不必等到 WAL文件被填充后成才進行傳輸[2]。此種機制極大的縮減了主備服務器間的數據同步延遲,擁有更高效的可用度。同時PostgreSQL9.0版本后提供了Hot Standby功能,支持備機在流復制基礎上同步主服務器數據的同時還能提供備機數據的只讀訪問。此特性極大地提升了用戶體驗,也使數據庫的讀寫分離、負載均衡等功能從PostgreSQL系統層面提供了技術實現(之前版本只能通過第三方插件形式實現)。PostgreSQL9.2版本后提供了級聯復制功能,在實現主備服務器流復制數據同步的同時,備服務器還可將WAL轉發給其他下位備機,實現更大規模的集群。流復制技術為數據庫的熱備、高可用性、負載均衡等提供了原生技術支持[5][6]。
當啟用PostgreSQL主備服務器流復制功能后,將有walsender、walreceiver和startup三個進程啟動參與整個流復制功能。簡單來說walsender進程從主服務器啟動,主要負責將主服務器產生的WAL日志記錄發送給下位機;walreceiver進程則從備服務器啟動,對應walsender進程與之通訊,主要負責接收上位機發送的WAL日志記錄;startup進程則從備服務器啟動,主要負責將walreceiver進程接收到WAL日志記錄在備服務器上“回放”,以便達到主備服務器間的數據同步。在級聯模式下,一臺備服務器可能同時啟動三個進程,即既負責接收上位機的WAL日志記錄并回放,同時也將WAL日志記錄繼續發往下位機[3][5]。
3.2 異步流復制
PostgreSQL默認情況下啟用的為異步流復制模式。此模式下主服務器不等待備機確認,主服務器上數據成功提交即視為操作完成。并將完成結果反饋給前臺提交此操作的客戶端。
假設上述操作完成后主服務器崩潰,某些已被提交的WAL日志還沒來得及復制到備服務器(例如網絡延時等),如此時進行了故障遷移,由于備服務器上則沒有這筆操作數據,但此時前臺客戶端卻得到了操作成功指令,這時將導致數據丟失。
再如主服務器上數據已成功提交,但還沒來得及復制到備服務器(例如網絡延時),并且運行著負載均衡架構,備服務器提供只讀查詢服務,那么此時使用備服務器查詢到的結果將和主服務器數據不同,產生了數據不一致。
異步流復制雖然有可能產生上述問題,但異步流復制只需主服務確認即可的特性大大提升了系統的負載。在部分非關鍵的系統應用中也是一種可選方案[2]。
3.3 同步流復制
PostgreSQL開啟配置參數synchronous_commit=on即可開啟同步流復制。同步流復制能夠保證一個事務的所有修改都能被傳送到一臺同步備服務器。在請求同步流復制時,一個寫事務的每次提交將一直等待,直到收到一個確認表明該提交在主服務器和備服務器上都已經被寫入到磁盤上的事務日志中。即保證主備服務器WAL日志雙雙落盤才返回成功[2][6]。此時雖然增加了主備服務期間來回通訊確認的等待時間,延長了前臺客戶端請求事務的響應時間。但等待確認提高了用戶對于修改不會丟失的信心。此外如果有多臺備服務器連接主服務器進行數據同步,通過配置參數synchronous_standby_names,還可設置等待全部或其中某幾臺完成WAL落盤確定即返回成功。在多臺數據同步的集群中,可在高可用性和系統性能上找到一個平衡點[2][7]。
4 流復制應用
上述已就PostgreSQL的備份和流復制構建熱備進行了原理和理論闡述。本節將就PostgreSQL雙機同步流復制實現熱備和故障遷移應用給出實現方案。目標:實現雙機異地PostgreSQL數據庫容災熱備。
預設主備機IP地址:主機192.10.1.100 備機192.10.1.101。下述配置文件*.conf都默認位于PostgreSQL安裝路徑data目錄下。PostgreSQL9.3以上版本。
4.1 主機postgresql.conf文件配置
設置listen_addresses = '*';主服務器開啟監聽所有客戶地址訪問許可,默認值為只能監聽本機訪問,網絡上其他服務器不允許連接。
設置wal_level = hot_standby;主服務WAL日志級別使用hot_standby級別,此級別下日志記錄的信息和上文提到的archive相同,但外加了從WAL重建運行事務狀態所需的其他信息,流復制必須設置此級別。
設置max_wal_senders=2;設置向備服務器進行發送walsender進程的最大連接數。本例中由于是使用雙機熱備,連接數2即可。
設置wal_keep_segments = 128;設置WAL文件被重用的最大值,確保舊的WAL段不會被太早重用(文件系統會對WAL進行循環覆蓋使用以便節約磁盤空間)。避免由于主機數據量巨大,而備機還尚未處理,而主機已經覆蓋了待未傳輸至備機處理的WAL文件。可根據系統負載情況調整[2]。
設置synchronous_commit=on;設置事務為同步模式。保證備機將提交記錄寫入到持久化存儲中,主機事務才能成功返回[1][7]。
4.2 主機pg_hba.conf文件配置
增加配置項:host replication postgres 192.10.1.101/32 md5;增加IP192.10.1.101備機使用用戶postgres 使用流復制功能訪問許可。
上述配置完畢后重啟PostgreSQL數據庫,以便新設置項生效。
4.3 主機進行基礎備份
a.開啟pgsql程序,執行命令:select pg_start_backup('basebackup');此命令將使系統進入備份模式,執行基礎備份。
b.待執行完畢后拷貝出data數據目錄備用。
c.拷貝完畢后執行select pg_stop_backup();此命令系統終止備份模式并讓在備份期間寫入的最后一個WAL段文件能準備好被歸檔[1][2]。
4.4 備機拷貝文件
刪除備機data目錄下所有文件,并將上一步主機拷貝出的data目錄下所有文件拷貝至備機data目錄下。
4.5 備機postgresql.conf文件配置
設置hot_standby=on;開啟備機在歸檔恢復期間或備機模式下開啟只讀查詢模式。
4.6 備機recover.conf文件配置
備機創建recover.conf文件,并放置于data目錄下。
設置standby_mode = 'on';指定為備機模式啟動;
設置recovery_target_timeline = 'latest';使備機恢復到歸檔中能找到的最新的時間線,保持和主機的數據同步。
設置primary_conninfo='host=192.10.1.100 user=postgres password=主機登陸口令';設置備機連接主機進行流復制的連接字符串。
4.7 備機啟動
上述配置完成后啟動備機即可完成PostgreSQL雙機同步熱備服務器配置。
4.8 故障遷移
假設最壞的情況發生了,主機崩潰無法繼續提供服務,此時可使用故障遷移將備機提升為主機,從只讀模式提升為提供讀寫服務。保障系統的高可用性。故障遷移必須手動操作,有兩種方式:
備機recover.conf配置文件中設置trigger_file項,值為某一系統中文件路徑。在服務器作為備機使用時,此路徑上的文件必須不存在。如需將備機提升為提供讀寫服務器,則建立此路徑文件即可。當備機檢測到文件存在后,立即退出備機恢復模式,提升為獨立主機模式,提供完整讀寫服務。
在備機上執行pg_ctl premote -D ‘備機數據目錄路徑。效果及原理與a相同,即命令備機停止備機恢復模式,提升為獨立主機模式[1]。
在某些特定應用場景下本方案仍具有一定的可優化。例如使用PostgreSQL9.4版本后提供的復制槽(Replication Slots)技術提供的自動WAL檢測技術,替換wal_keep_segments參數功能。避免未同步的WAL段被主機替換刪除?;蛟O置tcp_keepalive參數,避免長時間的網絡延時導致前臺客戶端事務提交的等待時間過長[7]。例如PostgreSQL10版本提供的邏輯復制技術,只同步應用需要的特定表,完成更復雜的集群應用等等[8]。
至此使用PostgreSQL流復制功能實現雙機熱備服務器搭建完成。
參考文獻:
[1] 唐成.PostgreSQL修煉之道[M].機械工業出版社,2015.
[2] The PostgreSQL Global Development Group. Documentation[EB/OL].(2016-09-29). https://www.postgresql.org/docs/.
[3] 周正中.PostgreSQL同步流復制原理和代碼淺析[EB/OL].(2016-06-16).https://yq.aliyun.com/articles/55676.
[4] [美] 杰亞德萬·梅馬拉(Jayadevan Maymala).數據架構師的PostgreSQL修煉:高效設計、開發與維護數據庫應用[M].機械工業出版社,2016.
[5] [美]Regina Obe,Leo Hsu.PostgreSQL即學即用[M].人民郵電出版社,2016.
[6] [英]Simon Riggs,Gianni Ciolli,Gabriele Bartolini.PostgreSQL Administration Cookbook[M]. Packt Publishing,2017.
[7] [英]Gregory Smith,Ibrar Ahmed.PostgreSQL 9.6 High Performance[M].Packt Publishing,2017.
[8] 周正中.PostgreSQL 10.0 邏輯復制原理與最佳實踐[EB/OL].(2017-02-28).https://yq.aliyun.com/ articles/71128.
總結
以上是生活随笔為你收集整理的pitr 原理_PostgreSQL热备原理研究及流复制运用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信5.0安卓版下载安装(微信5.0安卓
- 下一篇: vue 移动到图片浮动_基于Vue实现图