Статьи

Скрипт для управления MaxScale


MaxScale 1.0 от
SkySQL сейчас находится в бета-версии, и в нем есть несколько интересных функций, я думаю, некоторые предприимчивые люди уже запустили его в производство. Есть еще некоторые грубые края и вещи, которые нужно исправить, но это явно близко к GA. Однако не хватает одной вещи — это то, что управляет запуском и остановкой MaxScale в некоторой контролируемой манере, о чем и рассказывается в этом блоге.

Я разработал два простых скрипта, которые должны помочь вам разумно управлять MaxScale, но прежде чем мы перейдем к реальным скриптам, я должен сказать вам несколько вещей. Для начала, если вы еще не загрузили бета-версию MaxScale 1.0, вы можете получить ее с MariaDB.com , просто зайдите на Resources-> MaxScale и перейдите к загрузкам, которые вам сначала необходимо зарегистрировать (это бесплатно). Вот загрузки для rpms и исходного кода, но если вы в настоящее время ищете тарбол, то, похоже, его нет, ну, на самом деле, первая ссылка под «Source Tarball» на самом деле представляет собой бинарный тарбол. Я сообщил об этом, поэтому к тому времени, когда вы прочитаете это, это могло быть исправлено. Конечно, вы всегда можете получить исходный код из github и собрать его самостоятельно.

В любом случае, для запуска MaxScale вам нужен файл конфигурации, и вы должны установить домашний каталог MaxScale. Если вы используете CentOS или RedHat и устанавливаете rpms (именно так я и настроил нас), MaxScale устанавливается в / usr / local / skysql / maxscale, и это также то, что MAXSCALE_HOME необходимо установить. MaxScale может принимать аргумент файла конфигурации, но если он не передан, будет использоваться MAXSCALE_HOME / etc / MaxScale.cnf. Кроме того, вам, вероятно, придется добавить MAXSCALE_HOME / lib в переменную LD_LIBRARY_PATH.

В общем, есть некоторые переменные окружения, которые нужно установить, прежде чем мы сможем запустить MaxScale, и это работа первого скрипта, maxenv.sh . Чтобы это работало, его нужно поместить в каталог bin в MAXSCALE_HOME. В этом сценарии мы также устанавливаем MAXSCALE_USER, и он используется сценарием запуска / остановки MaxScale, который будет объяснен позже, и это пользователь linux, который будет запускать MaxScale. Вы можете установить это в пустую строку для запуска maxscale в качестве текущего пользователя, что является нормальным способом запуска MaxScale, но в этом случае вам нужно убедиться, что у данного пользователя есть доступ на запись к MAXSCALE_HOME и его подкаталогам.

Итак, здесь мы имеем дело с maxenv.sh , и вы можете скопировать его в каталог bin в вашем каталоге MAXSCALE_HOME и использовать его вот так (обратите внимание, что я установил для пользователя запуск MaxScale на mysql, так что если у вас нет этого пользователя, затем создайте его или измените maxenv.sh соответственно):

#!/bin/bash
#
export MAXSCALE_HOME=$(cd `dirname ${BASH_SOURCE[0]}`/..; pwd)
export MAXSCALE_USER=mysql
PATH=$PATH:$MAXSCALE_HOME/bin
# Add MaxScale lib directory to LD_LIBRARY_PATH, unless it is already there.
if [ `echo $LD_LIBRARY_PATH | awk -v RS=: '{print $0}' | grep -c "^$MAXSCALE_HOME/lib$"` -eq 0 ]; then
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MAXSCALE_HOME/lib
fi
export MAXSCALE_PIDFILE=$MAXSCALE_HOME/log/maxscale.pid

Теперь пришло время для maxctl , который является скриптом, который запускает и останавливает MaxScale, и он также должен быть помещен в каталог MAXSCALE_HOME / bin , и обратите внимание, что этот скрипт опирается на maxenv.sh выше, поэтому для использования maxctl вам также нужен maxenv. Ш, как указано выше. Сценарий довольно длинный, но в любом случае, возможно, чего-то не хватает, но для меня это было полезно:

#!/bin/bash
#
# Script to start and stop MaxScale.
#
# Set up the environment
. $(cd `dirname $0`; pwd -P)/maxenv.sh
# Set default variables
NOWAIT=0
HELP=0
QUIET=0
MAXSCALE_PID=0
# Get pid of MaxScale if it is running.
# Check that the pidfile exists.
if [ -e $MAXSCALE_PIDFILE ]; then
  MAXSCALE_PID=`cat $MAXSCALE_PIDFILE`
# Check if the process is running.
  if [ `ps --no-heading -p $MAXSCALE_PID | wc -l` -eq 0 ]; then
  MAXSCALE_PID=0
  fi
fi
# Function to print output
printmax() {
  if [ $QUIET -eq 0 ]; then
  echo $* >&2
  fi
}
# Function to print help
helpmax() {
  echo "Usage: $0 start|stop|status|restart"
  echo "Options:"
  echo "-f - MaxScale config file"
  echo "-h - Show this help"
  echo "-n - Don't wait for operation to finish before exiting"
  echo "-q - Quiet operation"
}


