debian8下配置postgresql9.5.二、pgpool3.5.二、heartbeat3.0.5的HA熱備

項目要求經過heartbeat控制pg和pgpool的主備過程,從而達到高可用,pg的本身的流複製主備方案參考我另一篇主備方案文章,pgpool這裏只用到鏈接池的功能。應用經過heartbeat虛擬出來的VIP訪問pgpool池。node

注:debian8下建議仍是直接apt-get install heartbeat,編譯各類依賴還會提示源碼錯誤,配置文件路徑如出一轍,不過那個啓動和關閉腳本得本身寫,可是偶爾會報錯openhpi相關的,老外說是BUG,但解決辦法以下:linux

vim /etc/systemd/system/openhpid.service
[Unit]
Description=Daemon providing access to the SAF Hardware Platform Interface
[Service]
Type=simple
ExecStart=/usr/sbin/openhpid -n -c /etc/openhpi/openhpi.conf
[Install]
WantedBy=multi-user.target

1、準備工做sql

一、兩臺debian8.4 xfs文件格式虛擬機,分別配置兩個IP,留着一個VIP後面用數據庫

二、按照另一篇PG流複製主備方案,配置好PG的主備配置vim

三、按照另一篇pgpool編譯安裝用於鏈接池的配置安裝pgpoolapi

四、參考我另一篇關於linux下郵箱配置的文章,配置好郵箱bash

2、配置heartbeat服務器

一、配置文件網絡

cd /etc/ha.d
vim authkeys
auth 11 crc
#2 sha1 HI!
#3 md5 Hello!
#---------------------heartbeat主配置文件----------------------
vim ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
#心跳間隔
keepalive 2
#死亡閥值
deadtime 30
#警告時間
warntime 10
#首次啓動heartbeat,等待多久才啓動主服務資源
initdead 30
#鏈接端口
udpport 694
#心跳線接口
#bcast   eth1
#主節點的網卡設備、備份機的心跳線接口IP
ucast eth0 192.168.180.223
#自動切換仍是關掉好
auto_failback off
node elink-master
node elink-slave
#ping 192.168.180.1
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
#----------------------VIP資源控制文件----------------------
vim haresources
elink-master IPaddr::192.168.180.221/32/eth0 elinkresource.sh
#---資源控制腳本,若是主機已經拿到資源,備機就算啓動heartbeat也不會啓動下面的腳本----
cd resource.d
vim elinkresource.sh
isPid()
{
        pid_result=`ps -ef | grep $1 | awk '{if($8!~/grep/) print $2}'`
        echo $1'的進程號: '$pid_result
        if [ -n "$pid_result" ];then
                return 1
        else
                return 0
        fi
}
start() {
        echo "***************************start PG HA******************************"
        isPid postmaster
        if [ $? -eq 0 ];then
                /etc/init.d/postgresql start
        else
                echo 'postgresql已經有進程,無需再次啓動'
        fi
        isPid pgpool.conf
        if [ $? -eq 0 ];then
                pgpool -f /usr/local/etc/pgpool.conf -F /usr/local/etc/pcp.conf -D
        else
                echo 'pgpool已經有進程,無需再次啓動'
        fi
        #pg_master_process_result=`ssh -l root 192.168.180.222 "ps -ef | grep postmaster | grep -v grep"`
        key_result=`su - postgres -c "pg_controldata | grep cluster | grep 'archive recovery'"`
        if [ -n "$key_result" ];then
                su - postgres -c "pg_ctl promote"
        else
                echo '此服務器不是備機沒法promote爲主機!!!'
        fi
        isPid sleep
        if [ $? -eq 0 ];then
                /opt/monitorpg.sh &
        else
                echo 'sleep監控進程已經存在無需再次啓動'
        fi
}

stop() {
        echo "****************************stop PG HA*****************************"
        #sleep_result=`ps -ef | grep 'sleep 30' | awk '{if($8!~/grep/) print $3}'`
        #kill -9 $sleep_result
        pgpool -f /usr/local/etc/pgpool.conf -F /usr/local/etc/pcp.conf -D -m fast stop
        /etc/init.d/postgresql stop
        mv /usr/local/pgsql/data/recovery.done /usr/local/pgsql/data/recovery.conf
}

case $1 in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                stop
                sleep 10
                start
        ;;
        *)
                echo "Usage: $0{start|stop|restart}"
esac

二、業務監控腳本ssh

heartbeat只能監控網絡層的,例如關機、中止heartbeat後能切換過去,但若是sql都查詢不了,那這個資源就是無效資源,固然須要切換

monitor(){
        result=`/usr/local/pgsql/bin/psql -h 192.168.180.222 -p5432 -U postgres -w -d postgres --command "select 1" | sed -n 3p | cut -c9-9`
        #echo $result
        if [ 1 -eq "$result" ];then
                echo `date`" 數據庫正常,檢測值:"$result >> /opt/moni.log
        else
                echo `date`" 數據庫掛了,檢測值:"$result >> /opt/moni.log
                service heartbeat stop
                break
        fi
}
while sleep 10
do
        monitor
done

報錯:
業務監控腳本登錄pgpool提示須要輸入密碼,參考:

.pgpass免密碼登錄
經過在客戶端/home/postgres,咱們這裏建議在/root和/home/postgres都放個隱藏文件.pgpass,從而避免連接數據庫時彈出密碼提示

vim /home/postgres/.pgpass
chmod 600 /home/postgres/.pgpass
cp /home/postgres/.pgpass /root
chown postgres.postgres /home/postgres/.pgpass
#格式:hostname:port:database:username:password
127.0.0.1:5432:postgres:postgres:postgres

三、測試

目前主要有三類測試,

a、主機heartbeat down機,備機可否正常接管資源

主機:/etc/init.d/heartbeat stop,理論上業務監控腳本、pg、pgpool、heartbeat都會中止、recovery.done變爲recovery.conf

備機:pg_controldata | grep cluster顯示爲production,pg_ctl promote激活備機、pgpool、業務監控腳本啓動、recovery.conf自動改成recovery.done

主機恢復爲standby:啓動postgresql和heartbeat便可

b、主機業務掛掉,備機可否接管

主要是判斷可否連上本地的數據庫進行一個select查詢,若是沒有就會中止本地的heartbeat讓備機接管資源

c、主機硬關機,備機可否接管資源

只要我心跳基本上都能很快接管,可是原主機恢復的時候,須要檢查下recovery.done是否變爲recover.conf,否則啓動會報錯

相關文章
相關標籤/搜索