Но все мои разделы были
зазеркалированы
Автор: Грэхем Дженкинс
(Graham Jenkins)
Перевод: Иван Песин
Эта история началась со звонка одного пользователя, когда я шел на работу в пятницу утром. Разговор был примерно следующим:
"Привет, Грэхем. Похоже, у нас проблемы с доступом к базе данных. Ты не мог бы глянуть?"
"Конечно. Я в десяти минутах от моего компьютера. Когда дойду -- перезвоню. На сервере все зазеркалировано, скорее всего какие-то логи не перенеслись на вторичное хранилище. Думаю, что все проблемы решаться в течении пяти минут."
Десять минут спустя: "Ребята, похоже это займет немного больше, чем несколько минут... Скорее, несколько часов... Похоже что умерли диски, причем как основной, так и зеркальный!"
Что же произошло? Зеркальная копия хранилась на отдельном диске, подключенном к отдельному контроллеру. И не было никаких признаков всплесков напряжения или землетрясения. Мы даже не могли обвинить ночных уборщиков в отключении питания (чтобы хватило разъемов на их пылесосы).
Ответ заключается в том, что диски вышли из строя не одновременно. В действительности, основной диск умер неделю назад *. В моей компании существует отличная служба наблюдения, которая предназначена именно для таких случаев... но мы забыли сообщить ребятам, что сервер перешел из состояния "установка/тестирование" в состояние "эксплуатация". Надеюсь, такое больше не повторится...
Несколько недель перед этим, на моем домашнем компьютере произошел второй сбой диска за шесть месяцев. Конечно, диск снова заменили по гарантии. Но именно тогда я решил зазеркалировать все данные на дополнительный диск.
Я начал размышлять: "Как же я узнаю, если раздел на моем диске выйдет из строя?" Вряд ли я смогу добавить свою домашнюю станцию в систему мониторинга моей компании.
Кто-нибудь скажет: "Проверь файл messages, прочти почту пользователя 'root'!"? Замечательная идея, ребята. Проблема в том, что у меня есть партнер, для которого "messages" означает набор заметок Post-It, а синонимом слова "email" является "Hotmail". И именно она является основным пользователем моего компьютера, когда меня нет.
Предлагаемое здесь решение, организовывает мигание лампы Scroll-Lock с десятисекундным интервалом. Если определяется нарушение функционирования системы лампа не гасится. Никакого дополнительного аппаратного обеспечения, очень просто для понимания. Итак, мы должны организовать простой watchdog, который периодически мигает, показывая что он активен, и горит, указывая на проблемы.
Как же зажечь лампу Scroll-Lock? Если вы пользуетесь Xwindows, то это очень просто: 'xset led 3' включает, 'xset -led 3' выключает лампу. Работает даже если у вас заблокирована система или выключен экран.
Если же никто не зарегистрирован в системе или вы не пользуетесь Xwindows, это работать не будет. В таком случае нужно установить программу типа 'blinker', которая входит в состав пакета "morse2led".
Вот, что можно увидеть на машине с умершим разделом в "зеркале", введя команду 'cat /proc/mdstat':
Personalities : [raid1] read_ahead 1024 sectors md2 : active raid1 hda6[0] hdb6[1](F) 1959808 blocks [2/1] [U_] md1 : active raid1 hda5[0] hdb5[1] 5863616 blocks [2/2] [UU] md0 : active raid1 hda3[1] hdb3[0] 104320 blocks [2/2] [UU] unused devices: <none>
А вот наша программа, определяющая, что что-то плохо (поиском подчеркивания в строках, содержащих слово 'blocks'), и активирующая лампочку scroll-lock, при необходимости. Она будет работать в большинстве Bourne-подобных интерпретаторах. В нее добавлены несколько дополнительных проверок на нештатные состояния **. Если вам нужны еще какие-то проверки -- добавьте их.
#!/bin/sh # ledblink System monitor. Scroll-lock light will remain on if any faults. # Graham Jenkins, IBM GSA, July 2003. PATH=/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin On=1 while : ; do # Use 'blinker' if it works, blinker -d expr $On \* 1000 s 2>/dev/null ||# else use 'xset' to flash the ( xset led 3 && sleep $On && xset -led 3 ) # scroll-lock light on and off. sleep expr 10 - $On On=10 # Set on-time to 10 seconds. # # Raid status grep blocks /proc/mdstat | grep _ >/dev/null 2>&1 && continue # # Filesystem capacity df -x iso9660 |tr -d '%'|awk '{if (NR > 1) if ($5 > 90) exit 1}' || continue # # Swap usage swapon -s | awk '{ if (NR > 1) { Size=Size+$3; Used=Used+$4 } } END { if (Used*100/Size > 70 ) exit 1 }' || continue # On=1 # If there are no problems done # reset on-time to 1 second.
Если вы хотите, чтобы 'ledblink' запускался только когда кто-то зарегистрировался в системе и открыл Xwindows сессию -- это просто. Если в вашей системе есть каталог 'xinitrc.d', просто поместите в него следующий скрипт. Если же каталога нет -- скопируйте незакомментированную строку в файл 'xinitrc'. (Речь идёт о подкаталоге '/etc/X11/xinit.d' и файле '/etc/sysconfig/xinitrc'. Прим.ред.)
#!/bin/sh # ledblink Place this file in: /usr/X11R6/lib/X11/xinit/xinitrc.d # and make it readable and executable for everyone. [ -x /usr/local/bin/ledblink ] && /usr/local/bin/ledblink &
Если у вас есть программа 'blinker', вы можете запускать 'ledblink' при загрузке таким скриптом.
#!/bin/sh # ledblink Start/stope the 'ledblink' system monitor program. # Graham Jenkins, IBM GSA, July 2003. # # chkconfig: 2345 98 7 # description: Start/stops the 'ledblink' system monitor program. case "$1" in start) if [ -x /usr/local/bin/ledblink ] ; then [ -s /var/run/ledblink.pid ] && exit 0 echo "Starting 'ledblink' system monitor program .." /usr/local/bin/ledblink & echo $! >/var/run/ledblink.pid fi ;; stop) if [ -n "cat /var/run/ledblink.pid" ] ; then echo "Stopping 'ledblink' system monitor program .." kill cat /var/run/ledblink.pid rm /var/run/ledblink.pid fi ;; esac
Грэхем -- специалист по Unix в Австралийском представительстве IBM Global Services. Он живет в Мельбурне и занимается установкой и сопровождением различных проприетарных и открытых систем на разных аппаратных платформах.
*) Мне эта ситуация напомнила другую, в которой пришлось
оказаться мне. Правда не с такими последствиями. Моя команда администраторов
забыла поставить в автозагрузку демон, который должен был проверять состояние
дисковой системы RAID. Все работало замечательно до одного прекрасного дня,
когда пользователи все как один стали жаловаться на очень медленную работу
сервера. Проведя мониторинг системы мы обнаружили, что действительно нагрузка на
дисковую систему огромна, но не могли понять причину: те же операции несколько
дней назад не вызывали такой нагрузки. Поскольку сервер работал уже достаточно
давно и надежно, подозрений на дисковую систему не было. Да и уведомлений,
которые должны были появиться при проблемах, не было (демон же был не запущен:).
В результате, оказалось, что вышел из строя один диск. Причем обнаружили путем
визуального осмотра сервера: горела соответствующая сигнальная лампа.
Назад.
**) На мой взгляд весьма интересный и полезный
скрипт. Обратите внимание на проверки свободного места в разделах и свопе.
Небольшая доработка и этот же скрипт будет вам посылать уведомления по почте.
Назад.
Copyright (с) 2003, Graham Jenkins. Copying license
http://www.linuxgazette.com/copying.html
Published
in Issue 93 of Linux Gazette, August 2003З>
Команда переводчиков:
Александр Куприн, Андрей Киселев, Александр
Михайлов, Александр Саввин, Владимир Меренков, Иван Песин, Игорь Яровинский,
Павел Соколов, Роман Шумихин, Сергей Скороходов, Юрий Прушинский
Со всеми предложениями, идеями и комментариями обращайтесь к Александру Куприну (ru_classic at mail.ru). Убедительная просьба: указывайте сразу, не возражаете ли Вы против публикации Ваших отзывов в рассылке.
Сайт рассылки: http://gazette.linux.ru.net
Эту статью
можно взять здесь: http://gazette.linux.ru.net/lg93/jenkins.graham.html
Архивы
выпусков находятся здесь: http://gazette.linux.ru.net/archive/