How to Optimize PostgreSQL Logical Replication

How to Optimize PostgreSQL Logical Replication

邏輯復(fù)制(Logical Replication)或Pglogical是表級(jí)別的復(fù)制。兩者都是基于WAL的復(fù)制機(jī)制,允許在兩個(gè)實(shí)例之間復(fù)制指定表的WAL。這兩個(gè)看起來讓人迷惑,到底有什么區(qū)別呢?Logical Replication是PostgreSQL10.0引入的內(nèi)置新特性,而pglogical則是一個(gè)插件。PG10版本之前可以使用該插件進(jìn)行邏輯復(fù)制,通過持續(xù)發(fā)展,pglogical的所有特性都集成到了Logical Replication中。換句話說,pglogical插件變成了Logical Replication。Logical Replication最基本的優(yōu)勢在于不用安裝任何插件,安裝插件受限的環(huán)境中,可以推薦使用該邏輯復(fù)制。

本博客關(guān)注優(yōu)化Logical Replication。這意味著,優(yōu)化方法可以同時(shí)應(yīng)用于pglogical以及Logical Replication。

作為DBA,這種復(fù)制機(jī)制和其他基于觸發(fā)器的復(fù)制機(jī)制來說更加可靠,性能更改。邏輯復(fù)制的表,發(fā)生變化的數(shù)據(jù)通過WAL記錄可以實(shí)時(shí)復(fù)制,這樣更加高效并且也沒那么復(fù)雜。所有其他復(fù)制機(jī)制都是基于觸發(fā)器的,這可能會(huì)帶來性能和維護(hù)方面的調(diào)整,隨著邏輯復(fù)制的出現(xiàn),對基于觸發(fā)器復(fù)制的依賴幾乎消失了。

其他博客詳細(xì)描述了如何配置邏輯復(fù)制:https://severalnines.com/blog/overview-logical-replication-postgresql,本博客關(guān)注如何優(yōu)化。

優(yōu)化邏輯復(fù)制

首先,Logical Replication的行為和流復(fù)制非常像,唯一不同的是流復(fù)制對整個(gè)database進(jìn)行復(fù)制,而Logical Replication僅復(fù)制指定的表。使用邏輯復(fù)制時(shí),需要預(yù)見一些挑戰(zhàn)。

下面我們看下影響邏輯復(fù)制的因素。

影響邏輯復(fù)制性能的因素

優(yōu)化邏輯復(fù)制時(shí)保證無縫復(fù)制不會(huì)中斷非常重要,在搭建前需要注意幾個(gè)問題:

1)復(fù)制表中數(shù)據(jù)類型

2)復(fù)制表或者部分復(fù)制表上寫事務(wù)的頻繁性

3)基礎(chǔ)設(shè)施的容量

4)參數(shù)的配置必須最優(yōu)

以上因素對邏輯復(fù)制有較大影響,下面我們詳細(xì)說明。

邏輯復(fù)制數(shù)據(jù)類型

理解邏輯復(fù)制表的數(shù)據(jù)類型非常重要。如果表存儲(chǔ)的是large text或二進(jìn)制對象,并且又遇到大規(guī)模事務(wù),那么由于基礎(chǔ)設(shè)施資源的限制,復(fù)制就會(huì)被拖慢。基礎(chǔ)設(shè)施的容量必須滿足處理如此規(guī)模的數(shù)據(jù)。

復(fù)制表的活躍性

在復(fù)制非常活躍的表時(shí),可能由于IO性能問題、死鎖等導(dǎo)致復(fù)制落后于同步。這肯能使數(shù)據(jù)庫看起來不太健康。如果需要復(fù)制的表比較多并且數(shù)據(jù)需要復(fù)制到多個(gè)階段,那么可能需要很高的CPU使用率,并需要更過的CPU。

基礎(chǔ)設(shè)施的容量

當(dāng)使用邏輯復(fù)制時(shí),首先需要考慮基礎(chǔ)設(shè)置的容量。如果需要復(fù)制大量表,那么需要充足的CPU。

當(dāng)需要復(fù)制大量表時(shí),可以進(jìn)行分組并使用并行復(fù)制。此時(shí)也需要多個(gè)CPU用于并行復(fù)制。如果數(shù)據(jù)變化比較頻繁,也會(huì)影響復(fù)制的性能。

優(yōu)化配置參數(shù)

使用邏輯復(fù)制功能,需要調(diào)優(yōu)配置參數(shù):