# Function to start maxscale
startmax() {
# Check if MaxScale is already running.
  if [ $MAXSCALE_PID -ne 0 ]; then
  printmax "MaxScale is already running"
  exit 1
  fi

# Check that we are running as root if a user to run as is specified.
  if [ "x$MAXSCALE_USER" != "x" -a `id -u` -ne 0 ]; then
  printmax "$0 must be run as root"
  exit 1
  fi

# Check that we can find maxscale
  if [ ! -e $MAXSCALE_HOME/bin/maxscale ]; then
  printmax "Cannot find MaxScale executable ($MAXSCALE_HOME/bin/maxscale)"
  exit 1
  fi

# Check that the config file exists, if specified.
  if [ "x$MAXSCALE_CNF" != "x" -a ! -e "$MAXSCALE_CNF" ]; then
  printmax "MaxScale configuration file ($MAXSCALE_CNF) not found"
  exit 1
  fi

# Start MaxScale
  if [ "x$MAXSCALE_USER" == "x" ]; then
  $MAXSCALE_HOME/bin/maxscale -c $MAXSCALE_HOME ${MAXSCALE_CNF:+-f $MAXSCALE_CNF}
  else
  su $MAXSCALE_USER -m -c "$MAXSCALE_HOME/bin/maxscale -c $MAXSCALE_HOME ${MAXSCALE_CNF:+-f $MAXSCALE_CNF}"
  fi
}


# Function to stop maxscale
stopmax() {
  NOWAIT=1
  if [ "x$1" == "-n" ]; then
  NOWAIT=0
  fi

# Check that we are running as root if a user to run as is specified.
  if [ "x$MAXSCALE_USER" != "x" -a `id -u` -ne 0 ]; then
  printmax "$0 must be run as root"
  exit 1
  fi

# Check that the pidfile exists.
  if [ ! -e $MAXSCALE_PIDFILE ]; then
  printmax "Can't find MaxScale pidfile ($MAXSCALE_PIDFILE)"
  exit 1
  fi
  MAXSCALE_PID=`cat $MAXSCALE_PIDFILE`

# Kill MaxScale
  kill $MAXSCALE_PID

  if [ $NOWAIT -ne 0 ]; then
# Wait for maxscale to die.
  while [ `ps --no-heading -p $MAXSCALE_PID | wc -l` -ne 0 ]; do
  usleep 100000
  done
  MAXSCALE_PID=0
  fi
}


# Function to show the status of MaxScale
statusmax() {
# Check that the pidfile exists.
  if [ $MAXSCALE_PID -ne 0 ]; then
  printmax "MaxScale is running (pid: $MAXSCALE_PID user: `ps -p $MAXSCALE_PID --no-heading -o euser`)"
  exit 0
  fi
  printmax "MaxScale is not running"
  exit 1
}

# Process options.
while getopts ":f:hnq" OPT; do
  case $OPT in
  f)
  MAXSCALE_CNF=$OPTARG
  ;;
  h)
  helpmax
  exit 0
  ;;
  n)
  NOWAIT=1
  ;;
  q)
  QUIET=1
  ;;
  \?)
  echo "Invalid option: -$OPTARG"
  ;;
  esac
done

# Process arguments following options.
shift $((OPTIND - 1))
OPER=$1

# Check that an operation was passed
if [ "x$1" == "x" ]; then
  echo "$0: your must enter an operation: start|stop|restart|status" >&2
  exit 1
fi


# Handle the operations.
case $OPER in
  start)
  startmax
  ;;
  stop)
  stopmax
  ;;
  status)
  statusmax
  ;;
  restart)
  if [ $MAXSCALE_PID -ne 0 ]; then
  NOWAITSAVE=$NOWAIT
  NOWAIT=0
  stopmax
  NOWAIT=$NOWAITSAVE
  fi
  startmax
  ;;
  *)
  echo "Unknown operation: $OPER. Use start|stop|restart|status"
  exit 1
esac

Чтобы использовать этот скрипт, вы вызываете его с помощью одной из 4 основных операций: запуск, остановка, перезапуск или состояние. Если вы хотите запускать от имени определенного пользователя, вы можете запустить его от имени root (или использовать sudo):

 sudo /usr/local/skysql/maxscale/maxctl start

Также есть несколько вариантов, которые вы можете передать:

  • -h — Распечатать справку
  • -f — запускать с файлом конфигурации spcified вместо MAXSCALE_HOME / etc / MaxScale.cnf
  • -n — Не хочу, чтобы остановка закончилась до возвращения. Остановка MaxScale путем отправки SIGTERM — вот как это сделать, но для полной остановки MaxScale требуется короткое время. По умолчанию maxctl будет ждать, пока MaxScale не будет остановлен, прежде чем вернуться, передав эту опцию, MaxScale немедленно вернется.
  • -q — Тихая операция

/ Karlsson