BranchCache в Windows 7

С момента выхода финальных версий Windows 7 и Windows Server 2008 R2 прошел почти год. Чем не повод еще раз вспомнить об этих ОС. Я хотел бы обратить внимание на две наиболее интересные, с моей точки зрения, возможности новых Windows: BranchCache и DirectAccess. В этой статье речь пойдет о BranchCache.

Что такое BranchCache

BranchCache – технология кэширования, встроенная в Windows 7 и Windows Server 2008 R2, и призванная оптимизировать (сократить) сетевой трафик, передаваемый по WAN-каналам связи. Соответственно, основная сфера применения BranchCache – организации с филиалами и удаленными офисами, которые связаны между собой и центральным офисом сравнительно медленными линиями передачи данных.
BranchCache поддерживает кэширование HTTP- и SMB-трафика. При этом на клиентских компьютерах должна быть установлена Windows 7 (редакции Ultimate или Enterprise, в других редакциях BranchCache не работает), а на серверах – Windows Server 2008 R2. Таким образом, BranchCache работает только в связке Windows 7 + Windows Server 2008 R2. Если с этого места у вас не пропало желание читать дальше, давайте обсудим главные особенности рассматриваемой технологии.

Особенности BranchCache

В чем ключевое отличие BranchCache от других технологий кэширования, таких как Offline Files или кэш ISA Server? Данные возвращаются клиентскому приложению из кэша только в том случае, если оригинальные данные не изменились. Поясню на примере. Предположим, что пользователь в филиале пытается открыть с файлового сервера в центральном офисе некий документ, ну скажем, шаблон заявления об увольнении о предоставлении отпуска. Модуль BranchCache компьютера пользователя запрашивает с сервера информацию о файле и проверяет, есть ли запрашиваемый файл в локальном кэше. Если нет, то файл, разумеется, скачивается с сервера центрального офиса. Если файл уже находится в локальном кэше, то все равно происходит обращение к серверу в центральном офисе, чтобы проверить, не изменился ли оригинальный файл на сервере. Если изменился, то файл опять же скачивается с сервера. И только если оригинальный файл на сервере и файл в кэше абсолютно идентичны, используются данные из кэша. Реальный алгоритм обработки запроса сложнее, но для понимания сути, мне кажется, информации достаточно.
Две важные характеристики BranchCache, которые следуют из приведенного примера.
1. Данные в BranchCache всегда актуальны. Выражаясь точнее, если приложение получает данные из кэша, технология BranchCache гарантирует, что эти данные актуальны.
2. Нет доступа к серверу – нет доступа к кэшу. Иными словами, если модуль BranchCache не может проверить идентичность оригинального и кэшированного файлов (сервер выключен, проблемы с каналом связи и пр.), то данные из кэша не используются.
Ну, и стоит добавить, что работа BranchCache прозрачна для приложений и пользователей. Интерфейс Windows никак не отражает тот факт, что открытый только что пользователем документ взят из кэша. В отличие, например, от механизма Offline Files.

Метаданные

Зададимся теперь принципиальным вопросом, а именно: каким образом происходит проверка кэша и сравнение оригинальной и кэшированной информации? BranchCache использует так называемые метаданные. Запрашиваемый файл (документ на файловом сервере, html-страница на веб-сервере и пр.) разбивается на сегменты по 32 MB. Если файл меньше 32 MB, он по определению состоит из одного сегмента. Сегменты, в свою очередь, разбиваются на блоки по 64 KB. Если файл меньше 64 KB, он всегда напрямую скачивается с сервера, и BranchCache при этом не используется. Для каждого блока и сегмента по алгоритму SHA 256 вычисляется хэш. Все эти вычисления происходят на сервере с включенной поддержкой BranchCache, где располагается запрашиваемый файл. Совокупность хэш-значений сегментов и блоков образуют хэш-лист (hashlist) и служат основой метаданных файла. Именно эти метаданные и передаются на клиентский компьютер, где сравниваются с хэш-листом кэшированного файла. Размер хэша данных приблизительно в 2000 раза меньше размера самих данных, поэтому нагрузка на WAN-канал при передаче метаданных минимальна.

Разбиение на сегменты и блоки позволяет оптимизировать операции поиска и скачивания данных. Хэш сегмента является единицей поиска. Как уже было упомянуто, при обращении к файлу на удаленном сервере – в центральном офисе или другом филиале – первое, что делает модуль BranchCache клиентского компьютера, запрашивает с сервера метаданные файла. На основе полученного хэш-листа BranchCache проверяет, есть ли в локальном кэше сегменты файла. Если да, файл открывается из локального кэша. Если нет, то клиентский компьютер посылает в сеть поисковый запрос: «У кого есть сегмент с таким-то хэшем?» В зависимости от режима работы BranchCache (см. ниже) этот запрос направляется либо специально сконфигурированному серверу с Windows Server 2008 R2 в этом же филиале, либо находящимся в этой же IP-подсети компьютерам с Windows 7. В случае положительного ответа искомый сегмент данных блоками скачивается с «соседа». В этом смысле, блок – единица скачивания. Таким образом, наличие сегментов позволяет сократить количество поисковых запросов, а наличие блоков – более быстро передать запрашиваемые данные приложению.

