postgresql之replication slot

參考:http://mysql.taobao.org/monthly/2015/02/03/

replication slot是什麼?

replication slots 是從 postgresql 9.4 引入的,主要是提供了一種自動化的方法來確保主控機在所有的後備機收到 WAL 段之前不會移除它們,並且主控機也不會移除可能導致恢復衝突的行,即使後備機斷開也是如此。

爲了防止 WAL 被刪,SLOT restart_lsn 之後的WAL文件都不會刪除。(wal_keep_segments 則是一個人爲設定的邊界,slot 是自動設定的邊界(無上限),所以使用 slot 並且下游斷開後,可能導致數據庫的 WAL 堆積爆滿)。

用法

複製槽分爲物理複製槽physical replication slot和邏輯複製槽logic replication slot。

物理複製槽

物理複製槽一般結合流複製一起使用,能夠很好的保證備庫需要的日誌不會在主庫刪除。

1、在主庫創建physical replication slot:

SELECT * FROM pg_create_physical_replication_slot('my_rep_slot_1');

2、主庫查詢所有slot,此時replication slot還不處於active狀態。active=f

postgres=# SELECT * FROM pg_replication_slots ;
   slot_name   | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn 
---------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
 my_rep_slot_1 |        | physical  |        |          | f         | f      |            |      |              |             | 

3、在從庫配置recovery.conf,增加primary_slot_name ='my_rep_slot_1' ,然後重啓從庫:

#cat recovery.conf 
standby_mode='on' 
primary_conninfo='user=replicator password=MmoAikLc10Ssznt host=xxx.xx.xx.xx port=3002 sslmode=prefer sslcompression=1 krbsrvname=postgres application_name=standby1'
primary_slot_name ='my_rep_slot_1'

4、觀察主庫replication slot的狀態變化:active變爲t,restart_lsn開始有數據。

postgres=# SELECT * FROM pg_replication_slots ;
   slot_name   | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn 
---------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
 my_rep_slot_1 |        | physical  |        |          | f         | t      |      29845 |      |              | 1/2000240   | 

怎麼刪除slot?

SELECT pg_drop_replication_slot('my_rep_slot_1');

如果報錯:

ERROR: replication slot "my_rep_slot_1" is active for PID 679

活躍狀態的slot不能刪除,需要刪除recovery.conf文件中的primary_slot_name 設置後,重啓。再刪除。

邏輯複製槽

Logic replication slots一般被用於邏輯異步複製,一個很好的應用是用於異構數據庫之間的邏輯複製。

大致原理是將源端xlog進行解碼,解析成具體sql,然後到目標端進行回放。

支持邏輯解碼需要將wal_level設置成logic,logic會在replica的基礎上增加一些信息以支持邏輯編碼,該模式會增大wal日誌的數量,尤其是大量的updata、delete操作的庫。

創建logic slot與physical slot函數不同:

SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');

原理

Replication Slot實質上是內存中的一些數據結構,加上持久化保存到pg_replslot/目錄中的二進制狀態文件。

在PG啓動的時候,預先在共享內存中分配好這些數據結構所用內存(即一個大小爲max_replication_slots的數組)。這些數據結構在用戶創建replication slot時開始被使用。一個Replication Slot被創建並使用後,其數據結構和狀態文件會被wal(write-ahed-log)的發送者(wal sender)進程更新。

replication slot有重新創建新的與從庫的連接嗎?
沒有。Replication Slot還是使用了wal_sender原有連接(由於一個從庫一個wal_sender連接,所以一個從庫和主庫之間也只有一個active的Replication Slot)。

注意事項:

1)如果收不到從庫的reply,Replication Slot的狀態restart lsn會保持不變,造成主庫會一直保留本地日誌,可能導致日誌磁盤滿。所以應該實時監控日誌磁盤使用情況,並設置較小的wal_sender_timeout,及早發現從庫斷掉的情況。

2)將hot_standby_feedback設爲on時,注意如果從庫長時間有慢查詢發生,可能導致發回到主庫的xmin變化較慢,主庫的vaccum操作停滯,造成主庫被頻繁更新的表大小暴增。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章