Введение: зачем нужна отказоустойчивость Linux-сервера
Отказоустойчивость Linux-сервера - это способность системы продолжать работу при сбое отдельных компонентов: службы, сетевого кабеля, жесткого диска или зависания ядра. Каждый час простоя оборачивается потерей денег, репутации и данных. Практика показывает: базовые меры резервирования сокращают незапланированные остановки с часов до минут, а часто и до нуля.
В этом руководстве разобраны четыре уровня защиты. Первый - автоматический перезапуск сбойных служб через systemd. Второй - аппаратный watchdog-таймер для перезагрузки полностью зависшего сервера. Третий - резервирование сетевых интерфейсов через bonding и дисковых массивов через RAID. Четвертый - централизованное логирование и оповещения, чтобы вы узнавали об инциденте раньше пользователей. Все команды и конфигурации проверены на Ubuntu 22.04/24.04 и Debian 12, но принципы применимы к любому современному дистрибутиву с systemd.
Если вы проектируете инфраструктуру с нуля, начните с общих принципов отказоустойчивости информационных систем: там разобраны метрики uptime, RTO, RPO и схемы резервирования. Здесь же фокус на практической настройке конкретного Linux-сервера.
Автоматический перезапуск служб с помощью systemd
systemd - системный менеджер, который управляет службами, монтированием, таймерами и журналами. Его встроенный механизм перезапуска закрывает самый частый сценарий отказа: процесс упал из-за ошибки, а сервер продолжает работать. Настроив политику перезапуска, вы убираете необходимость ручного вмешательства для типовых сбоев.
Параметры Restart и RestartSec
Параметр Restart в unit-файле определяет, при каких условиях systemd перезапустит службу. Основные значения:
- no - перезапуск отключен, значение по умолчанию;
- on-success - перезапуск только при чистом завершении с кодом 0;
- on-failure - перезапуск при ненулевом коде выхода, сигнале или таймауте;
- on-abnormal - перезапуск при сигнале, таймауте или срабатывании watchdog;
- on-watchdog - перезапуск только при срабатывании watchdog;
- on-abort - перезапуск при завершении по необработанному сигналу;
- always - перезапуск в любом случае, включая чистое завершение.
RestartSec задает паузу перед перезапуском в секундах. По умолчанию 100 мс. Для сервисов, которым нужно время на освобождение портов или завершение дочерних процессов, ставьте 2–5 секунд.
Пример для веб-сервера Nginx. Создайте drop-in файл:
sudo systemctl edit nginx.service
Добавьте:
[Service] Restart=on-failure RestartSec=3s
Для базы данных PostgreSQL, где частые перезапуски опаснее простоя, используйте более осторожную политику:
[Service] Restart=on-failure RestartSec=5s StartLimitIntervalSec=300 StartLimitBurst=3
После изменения конфигурации выполните sudo systemctl daemon-reload и sudo systemctl restart nginx.
Ограничение количества перезапусков
Бесконечный цикл «падение - перезапуск - падение» нагружает систему и маскирует первопричину. Параметры StartLimitIntervalSec и StartLimitBurst ограничивают число запусков за интервал времени. Если служба превысила лимит, systemd переводит её в состояние failed и прекращает попытки.
Конфигурация для сервиса, который должен пережить одиночный сбой, но не бесконечную петлю:
[Unit] StartLimitIntervalSec=600 StartLimitBurst=5 [Service] Restart=always RestartSec=2s
Здесь systemd разрешает 5 запусков за 10 минут. Шестой сбой за этот период оставит службу выключенной. Проверить текущую политику можно командой systemctl show nginx -p Restart -p RestartSec -p StartLimitBurst.
Аппаратный контроль: настройка watchdog-таймера
systemd перезапускает упавшие процессы, но не спасает от зависания ядра или полной потери отклика. Для этого нужен watchdog-таймер - аппаратное или программное устройство, которое перезагружает сервер, если драйвер не отправил периодический сигнал «я жив».
Проверка и включение аппаратного watchdog
Проверьте наличие устройства:
ls -l /dev/watchdog* dmesg | grep -i watchdog
Если вывод пуст, аппаратного watchdog нет. Многие серверные материнские платы и BMC (iLO, iDRAC) имеют встроенный watchdog, который нужно включить в BIOS или через IPMI. Если устройство есть, настройте systemd на его использование. В файле /etc/systemd/system.conf раскомментируйте и задайте:
RuntimeWatchdogSec=30
Значение 30 означает: systemd будет отправлять сигнал каждые 15 секунд (половина интервала). Если сигнал не придет за 30 секунд, watchdog перезагрузит сервер. После изменения выполните sudo systemctl daemon-reexec и проверьте статус через journalctl -b | grep -i watchdog.
Использование программного watchdog
Для систем без аппаратного watchdog есть модуль ядра softdog. Он эмулирует устройство и перезагружает систему при зависании пользовательского пространства, но не защищает от сбоев самого ядра. Загрузите модуль:
sudo modprobe softdog sudo systemctl enable watchdog
Настройте демон watchdog в /etc/watchdog.conf:
watchdog-device = /dev/watchdog interval = 10 realtime = yes priority = 1
Программный watchdog - запасной вариант. Для продакшена предпочтителен аппаратный: он перезагрузит сервер даже при полном зависании ядра.
Резервирование сетевых интерфейсов: bonding
Отказ одного сетевого кабеля или порта коммутатора не должен обрывать соединение. Bonding объединяет два и более физических интерфейса в один логический. При обрыве одного канала трафик автоматически переходит на резервный.
Выбор режима bonding
Три режима покрывают большинство сценариев:
- active-backup - один интерфейс активен, остальные в резерве. Простое резервирование без требований к коммутатору. Подходит для большинства серверов;
- balance-rr - пакеты распределяются по кругу между интерфейсами. Увеличивает пропускную способность, но требует поддержки на коммутаторе и может вызывать переупорядочивание пакетов;
- 802.3ad (LACP) - агрегация каналов по стандарту IEEE. Требует настройки LACP на коммутаторе. Дает и резервирование, и увеличение пропускной способности.
Для типового веб-сервера или сервера приложений выбирайте active-backup: минимальные требования, максимальная совместимость.
Настройка bonding в Ubuntu/Debian
В Ubuntu 22.04 и новее используется netplan. Создайте или отредактируйте файл /etc/netplan/01-bonding.yaml:
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: no
eno2:
dhcp4: no
bonds:
bond0:
interfaces: [eno1, eno2]
parameters:
mode: active-backup
primary: eno1
mii-monitor-interval: 100
addresses: [192.168.1.50/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]Примените конфигурацию:
sudo netplan apply
Проверьте статус bond-интерфейса:
cat /proc/net/bonding/bond0
В выводе увидите активный и резервный интерфейсы. Для теста отключите кабель от активного порта и убедитесь, что трафик перешел на резервный за 1–2 секунды.
Резервирование дисковых массивов: RAID
Жесткие диски выходят из строя. RAID защищает данные от потери при отказе одного или нескольких дисков, в зависимости от уровня. Программный RAID через mdadm не требует аппаратного контроллера и работает на любом сервере.
Выбор уровня RAID
| Уровень | Минимум дисков | Отказоустойчивость | Полезная емкость |
|---|---|---|---|
| RAID 1 | 2 | 1 диск | 50% |
| RAID 5 | 3 | 1 диск | N-1 |
| RAID 10 | 4 | 1 диск в каждой паре | 50% |
RAID 1 - зеркалирование. Простой и надежный выбор для системных дисков и небольших баз данных. RAID 5 экономит место, но медленнее при записи и уязвим при восстановлении больших дисков. RAID 10 сочетает скорость и надежность, но требует минимум 4 диска.
Создание программного RAID с помощью mdadm
Установите mdadm:
sudo apt install mdadm
Создайте RAID 1 из дисков /dev/sdb и /dev/sdc:
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
Создайте файловую систему и смонтируйте:
sudo mkfs.ext4 /dev/md0 sudo mkdir /mnt/data sudo mount /dev/md0 /mnt/data
Добавьте запись в /etc/fstab для автоматического монтирования при загрузке:
/dev/md0 /mnt/data ext4 defaults 0 2
Сохраните конфигурацию массива:
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf sudo update-initramfs -u
Мониторинг и замена дисков в RAID
Проверяйте состояние массива регулярно:
cat /proc/mdstat sudo mdadm --detail /dev/md0
При отказе диска пометьте его как сбойный, удалите и добавьте новый:
sudo mdadm --manage /dev/md0 --fail /dev/sdb sudo mdadm --manage /dev/md0 --remove /dev/sdb sudo mdadm --manage /dev/md0 --add /dev/sdd
Массив начнет перестроение автоматически. Следите за прогрессом через cat /proc/mdstat. Настройте email-оповещения mdadm в /etc/mdadm/mdadm.conf через параметр MAILADDR.
Настройка логирования и оповещений
Отказоустойчивость без видимости - это работа вслепую. Логи фиксируют события, предшествующие сбою. Оповещения доставляют информацию об инциденте дежурному инженеру. Настройте оба механизма до того, как они понадобятся.
Централизованный сбор логов с rsyslog
rsyslog - стандартный демон логирования в большинстве дистрибутивов. Для отправки логов на центральный сервер создайте файл /etc/rsyslog.d/remote.conf:
module(load="imuxsock") module(load="imklog") authpriv.* @@192.168.1.100:514 *.err @@192.168.1.100:514
Символ @@ означает TCP, один @ - UDP. TCP надежнее, но медленнее. Первая строка отправляет события аутентификации, вторая - все ошибки. Перезапустите rsyslog:
sudo systemctl restart rsyslog
На принимающем сервере раскомментируйте в /etc/rsyslog.conf модули imtcp и imudp и настройте правила хранения.
Настройка оповещений о критических событиях
Для ежедневных отчетов установите logwatch:
sudo apt install logwatch
Настройте отправку отчета на email в /etc/logwatch/conf/logwatch.conf:
MailTo = admin@example.com Detail = High Range = yesterday
Для мгновенных оповещений используйте скрипт, который отслеживает логи и отправляет сообщение в Telegram. Пример для критических ошибок ядра:
#!/bin/bash
tail -n0 -F /var/log/kern.log | while read line; do
if echo "$line" | grep -qE "(I/O error|OOM|kernel panic)"; then
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="Critical kernel event: $line"
fi
doneЗапустите скрипт как systemd-службу с параметром Restart=always, чтобы он сам был отказоустойчивым.
Тестирование отказоустойчивости и возможные риски
Непроверенная конфигурация - это конфигурация, которая подведет в боевой обстановке. Тестируйте каждый уровень защиты после настройки.
Методы проверки:
- Сбой службы: выполните
sudo kill -9 $(pgrep nginx)и убедитесь, что systemd перезапустил процесс за заданное время; - Отказ сети: отключите кабель от активного интерфейса bond и проверьте, что соединение сохранилось через резервный;
- Отказ диска: на тестовом массиве пометьте диск как failed и проследите за перестроением;
- Зависание системы: на тестовом сервере вызовите
echo c > /proc/sysrq-triggerи убедитесь, что watchdog перезагрузил машину.
Риски при настройке реальны. Неправильный Restart=always для службы, которая должна завершаться, создаст бесконечный цикл. Ошибка в конфигурации netplan оставит сервер без сети. Создание RAID на диске с данными уничтожит их. Перед любыми изменениями делайте резервную копию и тестируйте на staging-окружении. Проверяйте совместимость оборудования: не все сетевые карты поддерживают bonding, не все материнские платы имеют аппаратный watchdog.
Если вы только начинаете систематизировать отказоустойчивость, изучите пошаговое руководство по проектированию отказоустойчивой архитектуры: там разобраны топологии Active-Passive, Active-Active и поиск единых точек отказа.
Заключение
Отказоустойчивость Linux-сервера складывается из четырех независимых слоев: systemd перезапускает упавшие службы, watchdog перезагружает зависший сервер, bonding и RAID резервируют сеть и диски, логирование и оповещения дают видимость. Каждый слой закрывает свой класс отказов.
Начните с systemd - это самый быстрый результат. Затем настройте логирование, чтобы видеть, что происходит. После этого переходите к bonding и RAID, если сервер обрабатывает критичные данные или трафик. Watchdog настройте в последнюю очередь, но не пропускайте его: он единственный спасает от полного зависания ядра.
Для комплексной защиты сервера совместите эти меры с практическим hardening и аудитом безопасности Linux. Отказоустойчивость и безопасность работают вместе: защищенный сервер реже падает, а отказоустойчивый - быстрее восстанавливается.