Project

General

Profile

ТЗ на файловый сервер
h2. Решаемые проблемы

  • При интенсивной работе с файлами по сети возникают задержки при открытии файлов. Они вызваны проверками прав доступа, антивирусами итд. На данный момент не видно другого решения проблемы.
  • Права доступа к файловому хранилищу. Если мы обращаемся к файлам только через свой сервис, уходит проблема с тем, что у пользователя есть права на запись в файловом хранилище, что небезопасно.
  • Резервирование. Возможность перенаправить все обращения на другой сервер.

Используемые модули

TCP_MANAGER - поддержка TCP
BASE_SERVICE - windows service
DBG_LOG - Модуль записи отладочных логов, настройка, какие логи писать
PARAM_FILE - Хранение настроек. Редактирование настроек.
NC_CONTAINER - дерево параметров аналогично XML

Новые модули

Пишем два модуля: серверный и клиентский. Связь между модулями осуществляется по TCP. Запрос и ответ передается в виде NC_CONTAINER. Возможно также использование XML запросов благо конвертация в обе стороны не проблема. Сервер обрабатывает запросы клиента на предмет работы с файлами. В дальнейшем появятся и другие запросы.

Резервирование

Серверные модули могут работать в паре (активный и резервный).Каждый на своем сервере. При нормальной работе активный модуль обрабатывает запросы клиентов, а резервный резервирует на свой сервер содержимое хранилища.

Серверный модуль

  • TCP server
  • Windows service
  • Допускает одновременное подключение значительного количества клиентов (несколько тысяч).
  • По запросу клиента выполняет любую файловую операцию (!CreateFile, ReadFile, WriteFile, CloseHandle, LockFile etc)
  • Нотификация клиентов об изменениях файлов в каталогах
  • Для одного клиента допускается передача нового запроса до окончания обработки предыдущего. Это не касается случаев запросов к одному файлу по одному хэндлу.
  • Ответ на более поздний запрос может быть отправлен раньше.
  • Запросы выполняются параллельно. То есть, есть некоторое кол-во потоков. Каждый новый запрос передается свободному потоку (если таковой есть).
  • Режим кеширования. В этом режиме доступ к хранилищу осуществляется только через серверный модуль. в этом случае допускается кэширование файлов на чтение и запись (настраивается)
  • Резервирование. Серверные модули могут работать в паре (активный и резервный). Каждый на своем сервере. Соединяются по TCP. При нормальной работе активный модуль обрабатывает запросы клиентов, а резервный резервирует на свой сервер содержимое хранилища. После восстановления рухнувшей половинки, она становится резервной. В общем, система во многом похожа на кластер.
  • Логи. Настраиваемые. Пишет все операции, длительные операции, ошибки. Для записи логов используем модуль DBG_LOG.
  • Допускается подключение через инет. То есть одно медленное соединение не влияет на другие.
  • Для хранения и редактирования настроек (в том числе системы записи логов) используем модуль PARAM_FILE. Пример использования модуля записи логов совместно с редактором настроек можно посмотреть в VIDEO_SERVICE’е

Клиентский модуль

  • TCP client
  • Используется в джине. Вся работа с файлами в хранилище осуществляется через этот модуль.
  • Режим, в котором модуль вместо обращения к серверному модулю выполняет все операции сам.
  • Резервирование. Клиент соединяется с активным и резервным серверными модулями. В случае проблем запросы перенаправляются.
  • Логи. Настраиваемые. Пишет все операции, длительные операции, ошибки.

Протокол клиент-сервер

* В качестве запроса или ответа всегда используется NC_CONTAINER

* В нем есть обязательные поля.

* ID запроса - уникальный идентификатор запроса-ответа генерируется клиентом для запроса. Для ответа берется из запроса.

* Код операции (строчный, осмысленный) - генерируется клиентом. Копируется в ответ сервером.

  • И необязательный - параметры, зависящие от кода операции.
  • При использовании XML протокола, сразу по получении сервером XML запроса он конвертируется в NC_CONTAINER. Ответ конвертируется в XML непосредственно перед отправкой

Примечания

  • Клиентский модуль должен работать совместно с системой резервирования файлов. Если есть резервная копия на локальном диске работает с ней. Алгоритм взаимодействия с системой резервирования указывается при запросе на открытие файла. Учесть при внедрении клиентского модуля в джин.

Поддерживаемые файловые операции

Вместо HANDLE используем некоторый собственный класс. У класса клиента должны быть методы полностью аналогичные по параметрам функциям API.
К сожалению выяснилось, что поддержка overlapped операций тоже нужна, потому что она используется.

    FILER_FILE_HANDLE FILER_FILE_HANDLE CreateFile();
    bool    CloseHandle(FILER_FILE_HANDLE handle);

    bool    ReadFile();
    bool    WriteFile();
    !+int64 SetFilePointer();
    bool    LockFileEx();
    bool    UnlockFileEx();

    FindFirstFile()
    FindNextFile()
    FindClose()

    GetFileAttributesEx()
    CreateDirectory();
    DeleteFile();
    MoveFile();
    MoveFileEx();
    GetFileSize();
    SetEndOfFile();
    FlushFileBuffers();
    FindFirstChangeNotification();
    ReadDirectoryChangesW();

Список будет расширяться. Хочется, чтобы добавление новой функции не было большой проблемой с точки зрения программирования. То есть минимизировать кол-во мест, куда нужно внести изменения.

Add picture from clipboard (Maximum size: 742 MB)