Режимы работы BranchCache

Для использования BranchCache необходимо настроить эту технологию, как на клиенте, так и на сервере. При этом возможны два режима работы BranchCache: распределенный кэш (distributed cache) и выделенный кэш (hosted cache).

Распределенный кэш

В распределенном режиме данные кэшируются на том компьютере с Windows 7, который первым в филиале, а точнее в IP-подсети, эти данные скачал с удаленного сервера. После чего эти данные становятся доступными для других компьютеров филиала. Динамика работы BranchCache выглядит следующим образом:
1. Пользователь за компьютером в филиале пытается открыть документ с удаленного сервера. При этом компьютер устанавливает с сервером соединение и запрашивает требуемый файл так, как если бы BranchCache не было вообще.
2. Сервер авторизует клиента и проверяет, что у клиента есть соответствующие права доступа к файлу. Если прав нет, доступ к файлу отклоняется.
3. Если на сервере и клиенте сконфигурирован модуль BranchCache, сервер вместо файла возвращает метаданные, включая хэш-лист.
4. Если в локальном кэше сегменты файла отсутствуют, и скорость канала связи до сервера низкая (латентность превышает заданный порог, по умолчанию 80 мс), клиент генерирует запросы на поиск отсутствующих сегментов с помощью протокола Web Service Dynamic Discovery (WS-Discovery). Это групповые (multicast) запросы, которые распространяются только в пределах подсети, если маршрутизаторы не настроены иначе.
5. Если у кого-то есть запрашиваемые сегменты, они блоками возвращаются на клиентский компьютер. Компьютер проверяет целостность полученных блоков, сохраняет их в своем кэше и передает данные приложению. Пользователь видит открывшийся документ.
6. Если ни у кого из «соседей» нет нужных данных, они закачиваются с сервера по WAN-каналу и сохраняются в локальном кэше.
Распределенный режим рекомендуется для небольших филиалов, где все машины расположены в рамках одной подсети. BranchCache на клиентских машинах легко настроить с помощью групповых политик, при этом наличие сервера Windows Server 2008 R2 не требуется. Однако надо помнить, что при выключении компьютера его кэш становится недоступным другим клиентам филиала.

Выделенный кэш

В этом режиме кэш (выделенный кэш) сосредоточен на филиальном сервере с Windows Server 2008 R2, сконфигурированном соответствующим образом. Любой компьютер с Windows 7 обращается с поисковыми запросами именно к серверу выделенным кэшем, и только к нему. Динамика такова:
1. Пользователь за компьютером в филиале пытается открыть документ с удаленного сервера. При этом компьютер устанавливает с сервером соединение и запрашивает требуемый файл так, как если бы BranchCache не было вообще.
2. Сервер авторизует клиента и проверяет, что у клиента есть соответствующие права доступа к файлу. Если прав нет, доступ к файлу отклоняется.
3. Если на сервере и клиенте сконфигурирован модуль BranchCache, сервер вместо файла возвращает метаданные, включая хэш-лист.
4. Если в локальном кэше сегменты файла отсутствуют, и скорость канала связи до сервера низкая (латентность превышает заданный порог, по умолчанию 80 мс), клиент напрямую обращается к локальному серверу с выделенным кэшем. IP-адрес или FQDN сервера с выделенным кэшем должен быть прописан в настройках клиента вручную или с помощью групповых политик. При этом, как уже понятно, запрашивается сегмент или сегменты.
5. Если данные в выделенном кэше есть, они блоками возвращаются на клиентский компьютер. Компьютер проверяет целостность полученных блоков, сохраняет их в своем кэше и передает данные приложению. Пользователь видит открывшийся документ.
6. Если же в выделенном кэше нет запрашиваемых данных, то клиент скачивает их с удаленного сервера и сохраняет в локальном кэше.
7. После чего клиент посылает серверу с выделенным кэшем пакет-оповещение о доступности новых данных для выделенного кэша.
8. Сервер посылает запрос клиенту на получение новых данных.
9. Клиент копирует блоки на сервер в выделенный кэш, чтобы этой информацией могли воспользоваться другие машины филиала.
Выделенный кэш обеспечивает более высокий уровень доступности данных, поскольку в отличие от клиентских компьютеров сервер работает постоянно и не выключается. Как правило. Хотя в небольших офисах чего только не бывает. Кроме того, нет ограничений на сетевую топологию. Запрос к выделенному кэшу – это unicast запрос, который маршрутизируется обычным образом. Однако описанный режим работы предполагает наличие в филиале сервера с Windows Server 2008 R2.
Завершая обзор режимов работы BranchCache, надо отметить, что эти режимы взаимоисключающие. Конкретный клиент с Windows 7 не может работать одновременно и в одном, и в другом режиме.

Поддержка HTTP

