dba551a518
Fix below linters errors E010 The "do" should be on same line as for E010 The "do" should be on same line as while E011 Then keyword is not on same line as if or elif keyword E020 Function declaration not in format ^function name {$ Ignore: E041 Arithmetic expansion using $[ is deprecated for $(( E042 local declaration hides errors E043 Arithmetic compound has inconsistent return semantics E044 Use [[ for non-POSIX comparisions Story: 2003366 Task: 24423 Change-Id: I8b6b72e702d3e89d1813772d6bf16819e28e818c Signed-off-by: Martin Chen <haochuan.z.chen@intel.com>
89 lines
3.3 KiB
Bash
89 lines
3.3 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Script to make a proxy (ie HAProxy) capable of monitoring Galera cluster nodes properly
|
|
#
|
|
# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
|
|
# Author: Raghavendra Prabhu <raghavendra.prabhu@percona.com>
|
|
# Author: Ryan O'Hara <rohara@redhat.com>
|
|
#
|
|
# Documentation and download: https://github.com/olafz/percona-clustercheck
|
|
#
|
|
# Based on the original script from Unai Rodriguez
|
|
#
|
|
|
|
if [ -f @INSTALL_SYSCONFDIR@/sysconfig/clustercheck ]; then
|
|
. @INSTALL_SYSCONFDIR@/sysconfig/clustercheck
|
|
fi
|
|
|
|
MYSQL_USERNAME="${MYSQL_USERNAME-clustercheckuser}"
|
|
MYSQL_PASSWORD="${MYSQL_PASSWORD-clustercheckpassword!}"
|
|
MYSQL_HOST="${MYSQL_HOST:-127.0.0.1}"
|
|
MYSQL_PORT="${MYSQL_PORT:-3306}"
|
|
ERR_FILE="${ERR_FILE:-/dev/null}"
|
|
AVAILABLE_WHEN_DONOR=${AVAILABLE_WHEN_DONOR:-0}
|
|
AVAILABLE_WHEN_READONLY=${AVAILABLE_WHEN_READONLY:-1}
|
|
DEFAULTS_EXTRA_FILE=${DEFAULTS_EXTRA_FILE:-@INSTALL_SYSCONFDIR@/my.cnf}
|
|
|
|
#Timeout exists for instances where mysqld may be hung
|
|
TIMEOUT=10
|
|
|
|
if [[ -r $DEFAULTS_EXTRA_FILE ]];then
|
|
MYSQL_CMDLINE="mysql --defaults-extra-file=$DEFAULTS_EXTRA_FILE -nNE \
|
|
--connect-timeout=$TIMEOUT \
|
|
--user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} \
|
|
--host=${MYSQL_HOST} --port=${MYSQL_PORT}"
|
|
else
|
|
MYSQL_CMDLINE="mysql -nNE --connect-timeout=$TIMEOUT \
|
|
--user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} \
|
|
--host=${MYSQL_HOST} --port=${MYSQL_PORT}"
|
|
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
|
|
# Galera 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: 35\r\n"
|
|
echo -en "\r\n"
|
|
echo -en "Galera cluster node is read-only.\r\n"
|
|
sleep 0.1
|
|
exit 1
|
|
fi
|
|
fi
|
|
# Galera 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: 32\r\n"
|
|
echo -en "\r\n"
|
|
echo -en "Galera cluster node is synced.\r\n"
|
|
sleep 0.1
|
|
exit 0
|
|
else
|
|
# Galera 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: 36\r\n"
|
|
echo -en "\r\n"
|
|
echo -en "Galera cluster node is not synced.\r\n"
|
|
sleep 0.1
|
|
exit 1
|
|
fi
|