如何在docker上通过postgresql进行故障转移后升级master

首先,我使用这个安装postgres-docker-cluster ,在故障切换期间一切正常,我停止了master和slave1代替它,但是如果我把主控回到im不知道如何提升再次掌握,我会赞赏任何指针正确的方向,我需要手动推动它? 对不起,我很新这个概念(公顷)。 这个docker使用repmgrpgpool2postgre 9.5

docker上的一些信息

  • 的PostgreSQL簇-pgsql的
  • 的PostgreSQL-簇pgpool
  • 泊坞窗,compose.yml

所以我想办法解决这个问题,

  1. 手动创build容器

    docker run \ -e INITIAL_NODE_TYPE='master' \ -e NODE_ID=1 \ -e NODE_NAME='node1' \ -e CLUSTER_NODE_NETWORK_NAME='pgmaster' \ -e POSTGRES_PASSWORD='monkey_pass' \ -e POSTGRES_USER='monkey_user' \ -e POSTGRES_DB='monkey_db' \ -e CLUSTER_NODE_REGISTER_DELAY=5 \ -e REPLICATION_DAEMON_START_DELAY=120 \ -e CLUSTER_NAME='pg_cluster' \ -e REPLICATION_DB='replication_db' \ -e REPLICATION_USER='replication_user' \ -e REPLICATION_PASSWORD='replication_pass' \ -v cluster-archives:/var/cluster_archive \ -p 5432:5432 \ --net mynet \ --net-alias pgmaster \ --name pgmastertest \ paunin/postgresql-cluster-pgsql

    从站docker run \ -e INITIAL_NODE_TYPE='standby' \ -e NODE_ID=2 \ -e NODE_NAME='node2' \ -e REPLICATION_PRIMARY_HOST='pgmaster' \ -e CLUSTER_NODE_NETWORK_NAME='pgslave1' \ -e REPLICATION_UPSTREAM_NODE_ID=1 \ -v cluster-archives:/var/cluster_archive \ -p 5441:5432 \ --net mynet \ --net-alias pgslave1 \ --name pgslavetest \ paunin/postgresql-cluster-pgsql

    Pgpool
    docker run \ -e PCP_USER='pcp_user' \ -e PCP_PASSWORD='pcp_pass' \ -e PGPOOL_START_DELAY=120 \ -e REPLICATION_USER='replication_user' \ -e REPLICATION_PASSWORD='replication_pass' \ -e SEARCH_PRIMARY_NODE_TIMEOUT=5 \ -e DB_USERS='monkey_user:monkey_pass' \ -e BACKENDS='0:pgmaster:5432:1:/var/lib/postgresql/data:ALLOW_TO_FAILOVER,1:pgslave1::::' \ -p 5430:5432 \ -p 9898:9898 \ --net mynet \ --net-alias pgpool \ --name pgpooltest \ paunin/postgresql-cluster-pgpool

在线上BACKENDS='0:pgmaster:5432:1:/var/lib/postgresql/data:ALLOW_TO_FAILOVER,1:pgslave1::::' \你可以添加更多的奴隶到pgppool

  1. 停止大师pgmaster ,奴隶pgslave1会在几秒钟后被提升,
  2. 添加新的从站容器docker run \ -e INITIAL_NODE_TYPE='standby' \ -e NODE_ID=3 \ -e NODE_NAME='node1' \ -e REPLICATION_PRIMARY_HOST='pgslave1' \ -e CLUSTER_NODE_NETWORK_NAME='pgmaster' \ -e REPLICATION_UPSTREAM_NODE_ID=2 \ -v cluster-archives:/var/cluster_archive \ -p 5432:5432 \ --net mynet \ --net-alias pgmaster \ --name pgmastertest3 \ paunin/postgresql-cluster-pgsql

在下面的行-e REPLICATION_PRIMARY_HOST='pgslave1' \确保你指向新的主(pgslave1)的别名。 -e REPLICATION_UPSTREAM_NODE_ID=2 \确保您指向新的主节点id(2)。 -e NODE_ID=3 \确保这个ID不存在于表repl_nodes上--net-alias pgmaster \可以使用旧的master,或者使用已经在pgpool上添加的一个BACKENDS='0:pgmaster:5432:1:/var/lib/postgresql/data:ALLOW_TO_FAILOVER,1:pgslave1::::' \否则,如果新主人失败repmgr将无法恢复它。

它是一个小小的手册,但它做我需要的,这就是为新的主人添加一个新的奴隶。

Master发生故障时,PostgreSQL集群会根据节点的权重从节点中选出另一个主节点。 因此,当前主控终于恢复正常时,群集仍然忠于当前的主控,但前主控在集群中启动,但是这次是作为备用主控。 所有这些完全由PostgreSQLpipe理,而不是Pgpoolpipe理。

所以你会期望的是,如果新的主 (前备份)失败(或缩放到0),那么集群将故障转移到前主并再次选举它作为领导者,当待机时再次放大会作为待命join,事情恢复正常。 而这正是 PostgreSQL集群所要做的。

但是大多数情况下,Pgpool服务可能会在这个时候失败,因为每当一个节点出现Pgpool签名时,节点状态为DOWN ,即使该节点恢复生效,它也不会通知pgpool,并且您的stream量不会到达该节点。

所以如果你使用PCP命令检查恢复的节点状态 – 恢复后 – 在pgpool容器上:

 pcp_node_info -U pcp_user -h localhost -n 1 # master node id pgmaster 5432 down 1 

所以你必须做的是重新附加一次倒下的节点返回到Pgpool手动使用:

 pcp_attach_node -U pcp_user -h localhost -n 1 # master node id --- executed successfully --- pcp_node_info -U pcp_user -h localhost -n 1 # master node id pgmaster 5432 up 1 

此时,pgpool再次识别前主节点,并可以将stream量引导至该节点。

之后,每当你删除(缩放到0) 前备 (现在是主)服务的整个解决scheme(PostgreSQL的Pgpool)将故障转移到实际的主,现在你可以再次把备用,并重新连接到pgpool。

PS停机时间只是pgpool的故障转移停机时间,而pgpool服务将保持其原始configuration,没有任何操作重新启动(除了希望失败的Postgresql节点:D)。