如何在使用docker的postgresql上进行故障转移后提升master

时间:2016-06-08 19:06:04

标签: database postgresql docker docker-compose high-availability

首先,我使用此设置postgres-docker-cluster,在故障转移期间一切正常,我停止主设备和slave1取代它,但如果我重新打开主设备我不确定如何再次提升到掌握,我会欣赏正确方向的任何指针,我是否需要手动推广它?对不起,我对这个概念很新(ha)。 此泊坞窗使用 repmgr pgpool2 postgre 9.5

码头工人的一些信息

2 个答案:

答案 0 :(得分:1)

所以我想出如何解决问题,

  1. 手动创建容器

    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

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

      它是一个小手册,但它可以满足我的需要,那就是为新主人添加新的奴隶。

答案 1 :(得分:0)

Master 失败时,PostgreSQL集群会从stanby节点中选择另一个master(基于集群中的节点权重)。因此,当前主人终于恢复生机时,群集仍然忠于它的当前主人,但是前主人员在群集中重新启动,但这次是作为待机。所有这些都完全由PostgreSQL管理,而不是Pgpool。

所以您期望的是,如果新主服务器(前备用服务器)失败(或扩展为0),则群集将故障转移到前主服务器并再次选举它作为领导者,当备用数据库再次按比例放大时,它将作为备用数据库加入并恢复正常。那就是完全 PostgreSQL集群会做什么。

但很可能Pgpool服务会在那一刻失败,因为每当一个节点失败时,Pgpool会将节点状态标记为 DOWN ,即使该节点恢复生效,也不会< / strong>通知pgpool,您的流量无法到达该节点。

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

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

所以你需要做的是re-attach使用以下方法手动将曾经倒下的节点回到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再次识别前主节点,并可以将流量引导到它。

之后每当您删除(扩展为0) ex-standby (现在为主)服务时,整个解决方案(PostgreSQL - Pgpool)都会故障转移到实际的主服务器,现在您可以启动备用服务器再次将它重新附加到pgpool。

P.S。停机时间只是pgpool的故障转移停机时间,而pgpool服务将保持其原始配置,没有任何重新添加任何内容(除了希望失败的PostgresQL节点:D)。