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

oxalkeyp  于 2023-01-25  发布在  Docker
关注(0)|答案(2)|浏览(157)

首先,我使用此设置postgres-docker-cluster,在故障切换期间一切正常,我停止了主服务器,slave1将取代它的位置,但如果我重新打开主服务器,我不确定如何再次提升为主服务器,我将非常感谢任何关于正确方向的指示,我需要手动提升它吗?抱歉,我对这个概念还很陌生(ha).该码头使用repmgrpgpool2postgres 9.5
Docker 的一些信息

e4yzc0pl

e4yzc0pl1#

所以我想办法解决这个问题
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
帕格普尔
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将在几秒钟后升级,
1.添加新的从属容器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 \中,您可以使用来自旧主机的ID,或者使用您已经在pgpool BACKENDS='0:pgmaster:5432:1:/var/lib/postgresql/data:ALLOW_TO_FAILOVER,1:pgslave1::::' \上添加的主服务器,否则如果新的主服务器出现故障,repmgr将无法恢复它。
这是一个小手册,但它做了我需要的,那就是给新主人增加一个新的奴隶。

eit6fx6z

eit6fx6z2#

Master失败时,PostgreSQL集群会从备用节点中选择另一个主节点(基于集群中的节点权重)。因此,当前主节点最终恢复活动时,集群仍然忠于其当前主节点,但前主节点会在集群中重新启动,但这次是作为standby。所有这些都完全由PostgreSQL而不是Pgpool管理。
因此,如果new master(ex-standby)发生故障(或扩展到0),集群将故障转移到ex-master,并再次将其选为领导者,当standby再次扩展时,它将作为standby加入,一切恢复正常。这正是PostgreSQL集群将做的事情。
但最有可能的是Pgpool服务会在那一刻失败,因为每当节点失败时,Pgpool都会将该节点状态标记为DOWN,即使该节点恢复活动,它也不会通知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(现在的master)服务时,整个解决方案(PostgreSQL - Pgpool)将故障转移到实际的master,现在您可以再次启动standby并将其重新连接到pgpool。
P.S.停机时间只是pgpool的故障转移停机时间,pgpool服务将保持其原始配置,不添加任何内容,不重新启动任何内容(除了希望失败的PostgresQL节点:D)。

相关问题