I recently ran into a tool called Pen. Pen is a lot like other reverse
proxies except it can be totally run from the command line with no
configuration file.
pen 8080 host1:80 host2:80
This makes it ideal work as an RA, because the load balancer (ok its a
proxy but close enough) can fail over to any node without having to
worry about synchronizing configuration files.
>From inside Linux HA it can be used like this
<primitive id="pen_80" class="ocf" type="Pen" provider="heartbeat">
<operations>
<op id="mon_pen_80" name="monitor"
interval="30s" timeout="3s"/>
</operations>
<instance_attributes>
<attributes>
<nvpair name="listen_port" value="192.168.200.10:80" />
<nvpair name="control_port" value="20280" />
<nvpair name="blacklist" value="30" />
<nvpair name="logfile" value="/var/log/pen_80.log" />
<nvpair name="conffile" value="/dev/null" />
<nvpair name="server_list" value="host1:80:1024
host2:80:1024" />
</attributes>
</instance_attributes>
</primitive>
I have tested the RA with multiple running instances of Pen and
everything seems good. Finding a pen packages is easy and building
from sources is trivial as well. Once you get the RA installed it is
very easy to create load balancing groups on the fly.
#!/bin/sh
# Edward Guy Capriolo
# Pen RA: Used to start the pen proxy from linux HA
#
# OCF parameters are as below
# OCF_RESKEY_listen_port
# OCF_RESKEY_control_port
# OCF_RESKEY_blacklist
# OCF_RESKEY_logfile
# OCF_RESKEY_conffile
# OCF_RESKEY_server_list
# TEsting uncomment
#OCF_RESKEY_listen_port=8080
#OCF_RESKEY_control_port=8081
#OCF_RESKEY_blacklist=30
#OCF_RESKEY_logfile=/var/log/pen
#OCF_RESKEY_conffile=/etc/pen.cfg
#OCF_RESKEY_server_list="server1:80:1024 server2:80:1024"
#OCF_ROOT=/usr/lib/ocf
#######################################################################
# Initialization:
. /etc/init.d/functions
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
#######################################################################
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="Pen">
<version>1.0</version>
<longdesc lang="en">
Starts the pen (reverse) proxy
</longdesc>
<shortdesc lang="en">Starts the pen proxy</shortdesc>
<parameters>
<parameter name="listen_port" unique="1" required="1">
<longdesc lang="en">
The port for client connections data sent to this port will be
forwared to back end servers. Can also be specified as host:port
</longdesc>
<shortdesc lang="en">listen port</shortdesc>
<content type="string" default="" />
</parameter>
<parameters>
<parameter name="control_port" unique="1" required="1">
<longdesc lang="en">
used to send control signals to pen
</longdesc>
<shortdesc lang="en">control port</shortdesc>
<content type="string" default="" />
</parameter>
<parameters>
<parameter name="blacklist" unique="1" required="1">
<longdesc lang="en">
a blacklist time before a backend server is dead
</longdesc>
<shortdesc lang="en">blacklist</shortdesc>
<content type="string" default="" />
</parameter>
<parameters>
<parameter name="logfile" unique="1" required="1">
<longdesc lang="en">
where to log to
</longdesc>
<shortdesc lang="en">logfile</shortdesc>
<content type="string" default="" />
</parameter>
<parameters>
<parameter name="conffile" unique="1" required="1">
<longdesc lang="en">
extra parameters in a configuration file
</longdesc>
<shortdesc lang="en">conffile</shortdesc>
<content type="string" default="" />
</parameter>
<parameters>
<parameter name="server_list" unique="1" required="1">
<longdesc lang="en">
definition of the backend servers
</longdesc>
<shortdesc lang="en">server_list</shortdesc>
<content type="string" default="" />
</parameter>
</parameters>
<actions>
<action name="start" timeout="90" />
<action name="stop" timeout="100" />
<action name="status" depth="10" timeout="20s" interval="10s" start-delay="5s"
/>
<action name="monitor" depth="10" timeout="20s" interval="10s"
start-delay="5s" />
<action name="meta-data" timeout="5s" />
<action name="validate-all" timeout="20s" />
</actions>
</resource-agent>
END
exit $OCF_SUCCESS
}
#######################################################################
pen_usage() {
cat <<END
usage: $0 {start|stop|status|monitor|validate-all|meta-data}
Expects to have a fully populated OCF RA-compliant environment set.
END
}
pen_start() {
WS_RUN=`ps -ef | grep /usr/bin/pen | grep $OCF_RESKEY_control_port |
grep -v grep`
if [ "$WS_RUN" = "" ] ; then
/usr/bin/pen -F $OCF_RESKEY_conffile -C
$OCF_RESKEY_control_port -b $OCF_RESKEY_blacklist -l $OCF_RESKEY_logfile
$OCF_RESKEY_listen_port $OCF_RESKEY_server_list >/dev/null 2>/dev/null
/usr/bin/penctl localhost:$OCF_RESKEY_control_port roundrobin
#/usr/bin/penctl localhost:$OCF_RESKEY_control_port tracking 60
if [ "$?" = "0" ] ; then
echo "Starting pen [OK]"
exit $OCF_SUCCESS
else
echo "Starting pen [FAILED]"
exit $OCF_ERR_GENERIC
fi
else
echo "pen already running"
exit 0
fi
# exit $OCF_ERR_GENERIC
# exit $OCF_SUCCESS
}
pen_stop() {
WS_PID=`ps -ef | grep /usr/bin/pen | grep $OCF_RESKEY_control_port |
grep -v grep | awk '{print $2}'`
if [ "$WS_PID" = "" ] ; then
echo "pen is already stopped"
return $OCF_SUCCESS
else
kill $WS_PID
echo "pen stopped [OK]"
return $OCF_SUCCESS
fi
exit $OCF_SUCCESS
}
pen_monitor() {
WS_PID=`ps -ef | grep /usr/bin/pen | grep $OCF_RESKEY_control_port |
grep -v grep | awk '{print $2}'`
if [ "$WS_PID" = "" ] ; then
return $OCF_NOT_RUNNING
else
return $OCF_SUCCESS
fi
return $OCF_ERR_GENERIC
}
pen_validate() {
exit $OCF_SUCCESS
}
case $__OCF_ACTION in
meta-data) meta_data
;;
start) pen_start
;;
stop) pen_stop
;;
status) pen_monitor
;;
monitor) pen_monitor
;;
validate-all) pen_validate
;;
usage|help) pen_usage
exit $OCF_SUCCESS
;;
*) pen_usage
exit $OCF_ERR_UNIMPLEMENTED
;;
esac
_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems