項目要求經過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,否則啓動會報錯