簡體   English   中英

如何讓 pcp 自動將節點附加到 postgres pgpool?

[英]How do I get pcp to automatically attach nodes to postgres pgpool?

我在 centos 6.8 上使用 postgres 9.4.9,pgpool 3.5.4。

我很難讓 pgpool 自動檢測節點何時啟動(它通常檢測到第一個節點但很少檢測到輔助節點)但是如果我使用 pcp_attach_node 告訴它哪些節點已啟動,那么一切都很好。

所以我想在我能正確解決問題之前,我會寫一個小腳本來檢查節點的狀態並適當地附加它們,但是我在密碼提示方面遇到了問題。 根據文檔,我應該能夠發出類似的命令

pcp_attach_node 10 localhost 9898 pgpool mypass 1

但這只是抱怨

pcp_attach_node:警告:忽略了額外的命令行參數“localhost” pcp_attach_node:警告:忽略了額外的命令行參數“9898” pcp_attach_node:警告:忽略了額外的命令行參數“pgpool” pcp_attach_node:警告:額外的命令行參數“mypass” “忽略了 pcp_attach_node:警告:忽略了額外的命令行參數“1”

它只會在我使用像這樣的參數時起作用

pcp_attach_node -U pgpool -h localhost -p 9898 -n 1 

而且密碼沒有參數,我必須在提示時手動輸入。

除了使用 Expect 之外,還有其他對此進行排序的建議嗎?

您必須創建PCPPASSFILE 搜索pgpool 文檔以獲取更多信息。

范例1:

為登錄的用戶創建PCPPASSFILE( vi ~/.pcppass ),文件內容為127.0.0.1:9897:user:pass(主機名:端口:用戶名:密碼),設置文件權限0600( chmod 0600 ~/.pcppass

命令應在不要求輸入密碼的情況下運行

pcp_attach_node -h 127.0.0.1 -U user -p 9897 -w -n 1

范例2:

創建PCPPASSFILE( vi /usr/local/etc/.pcppass ),文件內容為127.0.0.1:9897:user:pass(主機名:端口:用戶名:密碼),設置文件權限0600( chmod 0600 /usr/local/etc/.pcppass ),設置變量PCPPASSFILE( export PCPPASSFILE=/usr/local/etc/.pcppass

命令應在不要求輸入密碼的情況下運行

pcp_attach_node -h 127.0.0.1 -U user -p 9897 -w -n 1

自動附加節點的腳本

您可以使用例如crontab安排此腳本。

#!/bin/bash
#pgpool status
#0 - This state is only used during the initialization. PCP will never display it.
#1 - Node is up. No connections yet.
#2 - Node is up. Connections are pooled.
#3 - Node is down.

source $HOME/.bash_profile
export PCPPASSFILE=/appl/scripts/.pcppass
STATUS_0=$(/usr/local/bin/pcp_node_info -h 127.0.0.1 -U postgres -p 9897 -n 0 -w | cut -d " " -f 3)
echo $(date +%Y.%m.%d-%H:%M:%S.%3N)" [INFO] NODE 0 status "$STATUS_0;

if (( $STATUS_0 == 3 ))
then
    echo $(date +%Y.%m.%d-%H:%M:%S.%3N)" [WARN] NODE 0 is down - attaching node"
    TMP=$(/usr/local/bin/pcp_attach_node -h 127.0.0.1 -U postgres -p 9897 -n 0 -w -v)
    echo $(date +%Y.%m.%d-%H:%M:%S.%3N)" [INFO] "$TMP 
fi


STATUS_1=$(/usr/local/bin/pcp_node_info -h 127.0.0.1 -U postgres -p 9897 -n 1 -w | cut -d " " -f 3)
echo $(date +%Y.%m.%d-%H:%M:%S.%3N)" [INFO] NODE 1 status "$STATUS_1;

if (( $STATUS_1 == 3 ))
then
    echo $(date +%Y.%m.%d-%H:%M:%S.%3N)" [WARN] NODE 1 is down - attaching node"
    TMP=$(/usr/local/bin/pcp_attach_node -h 127.0.0.1 -U postgres -p 9897 -n 1 -w -v)
    echo $(date +%Y.%m.%d-%H:%M:%S.%3N)" [INFO] "$TMP 
fi

exit 0

是的,您可以使用自定義的failover_command(/etc/pgpool 中的failover.sh)觸發此命令的執行

自動啟動你的 pgpool down 節點的方法:

  1. 將此腳本復制到一個文件中,該文件具有對所有節點的 postgres 所有權的所需位置的執行權限。
  2. 在 postgres 用戶下運行crontab -e comamnd
  3. 最后將該腳本設置為在 crontab 中每分鍾運行一次。 但是要每秒執行一次,您可以創建自己的服務並運行它。
#!/bin/bash
# This script will up all pgpool down node

#************************
#******NODE STATUS*******
#************************

# 0 - This state is only used during the initialization.
# 1 - Node is up. No connection yet.
# 2 - Node is up and connection is pooled.
# 3 - Node is down

#************************
#******SCRIPT*******
#************************
server_node_list=(0 1 2)    
for server_node in ${server_node_list[@]}
do
    source $HOME/.bash_profile
    export PCPPASSFILE=/var/lib/pgsql/.pcppass
    node_status=$(pcp_node_info -p 9898 -h localhost -U pgpool  -n $server_node -w | cut -d ' ' -f 3);

    if [[ $node_status == 3 ]]
    then
            pcp_attach_node -n $server_node -U pgpool -p 9898 -w -v
    fi

done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM