使用PG_STAT_REPLICATION監(jiān)視復(fù)制

作者:漢斯·尤爾根·舍爾希(Hans-JürgenSch?nig),從上世紀(jì)90年代開始使用PostgreSQL,他是CYBERTEC公司的CEO與技術(shù)帶頭人,CYBERTEC是該領(lǐng)域的市場(chǎng)領(lǐng)導(dǎo)者之一,自2000年以來已為全球無數(shù)客戶提供服務(wù)。他著有圖書《Mastering PostgreSQL 9.6: A comprehensive guide for PostgreSQL 9.6 developers and administrators》和《Mastering PostgreSQL 11,Second Edition》,這兩本英文圖書均已經(jīng)由武漢大學(xué)彭煜瑋老師翻譯完成并均已出版,中文書名分別為《由淺入深PostgreSQL》、《精通PostgreSQL 11第二版》


譯者:類延良,任職于瀚高基礎(chǔ)軟件股份有限公司,PostgreSQL數(shù)據(jù)庫(kù)技術(shù)愛好者,10g &11g OCM,OGG認(rèn)證專家。


PostgreSQL復(fù)制(同步和異步復(fù)制)是數(shù)據(jù)庫(kù)社區(qū)中最普遍的功能之一。

如今,人們正在構(gòu)建高可用集群或使用復(fù)制來創(chuàng)建只讀副本以分散工作負(fù)載。

這里要注意的重要一點(diǎn)是,如果使用復(fù)制,則必須確保正確監(jiān)視集群。


本文的目的是解釋一些基礎(chǔ)知識(shí),以確保PostgreSQL集群保持健康。


pg_stat_replication:檢查當(dāng)前狀態(tài)

監(jiān)視復(fù)制的最佳方法是使用pg_stat_replication系統(tǒng)視圖,它包含許多重要信息,見下:

test=# \d pg_stat_replication

View "pg_catalog.pg_stat_replication"

Column ??????????| Type ???????????????????| Collation | Nullable | Default

-----------------+-------------------------+-----------+----------+---------

pid ?????????????| integer ????????????????| ??????????| ?????????|

usesysid ????????| oid ????????????????????| ??????????| ?????????|

usename ?????????| name ???????????????????| ??????????| ?????????|

application_name | text ???????????????????| ??????????| ?????????|

client_addr ?????| inet ???????????????????| ??????????| ?????????|

client_hostname ?| text ???????????????????| ??????????| ?????????|

client_port ?????| integer ????????????????| ??????????| ?????????|

backend_start ???| timestamp with time zone| ??????????| ?????????|

backend_xmin ????| xid ????????????????????| ??????????| ?????????|

state ???????????| text ???????????????????| ??????????| ?????????|

sent_lsn ????????| pg_lsn ?????????????????| ??????????| ?????????|

write_lsn ???????| pg_lsn ?????????????????| ??????????| ?????????|

flush_lsn ???????| pg_lsn ?????????????????| ??????????| ?????????|

replay_lsn ??????| pg_lsn ?????????????????| ??????????| ?????????|

write_lag ???????| interval ???????????????| ??????????| ?????????|

flush_lag ???????| interval ???????????????| ??????????| ?????????|

replay_lag ??????| interval ???????????????| ??????????| ?????????|

sync_priority ???| integer ????????????????| ??????????| ?????????|

sync_state ??????| text ???????????????????| ??????????| ?????????|

reply_time ??????| timestamp with time zone| ??????????| ?????????|

多年來,此視圖中的列數(shù)已大大增加,但是,讓我們首先討論一些基礎(chǔ)知識(shí)。


pg_stat_replication:WAL Sender信息

人們經(jīng)常說?pg_stat_replication視圖是primary端的,這是不對(duì)的。該視圖的作用是揭示有關(guān)wal sender進(jìn)程的信息。換句話說:如果你正在運(yùn)行級(jí)聯(lián)復(fù)制,該視圖意味著在secondary復(fù)制到其他slaves的時(shí)候,?secondary端的?pg_stat_replication上的也會(huì)顯示entries(條目),以下圖來說明該場(chǎng)景:

對(duì)于每個(gè)WAL?Sender進(jìn)程,你將精確獲得一個(gè)entry(條目),重要的是每個(gè)server只能看到復(fù)制鏈中的下一個(gè)server--一個(gè)sending?server?永遠(yuǎn)不會(huì)通過一個(gè)slave看到,換句話說:在級(jí)聯(lián)復(fù)制中,你不得不詢問每個(gè)sending?server以獲得復(fù)制的概況。


但是還有更多:人們通常必須確定slave是否最新。這里有很多相關(guān)的事情:

sent_lsn:已經(jīng)通過網(wǎng)絡(luò)發(fā)送了多少WAL?

write_lsn:已向操作系統(tǒng)發(fā)送了多少WAL?(尚未flushing)

