使用場景
RDS for PostgreSQL的(de)(de)邏(luo)輯訂閱故障轉移(Failover Slot)功能用來將那些指定(ding)為failover slot的(de)(de)邏(luo)輯復制槽(cao)信(xin)息從主實(shi)例(li)同步到備實(shi)例(li),當主備切換之后邏(luo)輯訂閱能夠繼續進行,實(shi)現邏(luo)輯復制槽(cao)的(de)(de)故障轉移。
當用(yong)戶使用(yong)邏(luo)輯復制時,由于(yu)slot信息不會隨著主備(bei)切換轉移到(dao)新(xin)的(de)主實(shi)(shi)(shi)例(li)上,一旦實(shi)(shi)(shi)例(li)發生主備(bei)切換,邏(luo)輯訂(ding)閱(yue)就會斷開(kai),此時除非手動重新(xin)創建slot,否則邏(luo)輯訂(ding)閱(yue)無法重新(xin)連接。RDS for PostgreSQL的(de)Failover Slot功(gong)能可以將(jiang)所有的(de)logical slot從主實(shi)(shi)(shi)例(li)同步到(dao)備(bei)實(shi)(shi)(shi)例(li),避免主備(bei)切換后邏(luo)輯訂(ding)閱(yue)斷開(kai)。
注意事項
- 該功能針對RDS for PostgreSQL 12.6及以上的小版本、RDS for PostgreSQL 13及以上版本的所有小版本。
- 當前只支持logical slot的故障轉移,physical slot暫不支持。
- 該功能由于引入新的日志類型,因此一旦使用了該功能,通過備份文件恢復到新實例時,會保留舊的slot信息,恢復到新實例后需要手動刪除slot信息。
使用方法
在發布端(duan)執行如(ru)下SQL,創建一個(ge)Failover Slot:
命令及參數說明
| 版本 | 命令 | 參數說明 |
|---|---|---|
| PostgreSQL12和PostgreSQL13版本 | SELECT * FROM pg_create_logical_replication_slot( 'slotname','pgoutput' , false, true); | slotname表示logical slot的名稱。 pgoutput表示plugin的名稱,也可以更改為其他支持的插件。 第三個參數(例如false),表示該slot是否為臨時slot。l第四個參數(例如true),表示該slot是否為Failover Slot。 |
| PostgreSQL14及以上版本 | SELECT * FROM pg_create_logical_replication_slot( 'slotname','pgoutput' , false, false, true); | slotname表示logical slot的名稱。 pgoutput表示plugin的名稱,也可以更改為其他支持的插件。 第三個參數(例如false),表示該slot是否為臨時slot。 第四個參數(例如true),表示是否啟動兩階段提交選項。 第五個參數(例如true),表示該復制槽是否為Failover slot。 |
因此(ci),如(ru)果要創建(jian)一(yi)個(ge)Failover Slot,在第三個(ge)參數臨時(shi)slot字段必(bi)須為false,最(zui)后一(yi)個(ge)參數必(bi)須為true。如(ru)果最(zui)后一(yi)個(ge)參數省略不寫,則(ze)創建(jian)的是(shi)非Failover Slot。
查看方法
在發布(bu)端執行如下SQL,查(cha)詢(xun)當前數據庫的復制槽信息。
select * from pg_get_replication_slots();
- 查看“failover”字段,如果值為“true”,表示該復制槽為Failover Slot。
- 如果沒有“failover”字段或該字段值為“false”,說明該復制槽不是Failover Slot。
邏輯訂閱完整使用示例
- 發布端創建表
create table tableName(id int primary key, num int);
- 發布端創建發布
create publication pubName for table tableName;
- 發布端創建一個Failover Slot(若為PostgreSQL12或13版本,則去掉第四個參數false)
SELECT * FROM pg_create_logical_replication_slot( 'slotname' **, ** 'pgoutput' , false, false, true);
- 發布端插入數據
insert into tableName values(1,1);
insert into tableName values(2,2);
- 訂閱端創建表
create table tableName (id int primary key, num int);
- 訂閱端創建訂閱,指定創建的Failover Slot名稱
create subscription subName connection 'host=192.168.0.10 dbname=postgres user=root port=5432 password= ‘xxxxxxx ' publication pubName with(copy_data=true,create_slot=false,slot_name= slotname);
- 訂閱端查詢數據,驗證數據是否訂閱到
select * from tableName;
- 主備切換
發布端繼續插入數據,在訂閱端查看,邏輯訂閱不會斷開。