对于单个primary节点故障切换后产生的两个主节点的情况,我们很容易就能判断哪个节点是最新的数据,因为原主节点宕机后就不会对外提供服务了(原primary库是停止状态)。但对于整个集群故障,比如网络故障,中间有可能出现多个primary对外提供服务的情况,我们就很难判断哪个节点是最新的数据。如果一旦出现此种现象,则需要人工介入,确认主节点,将集群恢复至正常状态。
对于两个或以上的 primary,在选择 primary 节点时,有两个选择:
1.选择最新提升的primary作为主节点。以3节点的集群为例,如以下, node101就是最新提升的主节点(看Timeline)。而如果是两节点的,则可以通过sys_controldata看哪个节点的timeline值更大,就是最新提升的主节点。
2.以原有的 primary 作为主节点,如上图的node102。
对于以上两种策略,其结果都有可能导致数据丢失。我们必须要确定的是哪个节点的数据是最新的数据,或者说哪个节点丢失的数据更少(两个primary可能都对外提供了服务)。具体过程如下:
1.备份所有显示为primary role 节点的data目录。
2.连接到数据库中人为判断哪个节点的实际业务数据最新。
3.通过select sys_current_wal_lsn();注意:切换时间线时执行checkpoint会导致较高时间线的数据库LSN 大,但是数据并不一定最新。
如果最终选择以最新提升(最高的TimeLine)的primary作为主节点,则其它节点只需参照Node Rejoin—节,将原primaryrole节点重新集群即可。如果选择以原有primary作为主节点,则需要参照 Standby clone 一节,将其它节点加入。