flush_lsn:已經(jīng)有多少WAL已flush到磁盤?

replay_lsn:已重放了多少WAL,因此對(duì)查詢可見?


下圖說明了這些字段:


這里要注意的重要一點(diǎn)是PostgreSQL提供了一種特殊的數(shù)據(jù)類型來表示該數(shù)據(jù):pg_lsn

可以輕松地找出當(dāng)前WAL的位置,下面說明了如何工作:

test=# SELECT pg_current_wal_lsn();

pg_current_wal_lsn

--------------------

3/DA06D240

(1 row)


這里值得注意的是,可以進(jìn)行計(jì)算:

test=# SELECT pg_current_wal_lsn() - '3/B549A845'::pg_lsn;

?column?

-----------

616376827

(1 row)


PostgreSQL提供了各種運(yùn)算符來進(jìn)行此類計(jì)算。換句話說:很容易弄清楚備庫(kù)落后了多遠(yuǎn)


flush_lsn與replay_lsn

人們一直在問我們flush_lsn和replay_lsn之間可能有什么區(qū)別。好吧,讓我們深入研究一下:當(dāng)WAL從primary流向slave時(shí),它首先通過網(wǎng)絡(luò)發(fā)送,然后發(fā)送到操作系統(tǒng),最后將事務(wù)刷新到磁盤以確保持久性(即崩潰安全性)。flush_lsn顯然表示刷新到磁盤的最后一個(gè)WAL位置?,F(xiàn)在的問題是:數(shù)據(jù)刷新后是否立即可見?答案是:不,如我們的較早的博客文章中所述,可能存在復(fù)制沖突。如果發(fā)生復(fù)制沖突,則WAL將會(huì)被持久化在slave上,但是只有當(dāng)沖突被解決之后,WAL才會(huì)replay。換句話說,可能存在如下情況:data被存儲(chǔ)在slave上,但是沒有被replay并被最終用戶訪問。

注意這一點(diǎn)很重要,因?yàn)閺?fù)制沖突比您想象的要經(jīng)常發(fā)生。如果您看到以下消息,則說明您遇到了復(fù)制沖突:

ERROR: canceling statement due to conflict with recovery

DETAIL: User query might have needed to see row versions that must be removed.


Replication lags

有時(shí)有必要確定復(fù)制延遲的數(shù)量(以秒為單位),到目前為止,我們已經(jīng)看到了兩個(gè)服務(wù)器之間的距離(以字節(jié)為單位)。如果要測(cè)量lag,可以查看pg_stat_replication系統(tǒng)視圖的相關(guān)_lag列(譯者注:write_lag、flush_lag、replay_lag),這些列的數(shù)據(jù)類型為“interval”,因此您可以看到延遲的秒數(shù)或分鐘數(shù),如果復(fù)制工作正常,則延遲通常會(huì)非常小(毫秒)。但是,您可能要監(jiān)視它。


提醒您:如果您正在運(yùn)行諸如VACUUM之類的大規(guī)模導(dǎo)入或其他昂貴的操作,則容易發(fā)生磁盤吞吐量可能會(huì)高于網(wǎng)絡(luò)帶寬。在這種情況下,slave可能會(huì)落后。您必須忍受這一點(diǎn),并確保警報(bào)不會(huì)過早開始。


pgwatch2: Ready made tooling

要監(jiān)視復(fù)制,您可以依靠我剛剛顯示的手動(dòng)魔術(shù)(manual magic)。但是,那里也有很多現(xiàn)成的工具可以簡(jiǎn)化此任務(wù)。我們可以推薦pgwatch2,它可以作為容器免費(fèi)下載。


如果您想查看演示pgwatch如何工作的演示,請(qǐng)考慮查看我們的pawatch2網(wǎng)站(https://www.cybertec-postgresql.com/en/products/pgwatch/


Finally …

如果您想全面了解PostgreSQL,建議您閱讀其他一些文章。如果您對(duì)存儲(chǔ)感興趣,則可能需要閱讀我們有關(guān)zheap的帖子之一

https://www.cybertec-postgresql.com/en/zheap-reinvented-postgresql-storage/


原文鏈接:

https://www.cybertec-postgresql.com/en/monitoring-replication-pg_stat_replication/


了解更多PostgreSQL熱點(diǎn)資訊、新聞動(dòng)態(tài)、精彩活動(dòng),請(qǐng)?jiān)L問中國(guó)PostgreSQL官方網(wǎng)站:www.postgresqlchina.com


解決更多PostgreSQL相關(guān)知識(shí)、技術(shù)、工作問題,請(qǐng)?jiān)L問中國(guó)PostgreSQL官方問答社區(qū):www.pgfans.cn


下載更多PostgreSQL相關(guān)資料、工具、插件問題,請(qǐng)?jiān)L問中國(guó)PostgreSQL官方下載網(wǎng)站:www.postgreshub.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容