[Linux-ha-dev] ocf script for mysql
Andrew Beekhof
beekhof at gmail.com
Mon Jan 8 12:06:45 MST 2007
you might also want to check out the one under source control:
http://hg.linux-ha.org/dev/file/tip/resources/OCF/mysql.in
On 1/8/07, Achim Stumpf <newgrp at gmx.de> wrote:
> Hi list,
>
> I have rewritten a mysql ocf script which I found on
> http://k2k.ds14.agh.edu.pl/egee-ha/mysql
>
> Basically I corrected the exit codes and I have rewritten some functions
> which i didn't like.
>
> In my test cluster it works fine. I haven't found any mysql ocf script
> shipped with your source code, so maybe you like mine.
>
> If you have any advice, what should be changed or what else you need of
> mine, so that you are able to integrate it in your sources, let me know
> please.
>
>
> cheers,
>
> Achim
>
>
>
>
>
> #!/bin/sh
> #
> # $Id: db2.in,v 1.8 2006/01/26 18:00:05 lars Exp $
> #
> # mysql
> #
> # Description: Manages a MySQL database as Linux-HA resource
> # (made from db2 ocf script)
> #
> #
> # Author: Alan Robertson
> # Author: Jakub Janczak <kubek2k (at) gmail (dot) com>
> # Author: Achim Stumpf <newgrp <at> gmx <dot> de> (rewritten and correction of exit codes)
> # Support: linux-ha at lists.linux-ha.org
> # License: GNU General Public License (GPL)
> # Copyright: (C) 2002 - 2005 International Business Machines, Inc. (? k2k)
> #
> # An example usage in /etc/ha.d/haresources:
> # node1 10.0.0.170 mysql
> #
> # See usage() function below for more details...
> #
> # OCF instance parameters:
> # OCF_RESKEY_mysql_config
> # OCF_RESKEY_mysql_datadir
> # OCF_RESKEY_mysql_user
> # OCF_RESKEY_mysql_group
> # OCF_RESKEY_mysql_test_table
> # OCF_RESKEY_mysql_test_user
> # OCF_RESKEY_mysql_test_passwd
>
> #######################################################################
> # Initialization:
>
> . /usr/lib/heartbeat/ocf-shellfuncs
>
> #######################################################################
>
> SH=/bin/sh
>
> # Default values - You can tweak them out
> MYSQL_CONFIG="/etc/my.cnf"
> MYSQL_DATADIR="/var/lib/mysql"
> MYSQL_USER="mysql"
> MYSQL_GROUP="mysql"
> MYSQL_TEST_TABLE="mysql.user"
> MYSQL_PIDFILE=/var/run/mysqld/mysqld.pid
> MYSQL_SOCKET=/var/lib/mysql/mysql.sock
>
> usage() {
> methods=`mysql_methods`
> methods=`echo $methods | tr ' ' '|'`
> cat <<-!
> usage: `basename $0` ($methods)
>
> `basename $0` manages a MySQL Database as an HA resource.
>
> The 'start' operation starts the database.
> The 'stop' operation stops the database.
> The 'status' operation reports whether the database is running
> The 'monitor' operation reports whether the database seems to be working
> The 'validate-all' operation reports whether the parameters are valid
> The 'meta-data' operation shows the meta data message
>
> !
> }
>
> meta_data() {
> cat <<END
> <?xml version="1.0"?>
> <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
> <resource-agent name="mysql">
> <version>1.0</version>
>
> <longdesc lang="en">
> Resource script for mysql. It manages a MySQL Database instance as an HA resource.
> </longdesc>
> <shortdesc lang="en">mysql resource agent</shortdesc>
>
> <parameters>
> <parameter name="mysql_config" unique="0" required="0">
> <longdesc lang="en">
> Configuration file
> </longdesc>
> <shortdesc lang="en">mysql_config</shortdesc>
> <content type="string" default="/etc/my.cnf" />
> </parameter>
> </parameters>
>
> <parameters>
> <parameter name="mysql_datadir" unique="0" required="0">
> <longdesc lang="en">
> Directory containing databases
> </longdesc>
> <shortdesc lang="en">mysql_datadir</shortdesc>
> <content type="string" default="/var/lib/mysql" />
> </parameter>
> </parameters>
>
> <parameters>
> <parameter name="mysql_user" unique="0" required="0">
> <longdesc lang="en">
> User running mysql daemon
> </longdesc>
> <shortdesc lang="en">mysql_user</shortdesc>
> <content type="string" default="mysql" />
> </parameter>
> </parameters>
>
> <parameters>
> <parameter name="mysql_group" unique="0" required="0">
> <longdesc lang="en">
> Group running mysql daemon
> </longdesc>
> <shortdesc lang="en">mysql_group</shortdesc>
> <content type="string" default="mysql" />
> </parameter>
> </parameters>
>
> <parameters>
> <parameter name="mysql_test_table" unique="0" required="0">
> <longdesc lang="en">
> Table to be tested in monitor statement (in <database>.<table> notation)
> </longdesc>
> <shortdesc lang="en">mysql test table</shortdesc>
> <content type="string" default="mysql.user" />
> </parameter>
> </parameters>
>
> <parameters>
> <parameter name="mysql_test_user" unique="0" required="0">
> <longdesc lang="en">
> Table to be tested in monitor statement (in <database>.<table> notation)
> </longdesc>
> <shortdesc lang="en">mysql test user</shortdesc>
> </parameter>
> </parameters>
>
> <parameters>
> <parameter name="mysql_test_passwd" unique="0" required="0">
> <longdesc lang="en">
> Table to be tested in monitor statement (in <database>.<table> notation)
> </longdesc>
> <shortdesc lang="en">mysql test user password</shortdesc>
> </parameter>
> </parameters>
>
> <actions>
> <action name="start" timeout="120" />
> <action name="stop" timeout="120" />
> <action name="status" timeout="60" />
> <action name="monitor" depth="0" timeout="30" interval="10" start-delay="10" />
> <action name="validate-all" timeout="5" />
> <action name="meta-data" timeout="5" />
> </actions>
> </resource-agent>
> END
> }
>
>
> #
> # methods: What methods/operations do we support?
> #
> mysql_methods() {
> cat <<-!
> start
> stop
> status
> monitor
> validate-all
> meta-data
> !
> }
>
> mysql_silent_status() {
> if [ ! -e $MYSQL_PIDFILE ]; then
> ocf_log info "No pid file found"
> return $OCF_NOT_RUNNING;
> fi
>
> pid=`cat $MYSQL_PIDFILE`;
>
> if [ -d /proc -a -d /proc/1 ]; then
> [ -d /proc/$pid ]
> else
> # This assumes we are root
> kill -0 $pid >/dev/null 2>&1
> fi
> }
>
> mysql_status() {
> if mysql_silent_status; then
> ocf_log info "MySQL running"
> return $OCF_SUCCESS;
> else
> ocf_log info "MySQL not running"
> return $OCF_NOT_RUNNING;
> fi
> }
>
> mysql_start() {
> if mysql_silent_status; then
> ocf_log info "MySQL already running"
> return $OCF_SUCCESS
> else
>
> config=$1
> datadir=$2
> user=$3
> group=$4
>
> touch /var/log/mysqld.log
> chown $user:$group /var/log/mysqld.log
> chmod 0640 /var/log/mysqld.log
> [ -x /sbin/restorecon ] && /sbin/restorecon /var/log/mysqld.log
>
> if [ ! -d $datadir/mysql ] ; then
> ocf_log info "Initializing MySQL database: "
> /usr/bin/mysql_install_db --datadir=$datadir
> ret=$?
> chown -R $user:$group $datadir
> if [ $ret -ne 0 ] ; then
> ocf_log err "Problem with initialization";
> exit $OCF_ERR_GENERIC
> fi
> fi
>
> chown -R $user:$group $datadir
> chmod 0755 $datadir
> /usr/bin/mysqld_safe --defaults-file=$config --pid-file=$MYSQL_PIDFILE --socket=$MYSQL_SOCKET --datadir=$datadir --user=$user >/dev/null 2>&1 &
> ret=$?
> # Spin for a maximum of N seconds waiting for the server to come up.
> # Rather than assuming we know a valid username, accept an "access
> # denied" response as meaning the server is functioning.
> if [ $ret -eq 0 ]; then
> STARTTIMEOUT=10
> while [ $STARTTIMEOUT -gt 0 ]; do
> RESPONSE=`/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping 2>&1` && break
> echo "$RESPONSE" | grep -q "Access denied for user" > /dev/null 2>&1 && break
> sleep 1
> let STARTTIMEOUT=${STARTTIMEOUT}-1
> done
> if [ $STARTTIMEOUT -eq 0 ]; then
> ocf_log err "Timeout error occurred trying to start MySQL Daemon."
> return $OCF_ERR_GENERIC
> else
> ocf_log info "MySQL started"
> return $OCF_SUCCESS
> fi
> else
> ocf_log err "mysqld_safe failed"
> return $ret
> fi
> touch /var/lock/subsys/mysqld
> return $ret
> fi
> }
>
> mysql_stop() {
> if
> mysql_silent_status
> then
> pid=`cat $MYSQL_PIDFILE 2> /dev/null `
> if
> kill $pid > /dev/null 2>&1
> then
> if [ -d /proc -a -d /proc/1 ]; then
> count=0;
> while
> [ -d /proc/$pid ] &&
> [ $count -lt 10 ]
> do
> sleep 1;
> kill $pid >/dev/null 2>&1
> ocf_log info "Killing MySQL PID $pid"
> count=$((count+1))
> done
> fi
> if [ ! -d /proc/$pid ]; then
> ocf_log info "MySQL stopped";
> else
> ocf_log err "MySQL stop timeout exceeded";
> return $OCF_ERR_GENERIC
> fi
> else
> ocf_log err "MySQL couldn't be stopped"
> return $OCF_ERR_GENERIC
> fi
> rm -f /var/lock/subsys/mysqld
> rm -f $datadir/mysql.sock
> else
> # If MySQL ist not running already, it should return 0 to be OCF compliant
> ocf_log info "MySQL is not running."
> fi
> return $OCF_SUCCESS
> }
>
> mysql_monitor() {
> if mysql_silent_status ; then
> test_table=$1
> test_user=$2
> test_passwd=$3
> if [ -z $test_user ]; then
> buf=`echo "SELECT * FROM $test_table" | mysql --user=root --password=lol --socket=$MYSQL_SOCKET -O connect_timeout=1 2>&1`
> ret=$?
> else
> buf=`echo "SELECT * FROM $test_table" | mysql --user=$test_user --password=$test_passwd --socket=$MYSQL_SOCKET -O connect_timeout=1 2>&1`
> ret=$?
> fi
>
> if [ ! $ret -eq 0 ]; then
> ocf_log err "MySQL $test_table monitor failed:";
> if [ ! -z "$buf" ]; then ocf_log err $buf; fi
> return $OCF_ERR_GENERIC;
> else
> ocf_log info "MySQL monitor succeded";
> return $OCF_SUCCESS;
> fi
> else
> ocf_log info "MySQL not running";
> return $OCF_NOT_RUNNING;
> fi
> }
>
>
> validate_all() {
> if [ ! -f $config ]; then
> ocf_log err "Config $config doesn't exist";
> exit $OCF_ERR_ARGS;
> fi
>
> if [ ! -d $datadir ]; then
> ocf_log err "Datadir $datadir dosen't exist";
> exit $OCF_ERR_ARGS;
> fi
>
> grep $user /etc/passwd >/dev/null 2>&1
> if [ ! $? -eq 0 ]; then
> ocf_log err "User $user doesn't exit";
> exit $OCF_ERR_ARGS;
> fi
>
> grep $group /etc/group >/dev/null 2>&1
> if [ ! $? -eq 0 ]; then
> ocf_log err "Group $group doesn't exist";
> exit $OCF_ERR_ARGS;
> fi
> }
>
> # initializing the parameters
> if [ -z $OCF_RESKEY_mysql_config ]; then
> config=$MYSQL_CONFIG;
> else
> config=$OCF_RESKEY_mysql_config;
> fi
> if [ -z $OCF_RESKEY_mysql_datadir ]; then
> datadir=$MYSQL_DATADIR;
> else
> datadir=$OCF_RESKEY_mysql_datadir;
> fi
> if [ -z $OCF_RESKEY_mysql_user ]; then
> user=$MYSQL_USER;
> else
> user=$OCF_RESKEY_mysql_user;
> fi
> if [ -z $OCF_RESKEY_mysql_group ]; then
> group=$MYSQL_GROUP;
> else
> group=$OCF_RESKEY_mysql_group;
> fi
> if [ -z $OCF_RESKEY_mysql_test_table ]; then
> test_table=$MYSQL_TEST_TABLE;
> else
> test_table=$OCF_RESKEY_mysql_test_table;
> fi
> if [ ! -z $OCF_RESKEY_mysql_test_user ]; then
> test_user=$OCF_RESKEY_mysql_test_user;
> fi
> if [ ! -z $OCF_RESKEY_mysql_test_passwd ]; then
> test_passwd=$OCF_RESKEY_mysql_test_passwd;
> fi
>
> # What kind of method was invoked?
> case "$1" in
>
> start) mysql_start $config $datadir $user $group
> exit $?;;
>
> stop) mysql_stop
> exit $?;;
>
> status) mysql_status
> exit $?;;
>
> monitor) mysql_monitor $test_table $test_user $test_passwd
> exit $?;;
>
> validate-all) validate_all
> exit $?;;
>
> meta-data) meta_data
> exit $OCF_SUCCESS;;
> *) usage
> exit $OCF_ERR_UNIMPLEMENTED;;
> esac
>
>
> _______________________________________________________
> Linux-HA-Dev: Linux-HA-Dev at lists.linux-ha.org
> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
> Home Page: http://linux-ha.org/
>
>
>
More information about the Linux-HA-Dev
mailing list