В кластере хранения и в HA-узлах две вещи ломаются чаще остального: диск и сетевой линк. Этот урок решает задачу администратора - сделать так, чтобы отказ одного диска или одного провода не уронил сервис. На стороне хранения мы разберём снимки и тонкие тома LVM, встроенный LVM RAID (зеркала и parity) и восстановление после сбоя. На стороне сети - объединение интерфейсов (bonding), VLAN поверх бонда, избыточные аплинки и отказоустойчивую маршрутизацию через BGP и multipath. Цель - убрать единые точки отказа (SPOF) сверху донизу.

Как это работает
LVM - это слой между физическими дисками (PV), общим котлом ёмкости (VG) и логическими томами (LV). Снимок (snapshot) фиксирует состояние тома на момент времени по принципу copy-on-write: перед перезаписью исходного блока старая версия копируется в область снимка. Классический снимок имеет фиксированный размер, и если запись переполнит его, он инвалидируется. Поэтому в 2026 для бэкапов и клонов используют тонкие снимки.
Тонкие тома (thin) живут в пуле (thin pool). Пул выделяет блоки по факту записи, а не заранее, поэтому сумма размеров томов может превышать физическую ёмкость (overprovisioning). Тонкий снимок не требует отдельного резерва и берёт блоки из того же пула - снимок дешёвый, можно делать их пачками. Расплата - надо следить за заполнением пула, иначе запись встанет.
LVM RAID - это RAID, реализованный самим LVM поверх ядерного таргета dm-raid (тот же движок, что и mdraid, но управляется через lvm). Уровни: raid1 (зеркало), raid5/raid6 (parity), raid10. Метаданные о синхронизации хранит отдельный mirror log или встроенные субтома _rmeta. Это удобнее, чем mdadm плюс LVM сверху, потому что всё описывается одной командой и одной точкой управления.
Bonding объединяет несколько NIC в один логический интерфейс bond0. Режим active-backup держит один линк активным, остальные в горячем резерве - простая защита от обрыва провода или смерти порта коммутатора, не требует поддержки на свитче. Режим 802.3ad (LACP, mode 4) агрегирует линки в один канал с балансировкой и требует настроенного LACP на коммутаторе - даёт и отказоустойчивость, и суммарную полосу. VLAN (802.1Q) режет физическую сеть на изолированные сегменты тегами; в Linux это интерфейс bond0.100 поверх бонда.
Выше уровня L2 SPOF убирают маршрутизацией. ECMP/multipath - это несколько равноценных маршрутов до цели, трафик раскладывается по ним, при падении одного остальные подхватывают. BGP на хосте (через FRR) позволяет узлу анонсировать свой сервисный адрес сразу нескольким роутерам - падает узел, маршрут отзывается, трафик уходит на живую реплику.
Команды и примеры
Установка LVM. Debian/Ubuntu:
Код: Выделить всё
apt update && apt install -y lvm2 thin-provisioning-toolsКод: Выделить всё
dnf install -y lvm2 device-mapper-persistent-dataКод: Выделить всё
# создать тонкий пул на 50G из свободного места VG
lvcreate --type thin-pool -L 50G -n tpool vgdata
# тонкий том 200G (overprovisioning - физически пула только 50G)
lvcreate --type thin -V 200G --thinpool tpool -n app vgdata
# мгновенный тонкий снимок тома app
lvcreate --type thin -s vgdata/app -n app_snap
# следить за заполнением пула: Data% и Meta%
lvs -o lv_name,data_percent,metadata_percent vgdataКод: Выделить всё
thin_pool_autoextend_threshold = 80
thin_pool_autoextend_percent = 20Код: Выделить всё
# зеркало
lvcreate --type raid1 -m 1 -L 100G -n mirror vgdata /dev/sdb /dev/sdc
# raid6 на четырёх дисках
lvcreate --type raid6 -L 300G -n parity vgdata /dev/sd{b,c,d,e}
# статус синхронизации и здоровье
lvs -a -o name,segtype,sync_percent,raid_mismatch_count,lv_health_status vgdataКод: Выделить всё
# заменить выбывший PV из зеркала
lvconvert --replace /dev/sdc vgdata/mirror /dev/sdf
# принудительно пересобрать после возврата диска
lvchange --syncaction repair vgdata/parityКод: Выделить всё
[NetDev]
Name=bond0
Kind=bond
[Bond]
Mode=active-backup
MIIMonitorSec=100ms
PrimaryReloadPolicy=alwaysТо же через NetworkManager (универсально на RHEL/Fedora):
Код: Выделить всё
nmcli con add type bond ifname bond0 bond.options "mode=802.3ad,miimon=100,lacp_rate=fast"
nmcli con add type ethernet ifname enp1s0 master bond0
nmcli con add type ethernet ifname enp2s0 master bond0
# VLAN 100 поверх бонда
nmcli con add type vlan ifname bond0.100 dev bond0 id 100Код: Выделить всё
network:
version: 2
bonds:
bond0:
interfaces: [enp1s0, enp2s0]
parameters:
mode: 802.3ad
lacp-rate: fast
mii-monitor-interval: 100
vlans:
bond0.100:
id: 100
link: bond0
addresses: [10.0.100.5/24]Multipath-маршрут (ECMP) и BGP-анонс через FRR:
Код: Выделить всё
# два равноценных next-hop
ip route add 10.20.0.0/16 nexthop via 10.0.100.1 nexthop via 10.0.100.2
# в /etc/frr/frr.conf - анонс сервисного /32 двум апстримам
router bgp 65010
neighbor 10.0.100.1 remote-as 65000
neighbor 10.0.100.2 remote-as 65000
address-family ipv4 unicast
network 10.50.0.7/32
exit-address-family- Переполнение thin-пула. Когда Data% дойдёт до 100, запись во ВСЕ тонкие тома пула встанет (или начнётся повреждение fs). Мониторьте data_percent и metadata_percent отдельно - метаданные кончаются раньше, чем кажется.
- Метаданные пула малы по умолчанию. На больших пулах их не хватает - задавайте размер явно через --poolmetadatasize при создании.
- Снимок старого образца переполняется и инвалидируется незаметно. Для бэкапов берите тонкий снимок, а не классический.
- 802.3ad без LACP на коммутаторе. Если на свитче не поднят LAG, бонд mode 4 не агрегируется - линк болтается. Для случая, когда свитч трогать нельзя, берите active-backup.
- MII-мониторинг видит только физический линк. Провод цел, а сосед молчит - active-backup не переключится. Для контроля сквозной достижимости используйте ARP-мониторинг (arp_interval/arp_ip_target).
- Бонд из портов одного коммутатора. Свитч - это SPOF. Раскидывайте линки бонда по двум свитчам (MLAG/stacking на их стороне).
- ECMP с фиксированным хешем рвёт сессии при изменении числа путей. Учитывайте, что добавление/удаление next-hop переразложит потоки.
- LVM RAID требует device-mapper-persistent-data (или thin-provisioning-tools) для проверки/ремонта - без пакета восстановление не запустится.
- Соберите VG из четырёх дисков (можно loop-устройства через losetup). Создайте тонкий пул на 2G и тонкий том на 5G - убедитесь, что overprovisioning разрешён.
- Запишите данные, сделайте тонкий снимок, удалите часть файлов в исходном томе и откатитесь к снимку через lvconvert --merge.
- Наполняйте пул, пока data_percent не подойдёт к 80, и проверьте срабатывание autoextend.
- Создайте LVM raid1 из двух PV, имитируйте отказ (vgreduce --removemissing после удаления устройства) и замените диск через lvconvert --replace.
- Поднимите bond0 в режиме active-backup на двух интерфейсах, проверьте /proc/net/bonding/bond0, затем выключите активный линк (ip link set down) и убедитесь в переключении.
- Поверх бонда заведите VLAN 100, назначьте адрес и проверьте связность.
- Добавьте два equal-cost маршрута до тестовой сети и проверьте балансировку через ip route get.
- Чем тонкий снимок отличается от классического по механике copy-on-write и расходу места?
- Какие два параметра lvs надо мониторить у thin-пула и что произойдёт при достижении 100% каждого из них?
- В каком случае bonding в режиме 802.3ad НЕ даст агрегации, и какой режим выбрать, если коммутатор настроить нельзя?
- Почему MII-мониторинга недостаточно для обнаружения некоторых сбоев и что использовать вместо/вместе с ним?
- Как восстановить LVM raid1 после физического отказа одного из дисков - какими командами?
- Как с помощью BGP на хосте убрать SPOF на уровне маршрутизации сервисного адреса?