====== wsrep_notify_cmd ======
Mit Hilfe dieser Funktionalität, kann man auf Pacemaker+Corosync verzichten.
#!/bin/bash -e
#!/bin/bash -eu
#==============================================================================#
#
# http://www.fromdual.com/unbreakable-mysql-cluster-with-galera-and-lvs
# http://galeracluster.com/documentation-webpages/mysqlwsrepoptions.html#wsrep-notify-cmd
#
# /etc/mysql/galera_mariadb.cnf
#
# [mysqld]
# wsrep_notify_cmd = /var/lib/mysql/bin/wsrep_notify_cmd.sh
#
#==============================================================================#
#
# Warning!
#
# The node will block and wait until the script completes and returns before it
# can proceed. If the script performs any potentially blocking or long-running
# operations, such as network communication, you may wish initiate such
# operations in the background and have the script return immediately.
#
#==============================================================================#
#
# SET GLOBAL wsrep_notify_cmd='/var/lib/mysql/bin/wsrep_notify_cmd.sh';
# SHOW VARIABLES LIKE 'wsrep_notify_cmd';
#
#==============================================================================#
#MYIP=''
VERSION="v2017110800"
LOG="/var/log/mysql/wsrep_notify_cmd.log"
#ETC="/etc/mysql/conf.d/wsrep.cnf"
#ETC="/home/mysql/data/mysql-5.5-wsrep-23.7-a/my.cnf"
ETC="/etc/mysql/galera_mariadb.cnf"
DATUM_ZEIT="$(date +'%Y-%m-%d %H:%M:%S')"
echo "${DATUM_ZEIT}" >>${LOG}
echo "${0} ${@}" >>${LOG}
#------------------------------------------------------------------------------#
#regex='^.*=\s*([0-9]+.[0-9]+.[0-9]+.[0-9]+).*'
#
#str=$(grep -E "^wsrep_node_incoming_address" ${ETC} 2>>${LOG})
#
#if [[ ${str} =~ ${regex} ]] ; then
# MYIP=${BASH_REMATCH[1]}
#else
# echo "Cannot find IP address in ${str}" >>${LOG}
# exit 1
#fi
#------------------------------------------------------------------------------#
while [ "${#}" -gt "0" ] ; do
case "${1}" in
--status)
# Undefined, Joiner, Donor, Joined, Synced, Error
STATUS="$2"
shift
;;
--uuid)
# The cluster state UUID.
CLUSTER_UUID="$2"
shift
;;
--primary)
# yes, no
PRIMARY="$2"
shift
;;
--index)
# The index of this node in the node list.
INDEX="$2"
shift
;;
--members)
# eine durch Komma getrennte Liste mit UUIDs
MEMBERS="$2"
shift
;;
esac
shift
done
#------------------------------------------------------------------------------#
# echo $* >> ${LOG}
echo "
STATUS=${STATUS}
CLUSTER_UUID=${CLUSTER_UUID}
PRIMARY=${PRIMARY}
INDEX=${INDEX}
MEMBERS=${MEMBERS}
" >>${LOG}
# Undefined means node is shutting down
# Synced means node is ready again
#if [ "${STATUS}" = "Synced" -a "${PRIMARY}" = "[Yy][Ee][Ss]" ] ; then
if [ "${STATUS}" = "Synced" ] ; then
#DB_STAT="System ist bereit: ${STATUS},${PRIMARY}"
DB_STAT="System ist bereit: ${STATUS}"
else
#DB_STAT="System ist nicht bereit: ${STATUS},${PRIMARY}"
DB_STAT="System ist nicht bereit: ${STATUS}"
fi
echo "${DB_STAT}" >>${LOG}
echo "ret=$?" >>${LOG}
echo "#------------------------------------------------------------------------------#" >>${LOG}
exit 0
Die Variable ''wsrep_notify_cmd'' wird beim DB-Start nicht gesetzt, dass muss man manuell machen:
> echo "SET GLOBAL wsrep_notify_cmd='/var/lib/mysql/bin/wsrep_notify_cmd.sh'" | mysql
Um das //setzen// der Variable ''wsrep_notify_cmd'' (z.B. nach dem Restart) zu automatisieren, kann man folgendes Skript verwenden:
#!/bin/bash
#==============================================================================#
#
# mit diesem Skript wird die Variable 'wsrep_notify_cmd' in der Galera-DB
# gesetzt und anschließend der aktuelle Status gesendet
#
#==============================================================================#
VERSION="v2017110800"
WSREP_NOTIFY_CMD="/var/lib/mysql/bin/wsrep_notify_cmd.sh"
echo "
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_local_state_comment';
SHOW VARIABLES LIKE 'wsrep_notify_cmd';
" | mysql -t
echo "wsrep_notify_cmd wird gesetzt..."
echo "SET GLOBAL wsrep_notify_cmd='${WSREP_NOTIFY_CMD}'" | mysql
echo "
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_local_state_comment';
SHOW VARIABLES LIKE 'wsrep_notify_cmd';
" | mysql -t
PRIMARY="$(echo "SHOW STATUS LIKE 'wsrep_cluster_status';" | mysql -N | grep -Ev '^[ \t]*$' | awk '{print $2}')"
STATUS="$(echo "SHOW STATUS LIKE 'wsrep_local_state_comment';" | mysql -N | grep -Ev '^[ \t]*$' | awk '{print $2}')"
echo "${WSREP_NOTIFY_CMD} --primary ${PRIMARY} --status ${STATUS}"
su - mysql -s /bin/bash -c "${WSREP_NOTIFY_CMD} --primary ${PRIMARY} --status ${STATUS}"
Dieses Skript kann man in die ''/etc/rc.local'' eintragen, es muss nur sichergestellt werden, dass es erst gestartet wird, wenn die DB vollständig hochgefahren ist.
Das kann man mit den folgenden Skripten bzw. Eintragungen erreichen.
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
### wsrep_notify_cmd in Galera setzen
/root/bin/wsrep_notify_cmd_beim_boot_setzen.sh | logger -t wsrep_notify_cmd
Weil das synchronisieren per SST bei großen Galera-Datenbanken sehr lange dauern kann, sind hier 1800 Sekunden (1/2 Stunde) angegeben worden.
#!/usr/bin/env bash
MYSQL_LOGIN="--defaults-file=/root/.my.cnf"
ZAEHLER="1800"
while [ "${ZAEHLER}" -gt "0" ]
do
ZAEHLER="$(echo "${ZAEHLER}"|awk '{print $1-1}')"
if [ "$(mysqlshow ${MYSQL_LOGIN})" ] ; then
ZAEHLER="0"
/root/bin/wsrep_notify_cmd_setzen.sh
fi
sleep 1
done
damit die Platte nicht voll läuft:
# - damit die Platte nicht voll läuft
/var/log/mysql/wsrep_notify_cmd.log {
daily
rotate 7
missingok
create 640 mysql adm
compress
sharedscripts
}