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

Reply via email to