3

首先我使用這個設置postgres-docker-cluster,在故障切換期間一切正常,我停止主服務器和slave1服務器,但如果我打開高手回到即時通訊不知道如何提升爲高手,我會讚賞任何指針正確的方向,我需要手動推動它?對不起,我對這個概念很感興趣(哈)。 該碼頭使用repmgr,pgpool2postgre 9.5如何在docker上postgresql上故障轉移後提升主服務器

在泊塢窗

+0

我建議在master上使用'pg_rewind'成爲slave,然後創建觸發文件。但pgpool混淆:/ btw - 你是如何故障轉移的?.. –

+0

docker.yml文件它設置了一切,我根本沒有修改任何東西,停住了主站,你可以在日誌中看到'pgslave1_1 | [2016-06-08 15:33:29] [通知]這個節點是最好的候選人,成爲新的主人,促進... pgslave1_1 | [2016-06-08 15:33:29] [注意]在當前目錄下查找配置文件 pgslave1_1 | [2016-06-08 15:33:29] [注意]在/ etc中尋找配置文件 pgslave1_1 | [2016-06-08 15:33:29] [NOTICE]配置文件位於/ etc/repmgr.conf'和幾乎所有的repmgr進行故障轉移。我希望看看pg_rewind,謝謝! – PaulMB

回答

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

BACKENDS='0:pgmaster:5432:1:/var/lib/postgresql/data:ALLOW_TO_FAILOVER,1:pgslave1::::' \您可以添加行更奴隸pgppool

  • 停止主pgmaster,從屬pgslave1將幾秒之後得到提升,
  • 添加新的從容器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 \請確保該表不存在於表格repl_nodes--net-alias pgmaster \您可以使用舊版主版本中的版本,或者使用您已在pgpool BACKENDS='0:pgmaster:5432:1:/var/lib/postgresql/data:ALLOW_TO_FAILOVER,1:pgslave1::::' \上添加的版本,否則,如果新版主版本發生故障,repmgr將無法恢復。

    它是一個小小的手冊,但它做我需要的,這就是爲新的主人添加一個新的奴隸。

    0

    Master失敗時,PostgreSQL羣集將從stanby節點中選擇另一個master(基於羣集中的節點權重)。因此,當前主設備最終恢復使用時,羣集仍然忠於當前的主設備,但前主設備在羣集中啓動,但是這次是待機。所有這些都完全由PostgreSQL管理,而不是Pgpool。

    ,所以你可以預料到的是,如果新的主(前待機)失敗(或換算爲0),那麼集羣將故障轉移到前主並再次選擇它作爲一個領導者,當待機狀態再次放大時,它將作爲待機狀態加入,事情恢復正常。那就是,正好是 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)的前等待(現在掌握)服務的整體解決方案(PostgreSQL的 - Pgpool)將故障轉移到實際主,現在你可以領回待機可達並重新將它附加到pgpool。

    P.S.停機時間只是pgpool的故障轉移停機時間,pgpool服務將保持其原始配置,沒有任何操作會重新啓動(除了Postgresql節點失敗,希望是:D)。