
The galera cluster rely on WSREP for cluster consistency. While the default MySQL monitor will allow us to know when the database node is minimally functional it does not provide the ability to query the node state allowing loadbalancers, operators, and deployers to know a node is healthy prior to being allowed to accept connections. This change implements the checkcluster script as provided by the fine folks at Percona. The implementation of this check follows the guild-lines noted here [0]. With this in-place, we'll be able to convert our haproxy check for the galera cluster nodes to use an HTTP check on port 9200 instead of the default MySQL login which will provide for a more robust and fault tolerant cluster. [0] https://www.percona.com/doc/percona-xtradb-cluster/LATEST/howtos/virt_sandbox.html Closes-Bug: #1665667 Change-Id: Ie1b3b9724dd33de1d90634166e585ecceb1f4c96 Signed-off-by: Kevin Carter <kevin.carter@rackspace.com>
111 lines
3.7 KiB
Django/Jinja
111 lines
3.7 KiB
Django/Jinja
#!/bin/bash
|
|
#
|
|
# Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly
|
|
#
|
|
# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
|
|
# Author: Raghavendra Prabhu <raghavendra.prabhu@percona.com>
|
|
#
|
|
# Documentation and download: https://github.com/olafz/percona-clustercheck
|
|
#
|
|
# Based on the original script from Unai Rodriguez
|
|
#
|
|
|
|
# {{ ansible_managed }}
|
|
|
|
if [[ $1 == '-h' || $1 == '--help' ]];then
|
|
echo "Usage: $0 <user> <pass> <available_when_donor=0|1> <log_file> <available_when_readonly=0|1> <defaults_extra_file>"
|
|
exit
|
|
fi
|
|
|
|
# if the disabled file is present, return 503. This allows
|
|
# admins to manually remove a node from a cluster easily.
|
|
if [ -e "/var/tmp/clustercheck.disabled" ]; then
|
|
# Shell return-code is 1
|
|
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
|
|
echo -en "Content-Type: text/plain\r\n"
|
|
echo -en "Connection: close\r\n"
|
|
echo -en "Content-Length: 51\r\n"
|
|
echo -en "\r\n"
|
|
echo -en "Percona XtraDB Cluster Node is manually disabled.\r\n"
|
|
sleep 0.1
|
|
exit 1
|
|
fi
|
|
|
|
MYSQL_USERNAME="${1-{{ galera_monitoring_user }}}"
|
|
MYSQL_PASSWORD="${2-{{ galera_monitoring_user_password }}}"
|
|
AVAILABLE_WHEN_DONOR=${3:-0}
|
|
ERR_FILE="${4:-/dev/null}"
|
|
AVAILABLE_WHEN_READONLY=${5:-1}
|
|
DEFAULTS_EXTRA_FILE=${6:-/etc/my.cnf}
|
|
|
|
#Timeout exists for instances where mysqld may be hung
|
|
TIMEOUT=10
|
|
|
|
EXTRA_ARGS=""
|
|
if [[ -n "$MYSQL_USERNAME" ]]; then
|
|
EXTRA_ARGS="$EXTRA_ARGS --user=${MYSQL_USERNAME}"
|
|
fi
|
|
|
|
if [[ -n "$MYSQL_PASSWORD" ]]; then
|
|
EXTRA_ARGS="$EXTRA_ARGS --password=${MYSQL_PASSWORD}"
|
|
else
|
|
EXTRA_ARGS="$EXTRA_ARGS --password="
|
|
fi
|
|
|
|
if [[ -r $DEFAULTS_EXTRA_FILE ]]; then
|
|
MYSQL_CMDLINE="mysql --defaults-extra-file=$DEFAULTS_EXTRA_FILE -nNE --connect-timeout=$TIMEOUT \
|
|
${EXTRA_ARGS}"
|
|
else
|
|
MYSQL_CMDLINE="mysql -nNE --connect-timeout=$TIMEOUT ${EXTRA_ARGS}"
|
|
fi
|
|
|
|
#
|
|
# Perform the query to check the wsrep_local_state
|
|
#
|
|
WSREP_STATUS=$($MYSQL_CMDLINE -e "SHOW STATUS LIKE 'wsrep_local_state';" \
|
|
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
|
|
|
|
if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]; then
|
|
# Check only when set to 0 to avoid latency in response.
|
|
if [[ $AVAILABLE_WHEN_READONLY -eq 0 ]];then
|
|
READ_ONLY=$($MYSQL_CMDLINE -e "SHOW GLOBAL VARIABLES LIKE 'read_only';" \
|
|
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
|
|
|
|
if [[ "${READ_ONLY}" == "ON" ]];then
|
|
# Percona XtraDB Cluster node local state is 'Synced', but it is in
|
|
# read-only mode. The variable AVAILABLE_WHEN_READONLY is set to 0.
|
|
# => return HTTP 503
|
|
# Shell return-code is 1
|
|
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
|
|
echo -en "Content-Type: text/plain\r\n"
|
|
echo -en "Connection: close\r\n"
|
|
echo -en "Content-Length: 43\r\n"
|
|
echo -en "\r\n"
|
|
echo -en "Percona XtraDB Cluster Node is read-only.\r\n"
|
|
sleep 0.1
|
|
exit 1
|
|
fi
|
|
fi
|
|
# Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200
|
|
# Shell return-code is 0
|
|
echo -en "HTTP/1.1 200 OK\r\n"
|
|
echo -en "Content-Type: text/plain\r\n"
|
|
echo -en "Connection: close\r\n"
|
|
echo -en "Content-Length: 40\r\n"
|
|
echo -en "\r\n"
|
|
echo -en "Percona XtraDB Cluster Node is synced.\r\n"
|
|
sleep 0.1
|
|
exit 0
|
|
else
|
|
# Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503
|
|
# Shell return-code is 1
|
|
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
|
|
echo -en "Content-Type: text/plain\r\n"
|
|
echo -en "Connection: close\r\n"
|
|
echo -en "Content-Length: 44\r\n"
|
|
echo -en "\r\n"
|
|
echo -en "Percona XtraDB Cluster Node is not synced.\r\n"
|
|
sleep 0.1
|
|
exit 1
|
|
fi
|