我正在build立由2个节点,一个主站和一个从站组成的PostgreSQL 9.2.8群集。 我使用stream式复制和repmgr 2.0。 我的平台是RHEL 6.3。
主人和奴隶可以手动启动,但我不能让他们由我的Pacemaker群集启动。 日志显示主设备启动成功,然后显示器返回一个8(作为主设备运行),然后几乎立即由起搏器降级。 在我的第二个节点上,奴隶根本不开始:
Apr 28 12:41:07 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:start:stdout) POSTGRESQL : action = start Apr 28 12:41:07 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:start:stdout) START: status = 7 start() NOT RUNNING Apr 28 12:41:07 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:start:stdout) calling pg_start Apr 28 12:41:07 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:start:stdout) starting /usr/pgsql-9.2/bin/pg_ctl start -w -D /opt/pgdata -l /var//ha/postgresql/postgres_ha.log -o '-c config_file=/opt/pgdata/postgresql.conf' -o '-p 5432' Apr 28 12:41:08 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:start:stdout) pg_start(): asked for start , waiting 10s Apr 28 12:41:18 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:start:stdout) pg_start(): asked for start, waited long enough checing state Apr 28 12:41:18 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:start:stdout) in pg_state_check: 100 started as MASTER Apr 28 12:41:18 [1892] clustera attrd: notice: attrd_trigger_update: Sending flush op to all hosts for: master-pg92 (50) Apr 28 12:41:18 [1892] clustera attrd: notice: attrd_perform_update: Sent update 194: master-pg92=50 Apr 28 12:41:18 [1894] clustera crmd: info: abort_transition_graph: te_update_diff:176 - Triggered transition abort (complete=0, tag=nvpair, id=status-clustera-master-pg92, name=master-pg92, value=50, magic=NA, cib=0.220.185) : Transient attribute: update Apr 28 12:41:18 [1894] clustera crmd: info: process_lrm_event: LRM operation POSTGRESQL:0_start_0 (call=105, rc=0, cib-update=192, confirmed=true) ok Apr 28 12:41:18 [1894] clustera crmd: info: te_rsc_command: Initiating action 41: notify POSTGRESQL:0_post_notify_start_0 on clustera (local) Apr 28 12:41:18 clustera lrmd: [1891]: info: rsc:POSTGRESQL:0:106: notify Apr 28 12:41:18 [1894] clustera crmd: info: te_rsc_command: Initiating action 43: notify POSTGRESQL:1_post_notify_start_0 on clusterb Apr 28 12:41:18 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:notify:stdout) UNAME === clustera Apr 28 12:41:18 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:notify:stdout) SUCCESS Apr 28 12:41:18 clustera lrmd: [1891]: info: RA output: (POSTGRESQL:0:notify:stdout) POSTGRESQL : action = notify Apr 28 12:41:18 [1894] clustera crmd: info: process_lrm_event: LRM operation POSTGRESQL:0_notify_0 (call=106, rc=0, cib-update=0, confirmed=true) ok Apr 28 12:41:18 [1894] clustera crmd: notice: run_graph: ==== Transition 64 (Complete=21, Pending=0, Fired=0, Skipped=1, Incomplete=0, Source=/var/lib/pengine/pe-input-67.bz2): Stopped Apr 28 12:41:18 [1894] clustera crmd: notice: do_state_transition: State transition S_TRANSITION_ENGINE -> S_POLICY_ENGINE [ input=I_PE_CALC cause=C_FSA_INTERNAL origin=notify_crmd ] Apr 28 12:41:18 [1893] clustera pengine: notice: unpack_config: On loss of CCM Quorum: Ignore Apr 28 12:41:18 [1893] clustera pengine: warning: unpack_rsc_op: Processing failed op POSTGRESQL:0_last_failure_0 on clustera: master (8) Apr 28 12:41:18 [1893] clustera pengine: notice: common_apply_stickiness: MS_POSTGRESQL can fail 999987 more times on clustera before being forced off Apr 28 12:41:18 [1893] clustera pengine: notice: common_apply_stickiness: MS_POSTGRESQL can fail 999987 more times on clustera before being forced off Apr 28 12:41:18 [1894] clustera crmd: notice: do_state_transition: State transition S_POLICY_ENGINE -> S_TRANSITION_ENGINE [ input=I_PE_SUCCESS cause=C_IPC_MESSAGE origin=handle_response ] Apr 28 12:41:18 [1894] clustera crmd: info: do_te_invoke: Processing graph 65 (ref=pe_calc-dc-1398703278-318) derived from /var/lib/pengine/pe-input-68.bz2 Apr 28 12:41:18 [1894] clustera crmd: info: te_rsc_command: Initiating action 9: monitor POSTGRESQL:0_monitor_60000 on clustera (local) Apr 28 12:41:18 clustera lrmd: [1891]: info: rsc:POSTGRESQL:0:107: monitor Apr 28 12:41:18 [1893] clustera pengine: notice: process_pe_message: Transition 65: PEngine Input stored in: /var/lib/pengine/pe-input-68.bz2 Apr 28 12:41:18 [1892] clustera attrd: notice: attrd_trigger_update: Sending flush op to all hosts for: master-pg92 (100) Apr 28 12:41:18 [1892] clustera attrd: notice: attrd_perform_update: Sent update 196: master-pg92=100 Apr 28 12:41:18 [1894] clustera crmd: info: abort_transition_graph: te_update_diff:176 - Triggered transition abort (complete=0, tag=nvpair, id=status-clustera-master-pg92, name=master-pg92, value=100, magic=NA, cib=0.220.188) : Transient attribute: update Apr 28 12:41:18 [1894] clustera crmd: info: process_lrm_event: LRM operation POSTGRESQL:0_monitor_60000 (call=107, rc=8, cib-update=194, confirmed=false) master Apr 28 12:41:18 [1894] clustera crmd: warning: status_from_rc: Action 9 (POSTGRESQL:0_monitor_60000) on clustera failed (target: 0 vs. rc: 8): Error Apr 28 12:41:18 [1894] clustera crmd: warning: update_failcount: Updating failcount for POSTGRESQL:0 on clustera after failed monitor: rc=8 (update=value++, time=1398703278) Apr 28 12:41:18 [1894] clustera crmd: info: abort_transition_graph: match_graph_event:277 - Triggered transition abort (complete=0, tag=lrm_rsc_op, id=POSTGRESQL:0_last_failure_0, magic=0:8;9:65:0:70e313b8-b64a-4340-8d96-e64054ac9439, cib=0.220.190) : Event failed Apr 28 12:41:18 [1894] clustera crmd: notice: run_graph: ==== Transition 65 (Complete=1, Pending=0, Fired=0, Skipped=0, Incomplete=0, Source=/var/lib/pengine/pe-input-68.bz2): Complete Apr 28 12:41:18 [1894] clustera crmd: notice: do_state_transition: State transition S_TRANSITION_ENGINE -> S_POLICY_ENGINE [ input=I_PE_CALC cause=C_FSA_INTERNAL origin=notify_crmd ] Apr 28 12:41:18 [1892] clustera attrd: notice: attrd_trigger_update: Sending flush op to all hosts for: fail-count-POSTGRESQL:0 (14)
我的起搏器configuration如下:
node clustera attributes standby="off" node clusterb attributes standby="off" primitive POSTGRESQL ocf:xxx:postgresql \ params repmgr_conf="/var/lib/pgsql/repmgr/repmgr.conf" pgctl="/usr/pgsql-9.2/bin/pg_ctl" pgdata="/opt/pgdata" \ op start interval="0" timeout="90s" \ op stop interval="0" timeout="60s" \ op promote interval="0" timeout="120s" \ op monitor interval="53s" role="Master" \ op monitor interval="60s" role="Slave" ms MS_POSTGRESQL POSTGRESQL \ meta clone-max="2" target-role="Started" resource-stickiness="100" notify="true" property $id="cib-bootstrap-options" \ dc-version="1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14" \ cluster-infrastructure="openais" \ expected-quorum-votes="2" \ stonith-enabled="false" \ no-quorum-policy="ignore" \ default-resource-stickiness="10" \ start-failure-is-fatal="false" \ last-lrm-refresh="1398700283"
我的postgresql资源代理如下(启发https://github.com/xmm/repmgr ):
OCF_ROOT=/usr/lib/ocf OCF_RESOURCE_INSTANCE="pg92" : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat} . ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs : ${OCF_RESKEY_CRM_meta_clone_node_max=1} : ${OCF_RESKEY_CRM_meta_master_max=1} : ${OCF_RESKEY_CRM_meta_master_node_max=1} : ${OCF_RESKEY_PG_ROOT=/usr/pgsql-9.2/bin} : ${OCF_RESKEY_repmgr=${OCF_RESKEY_PG_ROOT}/repmgr} : ${OCF_RESKEY_repmgr_conf=/var/lib/pgsql/repmgr/repmgr.conf} : ${OCF_RESKEY_repmgr_clone_opt="-d postgres -U repmgr -R postgres"} : ${OCF_RESKEY_pgctl=${OCF_RESKEY_PG_ROOT}/pg_ctl} : ${OCF_RESKEY_psql=${OCF_RESKEY_PG_ROOT}/psql} : ${OCF_RESKEY_pgdata=/opt/pgdata} : ${OCF_RESKEY_pgconfig=${OCF_RESKEY_pgdata}/postgresql.conf} : ${OCF_RESKEY_pgdba=postgres} : ${OCF_RESKEY_pgport=5432} : ${OCF_RESKEY_start_opt="-p $OCF_RESKEY_pgport"} : ${OCF_RESKEY_pgdb=pgbench} : ${OCF_RESKEY_logfile=/var/ha/postgresql/postgres_ha.log} : ${OCF_RESKEY_stop_escalate=30} : ${OCF_RESKEY_master_score=100} : ${OCF_RESKEY_slave_score=50} : ${OCF_RESKEY_STATUS_ISREPLICATION_SQL="SELECT pg_is_in_recovery();"} CRM_MASTER="${HA_SBIN_DIR}/crm_master -l reboot" PIDFILE=${OCF_RESKEY_pgdata}/postmaster.pid SOCKETDIR=/var/run/postgresql meta_data() { cat <<EOF <?xml version="1.0"?> <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> <resource-agent name="pgsql" version="1.0"> <version>1.0</version> <longdesc lang="en"> Master/Slave OCF Resource Agent for PostgreSQL with Hot, Warm or Streaming Backup </longdesc> <shortdesc lang="en">Manages a PostgreSQL Master/Slave instance</shortdesc> <parameters> <parameter name="repmgr" unique="0" required="0"> <longdesc lang="en"> Path to repmgr command. </longdesc> <shortdesc lang="en">repmgr</shortdesc> <content type="string" default="/usr/bin/repmgr" /> </parameter> <parameter name="repmgr_conf" unique="0" required="0"> <longdesc lang="en"> Path to repmgr config file. </longdesc> <shortdesc lang="en">repmgr_conf</shortdesc> <content type="string" default="/var/lib/pgsql/data" /> </parameter> <parameter name="repmgr_clone_opt" unique="0" required="0"> <longdesc lang="en"> standby clone params for repmgr command. </longdesc> <shortdesc lang="en">repmgr_clone_opt</shortdesc> <content type="string" default="-d postgres -U repmgr -R postgres" /> </parameter> <parameter name="pgctl" unique="0" required="0"> <longdesc lang="en"> Path to pg_ctl command. </longdesc> <shortdesc lang="en">pgctl</shortdesc> <content type="string" default="/usr/bin/pg_ctl" /> </parameter> <parameter name="start_opt" unique="0" required="0"> <longdesc lang="en"> Start options (-o start_opt in pgi_ctl). "-i -p 5432" for example. </longdesc> <shortdesc lang="en">start_opt</shortdesc> <content type="string" default="" /> </parameter> <parameter name="ctl_opt" unique="0" required="0"> <longdesc lang="en"> Additional pg_ctl options. Default is "" </longdesc> <shortdesc lang="en">ctl_opt</shortdesc> <content type="string" default="" /> </parameter> <parameter name="psql" unique="0" required="0"> <longdesc lang="en"> Path to psql command. </longdesc> <shortdesc lang="en">psql</shortdesc> <content type="string" default="/usr/bin/psql" /> </parameter> <parameter name="pgdata" unique="0" required="0"> <longdesc lang="en"> Path to PostgreSQL data directory. </longdesc> <shortdesc lang="en">pgdata</shortdesc> <content type="string" default="/var/lib/pgsql/data" /> </parameter> <parameter name="pgdba" unique="0" required="0"> <longdesc lang="en"> User that owns PostgreSQL. </longdesc> <shortdesc lang="en">pgdba</shortdesc> <content type="string" default="postgres" /> </parameter> <parameter name="pghost" unique="0" required="0"> <longdesc lang="en"> Hostname/IP Addreess where PosrgeSQL is listening </longdesc> <shortdesc lang="en">pghost</shortdesc> <content type="string" default="" /> </parameter> <parameter name="pgport" unique="0" required="0"> <longdesc lang="en"> Port where PosrgeSQL is listening </longdesc> <shortdesc lang="en">pgport</shortdesc> <content type="string" default="5432" /> </parameter> <parameter name="pgdb" unique="0" required="0"> <longdesc lang="en"> Database that will be used for monitoring. </longdesc> <shortdesc lang="en">pgdb</shortdesc> <content type="string" default="template1" /> </parameter> <parameter name="logfile" unique="0" required="0"> <longdesc lang="en"> Path to PostgreSQL server log output file. </longdesc> <shortdesc lang="en">logfile</shortdesc> <content type="string" default="/dev/null" /> </parameter> <parameter name="stop_escalate" unique="0" required="0"> <longdesc lang="en"> Number of retries (using -m fast) before resorting to -m immediate </longdesc> <shortdesc lang="en">stop escalation</shortdesc> <content type="string" default="30" /> </parameter> <parameter name="master_score" unique="0" required="0"> <longdesc lang="en"> Score for adding to node with master instance </longdesc> <shortdesc lang="en">master_score</shortdesc> <content type="string" default="100" /> </parameter> <parameter name="slave_score" unique="0" required="0"> <longdesc lang="en"> Score for adding to node with slave instance </longdesc> <shortdesc lang="en">slave_score</shortdesc> <content type="string" default="50" /> </parameter> </parameters> <actions> <action name="start" timeout="90" /> <action name="promote" timeout="90" /> <action name="demote" timeout="90" /> <action name="stop" timeout="60" /> <action name="notify" timeout="20" /> <action name="monitor" depth="0" timeout="20" interval="20" role="Slave"/> <action name="monitor" depth="0" timeout="20" interval="10" role="Master"/> <action name="meta-data" timeout="5" /> <action name="validate-all" timeout="20" /> </actions> </resource-agent> EOF exit $OCF_SUCCESS } log_params() { ocf_log info "ACTION=$__OCF_ACTION" for param in `env | grep OCF | sort` do ocf_log info "$param" done } meta_expect() { local what=$1 whatvar=OCF_RESKEY_CRM_meta_${1//-/_} op=$2 expect=$3 local val=${!whatvar} if [[ -n $val ]]; then # [, not [[, or it won't work ;) [ $val $op $expect ] && return fi ocf_log err "meta parameter misconfigured, expected $what $op $expect, but found ${val:-unset}." exit $OCF_ERR_CONFIGURED } check_config() { if [ ! -r "$1" ] ; then ocf_log err "Setup problem: Couldn't find config file $1" exit $OCF_ERR_INSTALLED fi } get_node_status () { ocf_log info "Getting node status: " output_health=`${OCF_RESKEY_psql} -U $OCF_RESKEY_pgdba -d $OCF_RESKEY_pgdb -Atc "SELECT 1=1;" |grep "t"` rc=$? if [ $rc -eq 0 ]; then ocf_log info "[Healthcheck] Node is running fine" else ocf_log info "[Healthcheck] Node is down" return 6 fi output_slave=`${OCF_RESKEY_psql} -U $OCF_RESKEY_pgdba -d $OCF_RESKEY_pgdb -Atc "SELECT pg_is_in_recovery();" |grep "t"` rc=$? if [ $rc -eq 0 ]; then ocf_log info "[Node status] SLAVE" return 0 else ocf_log info "[Node status] MASTER" return 100 fi } run_as_pg() { ocf_log info "Run as $OCF_RESKEY_pgdba: $@" output=`su - $OCF_RESKEY_pgdba -c "$*" 2>&1` rc=$? output=`echo $output` if [ $rc -eq 0 ]; then if [ ! -z "$output" ]; then ocf_log info "$output" fi return $OCF_SUCCESS else if [ ! -z "$output" ]; then ocf_log err "$output" else ocf_log err "command failed: $*" fi return $OCF_ERR_GENERIC fi } pg_check_pid() { if [ -f $PIDFILE ] then PID=`head -n 1 $PIDFILE` kill -0 $PID >/dev/null 2>&1 && fuser $OCF_RESKEY_pgdata 2>&1 | grep $PID >/dev/null 2>&1 return $? fi false } run_repmgr() { # pgctl should be in PATH (set it in /etc/login.defs or ~postgres/.profile) ocf_log info "Run as $OCF_RESKEY_pgdba: ${OCF_RESKEY_repmgr} $@" su --login $OCF_RESKEY_pgdba -c "${OCF_RESKEY_repmgr} $*" 2>&1 >> /dev/r.out rc=$? # 100 = master state if [ $rc -ne 0 -a $rc -ne 100 ]; then ocf_log err "command failed: ${OCF_RESKEY_repmgr} $*" fi return $rc } pg_state_check() { local status if ! pg_check_pid then return $OCF_NOT_RUNNING else ocf_log info "PostgreSQL proccess exist..." fi get_node_status status=$? echo "in pg_state_check: $status" case $status in 0) return $OCF_SUCCESS ;; 100) return $OCF_RUNNING_MASTER ;; 6|7) rc=$OCF_NOT_RUNNING ;; # ERR_DB_CON, ERR_DB_QUERY 1|9) rc=$OCF_ERR_INSTALLED ;; # ERR_BAD_CONFIG, ERR_BAD_PASSWORD *) # TODO: Is it need to return OCF_ERR_CONFIGURED for full shutdown of the resource? ocf_log err "${OCF_RESOURCE_INSTANCE}: UNEXPECTED repmgr error ($status)!!!" rc=$status ;; esac return $rc } pg_start() { mkdir -p $SOCKETDIR && \ chown $OCF_RESKEY_pgdba. $SOCKETDIR && \ chmod 2775 $SOCKETDIR echo starting ${OCF_RESKEY_pgctl} start -w -D ${OCF_RESKEY_pgdata} $OCF_RESKEY_ctl_opt -l ${OCF_RESKEY_logfile} -o "'-c config_file=${OCF_RESKEY_pgconfig}'" -o "'$OCF_RESKEY_start_opt'" run_as_pg ${OCF_RESKEY_pgctl} start -w -D ${OCF_RESKEY_pgdata} $OCF_RESKEY_ctl_opt -l ${OCF_RESKEY_logfile} -o "'-c config_file=${OCF_RESKEY_pgconfig}'" -o "'$OCF_RESKEY_start_opt'" echo "pg_start(): asked for start , waiting 10s" sleep 10 echo "pg_start(): asked for start, waited long enough" } pg_stop() { local status run_as_pg ${OCF_RESKEY_pgctl} stop -m fast -D ${OCF_RESKEY_pgdata} -l ${OCF_RESKEY_logfile} -o "'-c config_file=${OCF_RESKEY_pgconfig}'" # stop waiting count=0 while [ $count -lt $OCF_RESKEY_stop_escalate ] do pg_state_check status=$? if [ "$status" -eq $OCF_NOT_RUNNING ]; then #PostgreSQL stopped break; fi count=`expr $count + 1` sleep 1 done if pg_check_pid then #PostgreSQL is still up. Use another shutdown mode. ocf_log info "PostgreSQL failed to stop after ${OCF_RESKEY_stop_escalate}s using -m fast. Trying -m immediate..." run_as_pg ${OCF_RESKEY_pgctl} stop -w -m immediate -D ${OCF_RESKEY_pgdata} -l ${OCF_RESKEY_logfile} -o "'-c config_file=${OCF_RESKEY_pgconfig}'" while : do pg_check_pid || break sleep 1 ocf_log debug "PostgreSQL still hasn't stopped yet. Waiting..." done fi rm -f $PIDFILE ocf_log info "PostgreSQL is stopped" return $OCF_SUCCESS } pg_promote() { local status run_repmgr -f ${OCF_RESKEY_repmgr_conf} --verbose --force standby promote status=$? case $status in 0) return $OCF_SUCCESS ;; 6|7) rc=$OCF_NOT_RUNNING ;; # ERR_DB_CON, ERR_DB_QUERY 1|9) rc=$OCF_ERR_INSTALLED ;; # ERR_BAD_CONFIG, ERR_BAD_PASSWORD 4) rc=$OCF_ERR_GENERIC ;; # ERR_NO_RESTART *) rc=$OCF_ERR_GENERIC ;; esac ocf_log err "${OCF_RESOURCE_INSTANCE}: Promoting failed ($status)" return $rc } pg_follow_master() { run_repmgr -f ${OCF_RESKEY_repmgr_conf} standby follow } pg_clone_master() { run_repmgr -D ${OCF_RESKEY_pgdata} ${OCF_RESKEY_repmgr_clone_opt} --force standby clone $1 || return $OCF_ERR_INSTALLED } pg_demote() { new_master=$1 run_repmgr --verbose standby clone $new_master } rename_data() { if [ -d ${OCF_RESKEY_pgdata} ]; then new_name="`dirname ${OCF_RESKEY_pgdata}`/`basename ${OCF_RESKEY_pgdata}`-`date +%Y%m%d-%H:%M:%S`" if [ -d $new_name ] ; then new_name="`dirname ${OCF_RESKEY_pgdata}`/`basename ${OCF_RESKEY_pgdata}`-`date +%Y%m%d-%H:%M:%S-%N`" fi if mv ${OCF_RESKEY_pgdata} $new_name ; then ocf_log info "${OCF_RESOURCE_INSTANCE} Data dir ${OCF_RESKEY_pgdata} saved as $new_name" else ocf_log err "${OCF_RESOURCE_INSTANCE} Cannot rename data dir ${OCF_RESKEY_pgdata} to $new_name" return $OCF_ERR_INSTALLED fi fi } pgsql_start() { local status ocf_log info "${OCF_RESOURCE_INSTANCE}: Starting" pg_state_check status=$? echo "START: status = $status" case "$status" in $OCF_RUNNING_MASTER) echo "start() RUNNING MASTER" ocf_log warn "${OCF_RESOURCE_INSTANCE} already started as Primary." ;; $OCF_SUCCESS) echo "start() SUCCESS" ocf_log warn "${OCF_RESOURCE_INSTANCE} already started as Standby." ;; $OCF_NOT_RUNNING) echo "start() NOT RUNNING" log_params # $OCF_RESKEY_CRM_meta_notify_master_uname can be ' ' if [ "$OCF_RESKEY_CRM_meta_notify_master_uname" != ' ' -a "$OCF_RESKEY_CRM_meta_notify_master_uname" != '`$HOSTNAME`' ] ; then echo "XXX" ocf_log info "${OCF_RESOURCE_INSTANCE} Master instance exist on host ${OCF_RESKEY_CRM_meta_notify_master_uname}" if [ ! -f ${OCF_RESKEY_pgdata}/recovery.conf ] ; then echo "no reconvery.conf" ocf_log warn "${OCF_RESOURCE_INSTANCE} recovery.conf file not found. I think this is old Master. Start cloning the current Master..." rename_data && pg_clone_master $OCF_RESKEY_CRM_meta_notify_master_uname || return $? fi fi echo "calling pg_start" pg_start echo "checing state" pg_state_check status=$? if [ "$status" = $OCF_RUNNING_MASTER ] ; then echo "started as MASTER" ocf_log warn "${OCF_RESOURCE_INSTANCE} started as Master" elif [ "$status" = $OCF_SUCCESS ] ; then echo "started as STANDBY" ocf_log info "${OCF_RESOURCE_INSTANCE} started as Standby" else echo "unexpected status $status" ocf_log err "${OCF_RESOURCE_INSTANCE} Unexpected status ($status) of node at start action" return $status fi ;; *) ocf_log err "${OCF_RESOURCE_INSTANCE} Unexpected status ($status) of node at start action" #$CRM_MASTER -D return $status ;; esac $CRM_MASTER -v ${OCF_RESKEY_slave_score} return $OCF_SUCCESS } pgsql_promote() { local status ocf_log info "${OCF_RESOURCE_INSTANCE}: Promoting" pg_state_check status=$? case "$status" in $OCF_RUNNING_MASTER) ocf_log warn "${OCF_RESOURCE_INSTANCE} already started as Primary." ;; $OCF_SUCCESS) pg_promote status=$? if [ $status = $OCF_RUNNING_MASTER ] ; then ocf_log warn "${OCF_RESOURCE_INSTANCE} started as Primary." else #$CRM_MASTER -D return $status fi ;; $OCF_NOT_RUNNING) #$CRM_MASTER -D return $status ;; *) ocf_log err "${OCF_RESOURCE_INSTANCE} Unexpected status ($status) of node at promote action." #$CRM_MASTER -D return $status esac $CRM_MASTER -v ${OCF_RESKEY_master_score} return $OCF_SUCCESS } pgsql_demote() { # We cannot switch to standby if another master not started yet local status ocf_log info "${OCF_RESOURCE_INSTANCE}: Demoting" $CRM_MASTER -D pg_state_check status=$? case "$status" in $OCF_RUNNING_MASTER) log_params pg_stop pg_state_check status=$? if [ "$status" = $OCF_NOT_RUNNING ] ; then return $OCF_SUCCESS elif [ "$status" = $OCF_RUNNING_MASTER -o "$status" = $OCF_SUCCESS ] ; then ocf_log warn "${OCF_RESOURCE_INSTANCE} Cannot stop resource, still runned" return $OCF_ERR_GENERIC fi return $OCF_SUCCESS ;; $OCF_SUCCESS) ocf_log warn "${OCF_RESOURCE_INSTANCE} already Standby." return $OCF_SUCCESS ;; $OCF_NOT_RUNNING) ocf_log err "Trying to demote a resource that was not started" return $OCF_NOT_RUNNING ;; *) ocf_log err "${OCF_RESOURCE_INSTANCE} Unexpected status ($status) of node at demote action. Score will removed" ;; esac return $status } pgsql_stop() { local status ocf_log info "${OCF_RESOURCE_INSTANCE}: Stopping" $CRM_MASTER -D pg_state_check status=$? case "$status" in $OCF_RUNNING_MASTER | $OCF_SUCCESS) pg_stop pg_state_check status=$? if [ "$status" = $OCF_NOT_RUNNING ] ; then return $OCF_SUCCESS elif [ "$status" = $OCF_RUNNING_MASTER -o "$status" = $OCF_SUCCESS ] ; then ocf_log warn "${OCF_RESOURCE_INSTANCE} Cannot stop resource, still runned" return $OCF_ERR_GENERIC fi ;; $OCF_NOT_RUNNING) ocf_log err "${OCF_RESOURCE_INSTANCE} Trying to stop a resource that was not started" return $OCF_SUCCESS ;; *) ocf_log err "${OCF_RESOURCE_INSTANCE} Unexpected status ($status) of node at stop action. Score will removed" ;; esac return $status } pgsql_monitor() { local status pg_state_check status=$? echo "pg_state_check returned $status" case "$status" in $OCF_RUNNING_MASTER) echo ">>>>>> MASTER" echo $CRM_MASTER echo $CRM_MASTER -v ${OCF_RESKEY_master_score} ocf_log info "${OCF_RESOURCE_INSTANCE} PostgreSQL in Master mode" $CRM_MASTER -v ${OCF_RESKEY_master_score} ;; $OCF_SUCCESS) echo ">>>>>> SLAVE" ocf_log info "${OCF_RESOURCE_INSTANCE} PostgreSQL in Standby mode" $CRM_MASTER -v ${OCF_RESKEY_slave_score} ;; $OCF_NOT_RUNNING) echo ">>>>>> NOT RUNNING" ocf_log info "${OCF_RESOURCE_INSTANCE} PostgreSQL is not runned" $CRM_MASTER -D ;; *) ocf_log err "${OCF_RESOURCE_INSTANCE} Unexpected status ($status)" $CRM_MASTER -D ;; esac return $status } pgsql_validate_all() { meta_expect master-max -le 1 meta_expect clone-node-max = 1 meta_expect master-node-max = 1 echo "UNAME === ${OCF_RESKEY_CRM_meta_notify_start_uname}" if [ $__OCF_ACTION != "monitor" -a "${OCF_RESKEY_CRM_meta_notify_start_uname- NOT SET }" = " NOT SET " ]; then ocf_log err "you should enable notify when using this RA" log_params echo "ERR CONFIGURED in VALIDATE ALL" return $OCF_ERR_CONFIGURED fi check_binary fuser check_binary $OCF_RESKEY_pgctl check_binary $OCF_RESKEY_psql check_binary $OCF_RESKEY_repmgr check_config $OCF_RESKEY_pgconfig check_config $OCF_RESKEY_repmgr_conf if ! su --login $OCF_RESKEY_pgdba -c "type -p `basename $OCF_RESKEY_pgctl`" > /dev/null ; then ocf_log err "`basename $OCF_RESKEY_pgctl` should be in PATH for user $OCF_RESKEY_pgdba" return $OCF_ERR_INSTALLED fi echo "SUCCESS" return $OCF_SUCCESS } pgsql_notify() { local n_type=$OCF_RESKEY_CRM_meta_notify_type local n_op=$OCF_RESKEY_CRM_meta_notify_operation # post/promote: slave follow new master ocf_log info "${OCF_RESOURCE_INSTANCE}: NOTIFY $n_type/$n_op" #log_params return $OCF_SUCCESS } pgsql_usage() { cat <<END usage: $0 {start|stop|promote|demote|monitor|validate-all|meta-data} Expects to have a fully populated OCF RA-compliant environment set. END exit $1 } ####################################################################### ### Main ### if [ $# -ne 1 ]; then usage exit $OCF_ERR_ARGS fi case $__OCF_ACTION in meta-data) meta_data exit $OCF_SUCCESS;; usage|help) pgsql_usage $OCF_SUCCESS;; esac pgsql_validate_all || exit echo "POSTGRESQL : action = $__OCF_ACTION" case $__OCF_ACTION in start) pgsql_start;; promote) pgsql_promote;; demote) pgsql_demote;; stop) pgsql_stop;; notify) pgsql_notify;; monitor) pgsql_monitor;; validate-all) ;; *) pgsql_usage $OCF_ERR_UNIMPLEMENTED;; esac exit
任何线索?
在资源代理中,不应出现以下内容:
OCF_ROOT = / usr / lib / ocf OCF_RESOURCE_INSTANCE =“pg92”
这些是为了手动debugging脚本,手动启动并强制OCF_RESOURCE_INSTANCEvariables。
这解决了这个问题。