DRBD (www.drbd.org) is a shared-nothing synchronous storage replication capable of acting as a drop-in replacement for shared storage.
This resource agent manages a DRBD device by switching it into the Primary and Secondary roles as needed. For a configuration example, please see http://www.drbd.org/users-guide/s-rhcs-failover-clusters.html --- rgmanager/src/resources/Makefile.am | 4 +- rgmanager/src/resources/drbd.metadata | 51 ++++++++++++ rgmanager/src/resources/drbd.sh | 144 +++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 rgmanager/src/resources/drbd.metadata create mode 100644 rgmanager/src/resources/drbd.sh diff --git a/rgmanager/src/resources/Makefile.am b/rgmanager/src/resources/Makefile.am index ebeb61e..ede5a74 100644 --- a/rgmanager/src/resources/Makefile.am +++ b/rgmanager/src/resources/Makefile.am @@ -9,11 +9,11 @@ RESOURCES = service.sh ip.sh nfsclient.sh nfsexport.sh \ apache.sh openldap.sh samba.sh mysql.sh \ postgres-8.sh tomcat-5.sh lvm.sh \ vm.sh SAPInstance SAPDatabase named.sh \ - ASEHAagent.sh + ASEHAagent.sh drbd.sh METADATA = apache.metadata openldap.metadata samba.metadata \ mysql.metadata postgres-8.metadata \ - tomcat-5.metadata named.metadata lvm.metadata + tomcat-5.metadata named.metadata lvm.metadata drbd.sh EVENT_TARGETS = default_event_script.sl follow-service.sl diff --git a/rgmanager/src/resources/drbd.metadata b/rgmanager/src/resources/drbd.metadata new file mode 100644 index 0000000..30fe122 --- /dev/null +++ b/rgmanager/src/resources/drbd.metadata @@ -0,0 +1,51 @@ +<?xml version="1.0" ?> +<resource-agent version="rgmanager 2.0" name="drbd"> + <version>1.0</version> + + <longdesc lang="en"> + This is a DRBD resource. The resource must be configured + in the configuration file (/etc/drbd.conf), and the + DRBD kernel module must be loaded. + </longdesc> + + <shortdesc lang="en"> + This is a DRBD resource. + </shortdesc> + + <parameters> + <parameter name="name" unique="1" primary="1"> + <longdesc lang="en"> + Symbolic name for this resource. + </longdesc> + <shortdesc lang="en"> + Cluster resource name + </shortdesc> + <content type="string"/> + </parameter> + <parameter name="resource" unique="1" required="1"> + <longdesc lang="en"> + The DRBD resource name, as specified in /etc/drbd.conf. + </longdesc> + <shortdesc lang="en"> + DRBD resource name + </shortdesc> + <content type="string"/> + </parameter> + </parameters> + + <actions> + <action name="start" timeout="20"/> + <action name="stop" timeout="20"/> + + <!-- Checks to see if the resource is Primary locally --> + <action name="status" depth="10" interval="60" timeout="20"/> + <action name="monitor" depth="10" interval="60" timeout="20"/> + + <action name="meta-data" timeout="20"/> + <action name="verify-all" timeout="20"/> + </actions> + + <special tag="rgmanager"> + <attributes maxinstances="1"/> + </special> +</resource-agent> diff --git a/rgmanager/src/resources/drbd.sh b/rgmanager/src/resources/drbd.sh new file mode 100644 index 0000000..4571660 --- /dev/null +++ b/rgmanager/src/resources/drbd.sh @@ -0,0 +1,144 @@ +#!/bin/bash +# +# Copyright LINBIT, 2008 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, +# MA 02139, USA. +# + +# +# DRBD resource management using the drbdadm utility. +# + +LC_ALL=C +LANG=C +PATH=/bin:/sbin:/usr/bin:/usr/sbin +export LC_ALL LANG PATH + +. $(dirname $0)/ocf-shellfuncs + +drbd_verify_all() +{ + # Do we have the drbdadm utility? + if ! which drbdadm >/dev/null 2>&1 ; then + ocf_log error "drbdadm not installed, not found in PATH ($PATH), or not executable." + return $OCF_ERR_INSTALLED + fi + + # Is drbd loaded? + if ! grep drbd /proc/modules >/dev/null 2>&1; then + ocf_log error "drbd not found in /proc/modules. Do you need to modprobe?" + return $OCF_ERR_INSTALLED + fi + + # Do we have the "resource" parameter? + if [ -n "$OCF_RESKEY_resource" ]; then + + # Can drbdadm parse the resource name? + if ! drbdadm sh-dev $OCF_RESKEY_resource >/dev/null 2>&1; then + ocf_log error "DRBD resource \"$OCF_RESKEY_resource\" not found." + return $OCF_ERR_CONFIGURED + fi + + # Is the backing device a locally available block device? + backing_dev=$(drbdadm sh-ll-dev $OCF_RESKEY_resource) + if [ ! -b $backing_dev ]; then + ocf_log error "Backing device for DRBD resource \"$OCF_RESKEY_resource\" ($backing_dev) not found or not a block device." + return $OCF_ERR_INSTALLED + fi + + fi + + return 0 +} + +drbd_status() { + role=$(drbdadm role $OCF_RESKEY_resource) + case $role in + Primary/*) + return $OCF_RUNNING + ;; + Secondary/*) + return $OCF_NOT_RUNNING + ;; + + esac + return $OCF_ERR_GENERIC +} + +drbd_promote() { + drbdadm primary $OCF_RESKEY_resource || return $? +} + +drbd_demote() { + drbdadm secondary $OCF_RESKEY_resource || return $? +} + + +if [ -z "$OCF_CHECK_LEVEL" ]; then + OCF_CHECK_LEVEL=0 +fi + +# This one doesn't need to pass the verify check +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` && exit 0 + exit $OCF_ERR_GENERIC + ;; +esac + +# Everything else does +drbd_verify_all || exit $? +case $1 in + start) + if drbd_status; then + ocf_log debug "DRBD resource ${OCF_RESKEY_resource} already configured" + exit 0 + fi + drbd_promote + if [ $? -ne 0 ]; then + exit $OCF_ERR_GENERIC + fi + + exit $? + ;; + stop) + if drbd_status; then + drbd_demote + if [ $? -ne 0 ]; then + exit $OCF_ERR_GENERIC + fi + else + ocf_log debug "DRBD resource ${OCF_RESKEY_resource} is not configured" + fi + exit 0 + ;; + status|monitor) + drbd_status + exit $? + ;; + restart) + $0 stop || exit $OCF_ERR_GENERIC + $0 start || exit $OCF_ERR_GENERIC + exit 0 + ;; + verify-all) + exit 0 + ;; + *) + echo "usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" + exit $OCF_ERR_GENERIC + ;; +esac -- 1.6.0.4
