Что нового в 3.0.11
До обновления: права vm-контроллера на брокере
Это единственное, что нужно сделать заранее, и пропускать это нельзя.
Контроллер vstack-vm теперь отправляет ответы клиенту через default exchange
(пустое имя) с routing_key = reply_to, а не через настроенный exchange. Так
исправлено залипание AMQP-канала. RabbitMQ проверяет такую публикацию как право
write на ресурс amq.default.
Что сделать. Проверьте, что у учётной записи vm-контроллера в vhost
vStack_VM право write покрывает и настроенный exchange, и amq.default.
Что будет, если не сделать. Там, где write сужен регулярным выражением до
имени exchange, после обновления перестанут уходить все ответы клиентам.
Команды будут выполняться, но Center не увидит ни одного ответа, и узел будет
выглядеть потерянным.
Единый кластерный слой: HCP, HA и Stretched
Три кластерные ветки, HCP, HA (пара из двух узлов) и Stretched, сведены в один кластерный слой на демоне CCRD. Тип кластера теперь задаётся опцией при инициализации. Слой следит, чтобы каждый ZFS-пул в любой момент принадлежал ровно одному узлу. Безопасный failover держится на консенсусе Raft, фенсинге (iSCSI CTL-порты для HCP и Stretched, дисковая резервация SCSI/NVMe для HA) и управлении жизненным циклом сервисов.
Persistent Reservations на iSCSI и NVMe-oF
Таргеты vstack-san поддерживают SCSI-3 Persistent Reservations с APTPL на iSCSI и NVMe Reservations с PTPL на NVMe-oF. Резервации переживают перезапуск таргет-демона. Раньше именно это мешало.
Кластерные инициаторы защищаются от split-brain как раз персистентными резервациями. Теперь тома vStack подходят для Windows Server Failover Clustering, гостевых HA-кластеров, кластерных ФС, WSFC поверх RDM и Clustered VMDK на NVMe/TCP-датасторах.
Сбор метрик: свой коллектор вместо telegraf
На узлах вместо telegraf и Perl-демонов работает собственный коллектор на C++.
Он отдаёт метрики в формате Prometheus по HTTP на /metrics. Набор метрик
перенесён целиком: метрики ВМ, статистика UMA, системные метрики хоста (cpu, mem,
disk, diskio, net, system, kernel, processes, smart, ipmi_sensor, zfs) и
подробный netstat.
На каждом узле работает скраппер. Он собирает /metrics локальных контроллеров
и пишет в InfluxDB на mgmtVM Center, разворачивается при установке кластера.
Контроллеры больше не отправляют данные в InfluxDB сами.
Что не изменилось: метрики по-прежнему хранятся в InfluxDB. Дашборды Grafana остаются на InfluxQL.
Load Balancer на HAProxy
Балансировщик Edge работает на haproxy. Конфигурация генерируется, проверяется
haproxy -c и применяется graceful reload'ом. VIP публикуется через pf rdr.
Правила SNAT-пула балансировщик создаёт сам как внутренние, в пользовательском
NAT они не видны.
- L4 и пулы. Профили TCP/UDP, алгоритмы ROUND_ROBIN, WEIGHTED_ROUND_ROBIN,
LEAST_CONNECTION и IP_HASH, вес участника,
backupиadmin_state, минимальное число активных участников. Активные мониторы TCP/HTTP/HTTPS/UDP/ICMP (interval, timeout, rise, fall) и пассивный мониторинг. - L7 и SSL. HTTP-профиль (
x_forwarded_for, idle timeout), терминация SSL, re-encrypt и passthrough, клиентские и серверные SSL-профили. - Persistence и правила L7. Закрепление клиента по source-ip и cookie. Правила
match(path, host, header, method) →actions: выбор пула, redirect, переписывание заголовков. - Наблюдаемость.
edge-get-lb-statusпоказывает состояние виртуального сервера, пулов и участников,edge-get-lb-stats— сессии, rps и байты.
Health-check выводит мёртвый backend меньше чем за 10 секунд. Терминация SSL принимает TLS 1.2 и 1.3.
SR-IOV
Виртуальными функциями сетевых адаптеров (SR-IOV VF) управляют контроллеры: создание и удаление VF на порту, число VF и MAC-адреса, сохранение конфигурации между перезагрузками, VF и их родительский порт в inventory. В ВМ функция пробрасывается обычным PCI Passthrough. Одна физическая карта обслуживает несколько ВМ с прямым доступом к железу. Проверено на Intel E810 (трафик на линейной скорости) и Mellanox.
Ограничения. ВМ с VF наследует ограничения passthrough: привязана к узлу, без live migration и suspend. SR-IOV и vGPU для графических адаптеров не поддерживаются.
vstack-storage управляет всем ZFS-слоем
- Новые методы
volume-clone(клон zvol) иfilesystems-clone(клон датасета). Клонировать теперь можно независимо от ВМ. vms-createклонирует диск черезvolume-clone.- Полный CLI для pool, filesystem, volume и snapshot поверх JSON-RPC, в общем стиле CLI vStack OS.
В vstack-san остаются раздача томов по iSCSI и NVMe (share-all,
unshare-all), лимиты ввода-вывода и volume rescan.
Жизненный цикл пула через nodeside
Команды create, import, export, start, stop, share и unshare для
ZFS-пула выполняет контроллер nodeside по JSON-RPC через AMQP. Он же публикует
события смены состояния. Скрипты /pools/<pool>/.internal/rc.d/* и
/root/vStack.pool.sh удалены с узлов.
Диски
- HA: замена через HotSpare. Автоматический подбор spare и замена отказавшего
диска заработали на платформе HA. Раньше событие
devd-disk-autoreplaceформировалось, но замены не было. Цикл тот же, что на HCP: отказ, пять минут ожидания, подбор spare, замена. Наружу уходят те же событияdisk-replace-eventиdisk-create-event. - Имена дисков в любой форме.
disk-replace,devd-disk-autoreplace,devd-disk-recoverи CLI принимают имя листа абсолютным, коротким или по GUID. На HA spare подставляется в форме diskid-алиаса, и подпись, размер и тип проверяются на том устройстве, которое уйдёт в пул. Вердикт SMART ищется и по серийному номеру.
CLI
- Для компонентов vStack OS принят единый стандарт CLI и API: именование, структура подкоманд, форматы вывода, коды ошибок, обратная совместимость. Интерфейсы приводятся к нему поэтапно.
- vstack-san позволяет проверить экспорт iSCSI и NVMe-oF целиком из CLI.
Появились
listдля iSCSIpg-ig-mapиlun-mask, NVMe-oFportal,initiator,namespace; сводная карточкаtarget infoс признаком живости портала;target connectionsпо всем таргетам; фильтрыevents; режимыio-stats(rate и разрез по инициатору); список розданных томовexport list. - vstack-net:
host listпоказывает сети хоста. - vstack-cluster:
ha disk statusпоказывает резервации дисков HA-пары без обращения к демону.service moveпроверяет узел назначения до остановки сервиса, неиспользуемый--src-idубран.
Прочее
- Сбор и отправка метрик и HTTP-сервер переехали из vstack-storage в vstack-nodeside.
- Self-fencing для stretched-кластера. На кворум-сервере фенсинг пропускается.
- Внешние команды управления ccrd пишутся в лог на уровне info: видно, кто перенёс сервис, администратор или кластер.
nvmf_tgtработает в interrupt mode.vm-send-receiveснова возвращаетusedиusedbysnapshots, и Center отличает пустую финальную дельту от непустой.
Исправленные ошибки
Хранилище и блочный доступ
- Демон vstack-san больше не пропадает без следа на
volume-destroyзанятого тома и не вешает свой RPC-поток навсегда. Раньше SAN-подсистема узла оставалась мёртвой до ручного перезапуска. - Создание таргета iSCSI или NVMe-oF больше не занимает около 33 секунд.
spdk_tgtне теряет RPC-канал после отказаiscsi_create_portal_group(«portal already exists»).iscsi_get_connectionsбольше не роняетspdk_tgt, если соединение ещё в фазе логина. Раньше падали все iSCSI- и NVMe-oF-сессии узла, а спусковым крючком был штатный опрос/metrics.- Удаление NVMe-oF таргета освобождает TCP-порт.
nvmf-create-targetсip/portатомарный: при отказе listener таргет не остаётся созданным.iscsi-add-target-lunработает.unshare-allне удаляет portal group раньше таргетов, которые её держат. Послеunshare-allзапросы к пулу не теряются.- При переезде пула на другой узел демон отпускает очередь пула. Раньше часть запросов обслуживал бывший владелец и отвечал «Unknown pool name».
- Пропал непрерывный поток
authorization failedот RPC-сокета SPDK. - Демон сам подгружает модуль ядра
mqueuefs. - При перезапуске listener сабсистемы поднимается после allowed-hosts и namespaces.
iscsi-create-portal-groupпроверяет, свободен ли порт, и пишет точную причину вместо «Invalid parameters».statusу непривилегированного пользователя не пишет «демон не запущен» при работающем демоне и показывает версию работающего демона.- После перезагрузки узла-таргета сессия инициатора перечитывает LUN. Раньше пулы могли часами оставаться DEGRADED.
- nvmf-initiator: исправлены запись за границу буфера на запросе ровно 64 КиБ,
аварийное завершение демона на неразбираемом NQN, утечки памяти на
destroyи неудачномcreate, отказы в соединении во времяcreate. Диагностика теперь пишется в лог, а не теряется. - vstack_storage больше не падает раз в секунду на разборе AMQP-адреса.
ova-importне отвечает успехом на непригодный OVA и принимает streamOptimized VMDK отqemu-img.image-getбезurl, битый JSON и пустое тело получают документированные коды ошибок, клиент больше не висит до таймаута.- Коды ошибок 7041–7044 в
send/receiveстали отрицательными. Клиент с проверкойcode < 0принимал их за успех. - CLI vstack_storage:
pool getвыводит флагиfeature@*,pool statusназывает пропавший диск, чужие опции больше не принимаются молча.
Диски, пулы и узел
- Ограничение экспорта по target переживает холодный старт узла. Раньше после перезагрузки LUN отдавался всем инициаторам.
devd-disk-autoreplaceбольше не зависает молча в аллокаторе libzfs.disk-healthне теряет errored-контроллер NVMe из inventory и не течёт дескрипторами.- Отказ чтения health-страницы NVMe больше не выглядит как «диск здоров». В события об отказе не попадает «-273 °C, предупреждений нет».
- На HA тип носителя отказавшего диска определяется и для SAS.
disk-info,disk-spare,disk-unspareиdisk-useна несуществующем диске отвечают ошибкой.disk-useбольше не создаёт фантомный LUN нулевого размера.- Публикация в отсутствующую очередь
event_queueповторяется с паузой и не забиваетcluster.log. - События пулов снова публикуются в AMQP: pool-скрипт устанавливался под именем,
которое
service_ctlне вызывал. - Recovery пула не падает на assert в
zpool_clear().
Кластерный слой
cluster-stopне роняет узел в панику.- Одиночный
ccrd stopне роняет соседа, у которого уже потерян диск пула. - Лидер не падает при старте и остановке сервиса, когда на одном из узлов ccrd не работает.
- Действующий лидер больше не отдаёт голос претенденту. Раньше любой старт второго узла сносил живого лидера.
cluster-managementбольше не останавливается внешней командой.node infoиnode statusс несуществующим id отвечают ENOENT, а не данными другого узла.helpв mgmt-API работает,nodenameпринимается вnodeId.service startс несуществующим сервисом отвечает ошибкой, а не успехом.- Status-команды vstack-cluster не падают на неожиданном ответе.
- Пакет vStack-ccrd-ng ставит согласованные бинарь и rc-скрипт. В версии 1.0.6 исправление паники при перезагрузке до узла не доезжало.
Виртуализация
- Удаление ВМ снимает ссылку в
.vm_V4_state. Раньше inventory показывал фантомные ВМ. - Висячий симлинк состояния ВМ больше не диагностируется как битый JSON.
vstack-vmвосстанавливает AMQP-канал после channel-error. Раньше ответ в исчезнувшую reply-очередь глушил узел целиком.vms-createбезidотвечает ошибкой и не маскирует любую ошибку кодом -212 «No free disk space».vms-stop-poolиvms-suspend-poolна несуществующем пуле отвечают ошибкой.vm-ratelimit-diskиvm-ratelimit-nicпроверяют номер слота,vms-cpu-priorityиvms-vcpu-classпроверяют значение.vms-restartиvms-suspendприсылают подтверждение, ответ уходит вreply_toзапроса. Клиент больше не ждёт до таймаута.vms-startс пустымitemотвечает.vms-startпосле аварии ВМ снимает остаточный NVMe-oF экспорт и не отвечает ложным -457. Остаточные экспорты больше не мешают перезапуску ВМ после отказа узла.vstack-vm vm pause --id=<ВМ>снова работает.- Настройки лимитера vCPU (
hw.vmm.vcpu_limit.class.*) не сбрасываются при загрузкеvmm.ko. bhyvectlне падает вusage().
Сеть и Edge
- Edge снова принимает сообщения vCenter в прежнем формате (nat-объект, log-bool) в v1-методах и legacy-bootstrap.
- Невалидный UTF-8 в ответе бэкенда больше не ломает
edge-get-lb-statusиedge-get-lb-stats.
Базовая система
- Снятие CTL-LUN больше не роняет узел в панику.
- Штатная перезагрузка storage-узла больше не заканчивается kernel panic из-за
того, что
rc.shutdownне укладывался в 90 секунд. kldload veriexecна ядре с встроенным MAC_VERIEXEC не роняет узел,veriexec_load=YESвloader.confбезопасен.
Метрики
- Метрики не теряются, когда отправка задерживается.
- Метрики пулов (
zfs_metrics,pool_iostat, measurementzpool) доходят до InfluxDB. - Вернулись два счётчика
udpstatи полеmtuв семействеnet. curltoolвыставляет таймауты.- У vstack-net, vstack-san и vstack-vm-perfdata появилась ротация логов.