项目要求通过heartbeat控制pg和pgpool的主备过程,从而达到高可用,pg的自己的流复制主备方案参考我另外一篇主备方案文章,pgpool这里只用到连接池的功能。应用通过heartbeat虚拟出来的VIP访问pgpool池。
注:debian8下建议还是直接apt-get install heartbeat,编译各种依赖还会提示源码错误,配置文件路径一模一样,不过那个启动和关闭脚本得自己写,但是偶尔会报错openhpi相关的,老外说是BUG,但解决办法如下:
- vim/etc/systemd/system/openhpid.service
- [Unit]
- Description=DaemonprovidingaccesstotheSAFHardwarePlatformInterface
- [Service]
- Type=simple
- ExecStart=/usr/sbin/openhpid-n-c/etc/openhpi/openhpi.conf
- [Install]
- WantedBy=multi-user.target
一、准备工作
1、两台debian8.4 xfs文件格式虚拟机,分别配置两个IP,留着一个VIP后面用
2、按照另外一篇PG流复制主备方案,配置好PG的主备配置
3、按照另外一篇pgpool编译安装用于连接池的配置安装pgpool
4、参考我另外一篇关于linux下邮箱配置的文章,配置好邮箱
二、配置heartbeat
1、配置文件
- cd/etc/ha.d
- vimauthkeys
- auth11crc
- #2sha1HI!
- #3md5Hello!
- #---------------------heartbeat主配置文件----------------------
- vimha.cf
- debugfile/var/log/ha-debug
- logfile/var/log/ha-log
- logfacilitylocal0
- #心跳间隔
- keepalive2
- #死亡阀值
- deadtime30
- #警告时间
- warntime10
- #首次启动heartbeat,等待多久才启动主服务资源
- initdead30
- #连接端口
- udpport694
- #心跳线接口
- #bcasteth1
- #主节点的网卡设备、备份机的心跳线接口IP
- ucasteth0192.168.180.223
- #自动切换还是关掉好
- auto_failbackoff
- nodeelink-master
- nodeelink-slave
- #ping192.168.180.1
- respawnhacluster/usr/lib/heartbeat/ipfail
- apiauthipfailgid=haclientuid=hacluster
- #----------------------VIP资源控制文件----------------------
- vimharesources
- elink-masterIPaddr::192.168.180.221/32/eth0elinkresource.sh
- #---资源控制脚本,如果主机已经拿到资源,备机就算启动heartbeat也不会启动下面的脚本----
- cdresource.d
- vimelinkresource.sh
- isPid()
- {
- pid_result=`ps-ef|grep$1|awk'{if($8!~/grep/)print$2}'`
- echo$1'的进程号:'$pid_result
- if[-n"$pid_result"];then
- return1
- else
- return0
- fi
- }
- start(){
- echo"***************************startPGHA******************************"
- isPidpostmaster
- if[$?-eq0];then
- /etc/init.d/postgresqlstart
- else
- echo'postgresql已经有进程,无需再次启动'
- fi
- isPidpgpool.conf
- if[$?-eq0];then
- pgpool-f/usr/local/etc/pgpool.conf-F/usr/local/etc/pcp.conf-D
- else
- echo'pgpool已经有进程,无需再次启动'
- fi
- #pg_master_process_result=`ssh-lroot192.168.180.222"ps-ef|greppostmaster|grep-vgrep"`
- key_result=`su-postgres-c"pg_controldata|grepcluster|grep'archiverecovery'"`
- if[-n"$key_result"];then
- su-postgres-c"pg_ctlpromote"
- else
- echo'此服务器不是备机无法promote为主机!!!'
- fi
- isPidsleep
- if[$?-eq0];then
- /opt/monitorpg.sh&
- else
- echo'sleep监控进程已经存在无需再次启动'
- fi
- }
- stop(){
- echo"****************************stopPGHA*****************************"
- #sleep_result=`ps-ef|grep'sleep30'|awk'{if($8!~/grep/)print$3}'`
- #kill-9$sleep_result
- pgpool-f/usr/local/etc/pgpool.conf-F/usr/local/etc/pcp.conf-D-mfaststop
- /etc/init.d/postgresqlstop
- mv/usr/local/pgsql/data/recovery.done/usr/local/pgsql/data/recovery.conf
- }
- case$1in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- stop
- sleep10
- start
- ;;
- *)
- echo"Usage:$0{start|stop|restart}"
- esac
2、业务监控脚本
heartbeat只能监控网络层的,例如关机、停止heartbeat后能切换过去,但如果sql都查询不了,那这个资源就是无效资源,当然需要切换
- monitor(){
- result=`/usr/local/pgsql/bin/psql-h192.168.180.222-p5432-Upostgres-w-dpostgres--command"select1"|sed-n3p|cut-c9-9`
- #echo$result
- if[1-eq"$result"];then
- echo`date`"数据库正常,检测值:"$result>>/opt/moni.log
- else
- echo`date`"数据库挂了,检测值:"$result>>/opt/moni.log
- serviceheartbeatstop
- break
- fi
- }
- whilesleep10
- do
- monitor
- done
3、测试
目前主要有三类测试,
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,不然启动会报错