ydb-platform / nbs

Network Block Store
Apache License 2.0
50 stars 14 forks source link

[NBS] Separate lifetime of external vhost-server from NBS #1436

Open drbasic opened 2 weeks ago

drbasic commented 2 weeks ago

Для обслуживания локальных дисков NBS для каждого диска поднимает свой процесс blockstore-vhost-server. Далее все запросы к диску идут через этот процесс. В NBS лишь отгружается статистика через чтение процессом NBS потока std out. blockstore-vhost-server является дочерним процессом для NBS и при рестарте NBS убивается вместе с NBS. Что приводит к проблемам - локальные диски не обслуживаются пока не поднимется новый NBS, который должен запустить новые процессы blockstore-vhost-server. Итого. Имеется задержка по рестарту blockstore-vhost-server, обусловленная задержкой рестарта NBS. Что предлагается сделать:

  1. отвязать время жизни blockstore-vhost-server от NBS. Т.е. после старта процесса объяснить systemd что blockstore-vhost-server не нужно убивать вслед за NBS (через смену группы процессов(PGID) вызовом setpgid)
  2. процессу NBS научиться находить все запущенные процессы blockstore-vhost-server и подключаться к ним для сбора статистики. Также достартовать blockstore-vhost-server которых не хватает и гасить лишние.
  3. процессу NBS научиться рестартовать blockstore-vhost-server чтобы он обновлялся тоже.
drbasic commented 2 weeks ago

Варианты архитектуры:

  1. Отдельные процессы. При запуске процесса blockstore-vhost-server выводится из группы процессов blockstore-server вызовом setpgid. Кроме этого закрывает все файловые описатели, наследованные от родительского процесса blockstore-server. blockstore-server должен отслеживать что blockstore-vhost-server живой и переподнимать его в случае необходимости (он это уже делает сейчас). После рестарта blockstore-server должен найти запущенные blockstore-vhost-server через перечисление /proc/%pid/comm, переустановить с ними связь (или просто перезапустить их), и дозапустить новые blockstore-vhost-server, если требуется. При старте blockstore-vhost-server записывает в идентификтор главного потока что-то вроде SetCurrentThreadName("vhost@volume-id"), что позволит легко находить такие процессы и понимать какие диски они обслуживают. Также нужно подписаться на сигнал обрыва пайпа с родительским процессом.
  2. Новый сервис blockstore-vhost-service. Делаем новый сервис, который запускает под собой необходимое количество blockstore-vhost-server. blockstore-server общается только с корневым процессом, от которого получает статистику и дает ему команды на запуск/остановку дочерних blockstore-vhost-server. При перезапуске blockstore-vhost-service нужно переподнять все blockstore-vhost-server. Для этого нужно иметь целевую конфигурацию. Ее можно хранить в файле. А можно чтобы ее пушил blockstore-server, как только обнаруживал что blockstore-vhost-service рестартовал.