參考: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操作停滯,造成主庫被頻繁更新的表大小暴增。