wal_level=’logical’

max_wal_senders=10 ???????????# greater than number of subscribers (or replicas)

max_replication_slots=10 ????????# greater than number of subscribers (or replicas)

max_worker_processes=10 ???????# greater than number of subscribers (or replicas)

max_logical_replication_workers ???# greater than number of subscribers (or replicas)

max_sync_workers_per_subscription ?# depends on number of tables being replicated

max_wal_senders

max_wal_senders配置值需要大于備機(jī)個(gè)數(shù)。如果數(shù)據(jù)需要復(fù)制到多個(gè)節(jié)點(diǎn),那么max_wal_senders就開始起作用,因此這個(gè)參數(shù)調(diào)整到最優(yōu)很重要。

max_replication_slots

通常,數(shù)據(jù)的變化會(huì)寫入到WAL文件中,被稱為WAL記錄。WAL sender進(jìn)程會(huì)將這些WAL日志發(fā)送到備機(jī),備機(jī)的wal receiver進(jìn)程接收這些WAL,然后訂閱節(jié)點(diǎn)回放這些WAL。

Checkpoint后,可以將pg_xlog/pg_wal中不需要的wal文件刪除。如果這些WAL沒有在訂閱節(jié)點(diǎn)回放完時(shí),將這些主機(jī)上的文件刪除,那么復(fù)制就會(huì)中斷。提供復(fù)制槽,可以確保當(dāng)訂閱節(jié)點(diǎn)還需要時(shí),主機(jī)上的文件不被刪除。建議對于每個(gè)訂閱節(jié)點(diǎn)都配置一個(gè)復(fù)制槽。

max_worker_processes

配置最優(yōu)的worker進(jìn)程數(shù)也很重要。這依賴于服務(wù)最大能夠擁有多少進(jìn)程。在多CPU的環(huán)境中才會(huì)有效。max_worker_processes通過使用多個(gè)CPU核,促使進(jìn)程以更快的方式完成任務(wù)。當(dāng)使用邏輯復(fù)制時(shí),這個(gè)參數(shù)可以幫助worker進(jìn)程復(fù)制更快。還有一個(gè)max_logical_worker_processes參數(shù),指定使用多少worker進(jìn)程復(fù)制數(shù)據(jù)。

max_logical_worker_processes

這個(gè)參數(shù)指定最多需要多少logical worker進(jìn)程復(fù)制數(shù)據(jù)。max_logical_worker_processes的進(jìn)程隸屬于max_worker_processes,比max_worker_processes小。多CPU的環(huán)境,復(fù)制到多個(gè)訂閱節(jié)點(diǎn),這個(gè)參數(shù)才有意義。默認(rèn)值是4,最大值依賴于系統(tǒng)支持最多worker進(jìn)程數(shù)。

max_sync_workers_per_subscription

這個(gè)參數(shù)指定每個(gè)訂閱最多需要多少同步進(jìn)程。初始數(shù)據(jù)同步期間,同步進(jìn)程開始工作,使用整個(gè)從那時(shí)候可以確保同步更快。目前,一個(gè)表只能配置一個(gè)同步進(jìn)程,這意味著多個(gè)表可以并行同步。默認(rèn)值是2,這個(gè)值隸屬于max_logical_worker_processes。

其他參數(shù)包括:wal_receiver_timeout, wal_receiver_status_interval and wal_retrieve_retry_interval,當(dāng)然這幾個(gè)參數(shù)不會(huì)影響發(fā)布節(jié)點(diǎn)。

結(jié)論

在復(fù)雜的大規(guī)模數(shù)據(jù)庫系統(tǒng)中,復(fù)制指定表是常見的需求。邏輯復(fù)制可以用于業(yè)務(wù)報(bào)告和數(shù)據(jù)倉庫。作為一個(gè)DBA,我認(rèn)為由于邏輯復(fù)制部署簡單,非常適合這樣的場景。配置調(diào)優(yōu)邏輯復(fù)制,需要大量的計(jì)劃、架構(gòu)、測試。為了確保復(fù)制系統(tǒng)的有效性和可用性,使用邏輯復(fù)制時(shí)需要評估實(shí)時(shí)復(fù)制的數(shù)據(jù)量。綜上所述,PG10及其之后的版本可以使用邏輯復(fù)制,而之前的版本可以使用pglogical。

原文

https://severalnines.com/blog/how-optimize-postgresql-logical-replication

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

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

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