BranchCache поддерживает кэширование HTTP- и SMB-трафика. Существуют некоторые особенности, присущие рассматриваемому механизму кэширования, в контексте этих протоколов.
Начнем с HTTP. Поскольку модуль BranchCache встроен только в Windows Server 2008 R2 и Windows 7, наверное уже понятно, что BranchCache для HTTP применим, только если в качестве веб-сервера используется IIS 7.5 из состава Windows Server 2008 R2.
Вторая особенность связана с генерацией хэш-листов для файлов веб-сайтов. Хэш-лист для любого файла веб-сайта (html, jpg и т. д.) генерируется после первого обращения к этому файлу. Это приводит к тому, что только на третье обращение к файлу, тело файла может быть получено из BranchCache. Предположим, клиент из филиала впервые обращается к некоторой веб-странице. IIS отдает клиенту страницу по HTTP или HTTPS и генерирует для нее метаданные. Стало быть, клиент на свой запрос получил страницу, но не получил хэш-лист, а потому не может эту страницу поместить в свой или выделенный кэш. При втором обращении клиента к этой же странице IIS в ответ возвращает не данные, а имеющиеся уже теперь метаданные. Однако поскольку после первого запроса данные не были закэшированы, клиенту ничего не остается, как скачивать всю страницу заново. Но на этот раз ее можно поместить в кэш. И третий запрос к этой странице может быть обслужен из BranchCache.
Наконец, в силу того, что BranchCache фактически отрабатывает до транспортных механизмов, кэширование никак не влияет на SSL и наоборот. То есть BranchCache эффективно работает как при использовании HTTP, так и при HTTPS. Кстати это в равной степени относится и к IPSec по той же причине. В этом ролике я продемонстрировал настройку и принцип работы BranchCache для HTTP.

Поддержка SMB

Объем данных на файловых серверах может быть очень большим и при высокой нагрузке вычисление хэшей оказывается весьма затратной операцией. Как следствие, в случае с SMB генерация метаданных происходит заранее. Поэтому в ответ на первый запрос клиент получает хэш-лист, и уже второе обращение к этому файлу может быть обслужено из кэша. После первичной генерации метаданные автоматически обновляются каждый раз после изменения файла. Плюс к этому у администратора есть возможность обновить хэш-лист для заданного файла или папки с помощью утилиты командной строки hashgen.
На клиентской стороне BranchCache для SMB, в том числе, использует службу Offline Files. Если эту службу отключить, кэширование SMB-трафика перестанет работать. На кэширование HTTP-трафика это никак не скажется.
Можно посмотреть на настройки и особенности работы BranchCache для SMB.

Приложения и данные

С точки зрения архитектуры BranchCache располагается ниже драйверов SMB и HTTP. Работа этого модуля прозрачна для приложений. Иными словами, кэширование будет работать при использовании любого приложения, которое задействует встроенный в Windows стек SMB или HTTP.
Тем не менее, я бы отметил, что эффект от BranchCache во многом зависит от характера используемых данных. Поясню. Вспомним уже рассмотренный пример, когда пользователь в филиале открывает с удаленного сервера документ. Клиент получает с сервера хэш-лист и закачивает тело файла либо с удаленного сервера, либо из BranchCache (своего или «соседского»). Что будет, если пользователь меняет содержимое этого документа и закрывает его с сохранением изменений? Весь файл сохраняется на удаленном сервере! Раз изменился файл, значит необходимо пересчитать хэш-лист, а этим занимает серверная сторона, поэтому сохранять модифицированный файл сразу в кэш нельзя. Если пользователь тут же попытается открыть файл заново, то согласно рассмотренному алгоритму, клиентский компьютер получит с сервера обновленные метаданные, и ничего не останется, как полностью скачивать тело файла с сервера. Вывод простой: BranchCache даст ощутимый эффект для относительно статичных данных.

Безопасность

Тема безопасности BranchCache вполне заслуживает отдельного топика, поэтому если читателям Хабра будет интересно, я готов написать о безопасности BranchCache более подробно. Пока же хотел бы отметить лишь несколько важных моментов.
Во-первых, BranchCache не предусматривает каких-либо специальных защитных мер при передаче данных с удаленного сервера в филиал. Если, например, файл скачивается по HTTP, а не HTTPS, то тело файла передается в открытом виде, и BranchCache со своей стороны никакого шифрования для данных не добавляет.
Во-вторых, сам по себе кэш, то есть файл на жестком диске, внутри которого хранятся кэшированные блоки, не шифруется. Если нужны дополнительные меры защиты, можно воспользоваться соответствующими средствами, например, встроенными в Windows EFS или BitLocker.
И наконец, механизмы безопасности BranchCache вступают в силу при обмене информацией с «соседними» компьютерами или сервером с выделенным кэшем. Все запросы и ответы в рамках такого обмена шифруются, чтобы предотвратить намеренную подстановку некорректных данных со стороны злоумышленника.

Подводя итоги, хотелось бы еще раз подчеркнуть, BranchCache:
— снижает нагрузку на WAN-каналы, связывающие филиалы предприятия, и сокращает соответствующие расходы;
— повышает скорость отклика приложений в филиалах;
— является встроенной возможностью Windows 7 и Windows Server 2008 R2 и управляется штатными средствами.

взято тут

PS: спасибо автору за интересную статью.