
# 逻辑订阅故障转移（Failover Slot）
#### 使用场景
RDS for PostgreSQL的逻辑订阅故障转移（Failover Slot）功能用来将那些指定为failover slot的逻辑复制槽信息从主实例同步到备实例，当主备切换之后逻辑订阅能够继续进行，实现逻辑复制槽的故障转移。
当用户使用逻辑复制时，由于slot信息不会随着主备切换转移到新的主实例上，一旦实例发生主备切换，逻辑订阅就会断开，此时除非手动重新创建slot，否则逻辑订阅无法重新连接。RDS for PostgreSQL的Failover Slot功能可以将所有的logical slot从主实例同步到备实例，避免主备切换后逻辑订阅断开。
#### 注意事项
- 该功能支持以下版本：
  - 对于RDS for PostgreSQL 12：支持12.6及以上的小版本。
  
  - 对于RDS for PostgreSQL 13\~16：支持13\~16的所有小版本。
   
- 当前只支持logical slot的故障转移，physical slot暂不支持。
- 该功能由于引入新的日志类型，因此一旦使用了该功能，通过备份文件恢复到新实例时，会保留旧的slot信息，恢复到新实例后需要手动删除slot信息。
 
#### 使用方法
在发布端执行如下SQL，创建一个Failover Slot：
表1命令及参数说明 
| 版本                          | 命令                                                                                                                     | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|
| PostgreSQL12和PostgreSQL13版本 | **SELECT \* FROM pg_create_logical_replication_slot(** *'* *slotname* *'* , *'* *pgoutput* *'* **, false, true);**     | - slotname表示logical slot的名称。  - pgoutput表示plugin的名称，也可以更改为其他支持的插件。  - 第三个参数（例如false），表示该slot是否为临时slot。  - 第四个参数（例如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。   |
   
因此，如果要创建一个Failover Slot，在第三个参数临时slot字段必须为false，最后一个参数必须为true。如果最后一个参数省略不写，则创建的是非Failover Slot。
#### 查看方法
在发布端执行如下SQL，查询当前数据库的复制槽信息。
**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;**
  
- 主备切换 发布端继续插入数据，在订阅端查看，逻辑订阅不会断开。
  
 
