Аналогично тому, как мы автоматизировали процесс проверки состояния DRBD устройств, организуем публикацию AOE устройств.
Учитывая то, что публиковать мы должны только устройства корректно работающие и доступные для чтения и записи, необходимо в обязательном порядке удостоверяться в их удовлетворительном статусе, что мы будем делать с помощью утилит DRBD.
Раз уж мы ранее использовали принцип ручного формирования списка обслуживаемых DRBD устройств, то его и будем использовать в качестве перечня публикуемых блочных устройств.
Создадим скрипт проверяющие состояние DRBD устройств с определённой периодичностью на стороне отдающей, в течении работы, публикующий устройства и информирующего администратора об обнаруженных проблемах:
# touch /etc/custom/hdd/vblade/check-vblade.sh && chmod ugo+x /etc/custom/hdd/vblade/check-vblade.sh
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
# INTERFACE="eth0"
INTERFACE="bond0"
OBJECTS=`cat /etc/custom/hdd/drbd/list`
# Определяем исходные параметры для формирования индекса публикуемого блочного устройства (RACK - условный номер компьютера в списке задействованных в схеме, а SLOT - условный номер (начинается с нуля) диска в списке публикуемых с этого компьютера)
RACK="0"
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL=`cat /etc/custom/hdd/email`
mkdir -p /tmp/custom/vblade
# Определяем функцию уведомления администратора о нештатном развитии ситуации
function send-report() {
local LOCAL_OBJECT=$1
local LOCAL_REPORT=$2
# Посылаем электронное письмо с уведомлением о проблеме
echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Warning AoE: ${HOSTNAME}: /dev/${LOCAL_OBJECT}\n${DATE}.\nHost: ${HOSTNAME}.\nDevice: /dev/${LOCAL_OBJECT}.\n${LOCAL_REPORT}" | sendmail -F${HOSTNAME} ${EMAIL}
}
# Проверяем, не установлены ли флаги блокировки от текущего уровня схемы
if [ -e /tmp/custom/vblade/lock ]
then
exit 0
fi
# Устанавливаем флаг блокировки на время работы скрипта
touch /tmp/custom/vblade/lock
# Перебираем в цикле все наши публикуемые (экспортируемые) блочные устройства
for OBJECTIVE in ${OBJECTS}
do
# Получаем в переменную имя устройства
OBJECT=`echo ${OBJECTIVE} | awk -F / '{print $1}'`
# Применяем к переменной условный индекс "SLOT", исходя из именования DRBD-устройства (пример: "drdb0" => "0")
SLOT=`echo "${OBJECT}" | cut -c 5-`
# Проверяем наличие публикуемого блочного устройства
if [ "`ls -l /dev/ | grep -i brw | grep -i ${OBJECT}`" != "" ]
then
# Проверяем, доступно ли DRBD устройство для полноценного использования локально
if [ "`drbdadm dstate ${OBJECT} 2>/dev/null | awk -F / '{print $1}'`" = "UpToDate" ]
then
# Выясняем, какая в действительности роль назначена локальному устройству
ROLE="`drbdadm state ${OBJECT} | awk -F / '{print $1}' | tr A-Z a-z`"
if [ ${ROLE} = "primary" ]
then
# Проверяем, опубликовано ли блочное устройство
if [ "`ps wax | grep -i vblade | grep -i ${RACK} | grep -i ${SLOT} | grep -i ${INTERFACE} | grep -i /dev/${OBJECT}`" = "" ]
then
# Публикуем AoE устройство
echo "Waiting 10 seconds for correct publication /dev/${OBJECT} as AoE resource e${RACK}.${SLOT}..."
vblade ${RACK} ${SLOT} ${INTERFACE} /dev/${OBJECT} &
sleep 10
# Проверяем успешность публикации
if [ "`ps wax | grep -i vblade | grep -i ${RACK} | grep -i ${SLOT} | grep -i ${INTERFACE} | grep -i /dev/${OBJECT}`" = "" ]
then
# Огорчаемся неудаче
send-report ${OBJECT} "Panic! Блочное устройство не было опубликовано или опубликовано некорректно."
echo >&2 "Panic! Блочное устройство /dev/${OBJECT} не было опубликовано или опубликовано некорректно."
fi
fi
else
# Проверяем, не опубликовано ли блочное устройство
PID="`ps wax | grep -i vblade | grep -i /dev/${OBJECT} | awk '{print $1}'`"
if [ "${PID}" != "" ]
then
# Останавливаем публикацию блочного устройства, сменившего статус на secondary
kill -KILL `echo ${PID}`
fi
fi
fi
fi
done
# Удаляем флаг блокировки во время исполнения
rm --force /tmp/custom/vblade/lock
exit 0
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
# INTERFACE="eth0"
INTERFACE="bond0"
OBJECTS=`cat /etc/custom/hdd/drbd/list`
# Определяем исходные параметры для формирования индекса публикуемого блочного устройства (RACK - условный номер компьютера в списке задействованных в схеме, а SLOT - условный номер (начинается с нуля) диска в списке публикуемых с этого компьютера)
RACK="0"
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL=`cat /etc/custom/hdd/email`
mkdir -p /tmp/custom/vblade
# Определяем функцию уведомления администратора о нештатном развитии ситуации
function send-report() {
local LOCAL_OBJECT=$1
local LOCAL_REPORT=$2
# Посылаем электронное письмо с уведомлением о проблеме
echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Warning AoE: ${HOSTNAME}: /dev/${LOCAL_OBJECT}\n${DATE}.\nHost: ${HOSTNAME}.\nDevice: /dev/${LOCAL_OBJECT}.\n${LOCAL_REPORT}" | sendmail -F${HOSTNAME} ${EMAIL}
}
# Проверяем, не установлены ли флаги блокировки от текущего уровня схемы
if [ -e /tmp/custom/vblade/lock ]
then
exit 0
fi
# Устанавливаем флаг блокировки на время работы скрипта
touch /tmp/custom/vblade/lock
# Перебираем в цикле все наши публикуемые (экспортируемые) блочные устройства
for OBJECTIVE in ${OBJECTS}
do
# Получаем в переменную имя устройства
OBJECT=`echo ${OBJECTIVE} | awk -F / '{print $1}'`
# Применяем к переменной условный индекс "SLOT", исходя из именования DRBD-устройства (пример: "drdb0" => "0")
SLOT=`echo "${OBJECT}" | cut -c 5-`
# Проверяем наличие публикуемого блочного устройства
if [ "`ls -l /dev/ | grep -i brw | grep -i ${OBJECT}`" != "" ]
then
# Проверяем, доступно ли DRBD устройство для полноценного использования локально
if [ "`drbdadm dstate ${OBJECT} 2>/dev/null | awk -F / '{print $1}'`" = "UpToDate" ]
then
# Выясняем, какая в действительности роль назначена локальному устройству
ROLE="`drbdadm state ${OBJECT} | awk -F / '{print $1}' | tr A-Z a-z`"
if [ ${ROLE} = "primary" ]
then
# Проверяем, опубликовано ли блочное устройство
if [ "`ps wax | grep -i vblade | grep -i ${RACK} | grep -i ${SLOT} | grep -i ${INTERFACE} | grep -i /dev/${OBJECT}`" = "" ]
then
# Публикуем AoE устройство
echo "Waiting 10 seconds for correct publication /dev/${OBJECT} as AoE resource e${RACK}.${SLOT}..."
vblade ${RACK} ${SLOT} ${INTERFACE} /dev/${OBJECT} &
sleep 10
# Проверяем успешность публикации
if [ "`ps wax | grep -i vblade | grep -i ${RACK} | grep -i ${SLOT} | grep -i ${INTERFACE} | grep -i /dev/${OBJECT}`" = "" ]
then
# Огорчаемся неудаче
send-report ${OBJECT} "Panic! Блочное устройство не было опубликовано или опубликовано некорректно."
echo >&2 "Panic! Блочное устройство /dev/${OBJECT} не было опубликовано или опубликовано некорректно."
fi
fi
else
# Проверяем, не опубликовано ли блочное устройство
PID="`ps wax | grep -i vblade | grep -i /dev/${OBJECT} | awk '{print $1}'`"
if [ "${PID}" != "" ]
then
# Останавливаем публикацию блочного устройства, сменившего статус на secondary
kill -KILL `echo ${PID}`
fi
fi
fi
fi
done
# Удаляем флаг блокировки во время исполнения
rm --force /tmp/custom/vblade/lock
exit 0
Понятно, что вышеприведённый скрипт будут публиковать устройства так редко, как будет перезапускаться операционная система или будут вводиться в строй новые диски, все остальные периодические запуски будут лишь проверять изменения состояния. Размещаем команды запуска скриптов в таблице /etc/crontab:
# vi /etc/crontab
....
*/15 * * * * root /etc/custom/hdd/vblade/check-vblade.sh &
....
*/15 * * * * root /etc/custom/hdd/vblade/check-vblade.sh &
....
Переход к настройке контроля за импортом блочных устройств AoE.