Перейти к основному содержимому

Что нового в 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 для iSCSI pg-ig-map и lun-mask, NVMe-oF portal, 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, measurement zpool) доходят до InfluxDB.
  • Вернулись два счётчика udpstat и поле mtu в семействе net.
  • curltool выставляет таймауты.
  • У vstack-net, vstack-san и vstack-vm-perfdata появилась ротация логов.