Facebook открыл (https://code.facebook.com/posts/291641674683314/open-r-open-... наработки, связанные с платформой маршрутизации Open/R, которая изначально развивалась как распределённая система маршрутизации для динамически меняющихся беспроводных mesh-сетей, но затем была перенесена для других сетевых применений, включая опорную сеть Facebook Express Backbone. Код эталонной реализации Open/R написан на языке C++ и распространяется (https://github.com/facebook/openr/) под лицензией MIT. Для определения RPC-вызовов используется язык описания интерфейсов Apache Thrift (http://thrift.apache.org/), а для обмена сообщениями между узлами - шина ZeroMQ (http://zeromq.org/).
Для управления доступен расширяемый CLI-интерфейс Breeze (https://github.com/facebook/openr/blob/master/openr/docs/Bre... написанный на языке Python. Для интеграции с централизованными системами управления трафиком предоставляется API, позволяющих внешним обработчикам получать сведения о состоянии линков или отслеживать обновления БД, например, получать информацию об изменении пропускной способности. Также доступен (https://github.com/facebook/openr/blob/master/openr/docs/Emu... эмулятор для тестирования при помощи виртуальных сетей на базе Open/R, поддерживающий симуляцию различных видов сбоев, трафика и характеристик работы участков сети (возникновения потери пакетов, перегрузки, задержек, jitter и т.п.).
Протокол Open/R подходит для создания автономных сетевых решений с построением оптимальных маршрутов на основе построения реплицируемой базы данных о состоянии каналов. Open/R может применяться как альтернатива OSPF и IS-IS, легко адаптируемая для различных применений. Распределённая система маршрутизации является одним из таких применений. Вместо реализации собственных механизмов согласования соединений, оформления кадров и других низкоуровневых элементов протокола, в Open/R применяется идея задействования языка Thrift для кодирования всех связанных с Open/R сообщений и применения для их передачи уже проверенной временем библиотеки ZeroMQ, позволяющей использовать такие расширенные схемы, как издатель-подписчик (https://ru.wikipedia.org/wiki/%D0%98%D0%....
Open/R также изначально спроектирован как универсальная платформа, не привязанная к конкретным аппаратным системам и маршрутизаторам. Логика построения маршрутов и обмена информацией с другими узлами полностью отделена от средств установки маршрутов через специальную прослойку (модуль Platform). В качестве основной платформы для Open/R применяется сетевое оборудование на базе открытой платформы FBOSS (https://www.opennet.ru/opennews/art.shtml?num=40038), такое как коммутаторы Wedge 100 (https://code.facebook.com/posts/145488969140934/open-network.... При этом Open/R не зависит от ASIC и также может работать как поверх обычного сетевого стека Linux, так и с операционными системами Arista EOS и Juniper JunOS (QFX и PTX) через предоставляемый ими API на базе gRPC.
Элементы архитектуры Open/R:
- KV-STORE (https://github.com/facebook/openr/blob/master/openr/docs/KvS... - отвечает за ведение распределённого хранилища в формате ключ/значение (in-memory DB на базе CRDT (https://en.wikipedia.org/wiki/Conflict-free_replicated_data_... синхронизацию данных и репликацию состояния между узлами;
- Spark (https://github.com/facebook/openr/blob/master/openr/docs/Spa... - выполняет задачи обнаружение соседних узлов при помощи протокола Link-Local Multicast и обрабатывает сведения об активности соседей. Каждый Hello-пакет передаётся с указанием цифровой подписи узла, что позволяет проверить его достоверность;
- LinkMonitor (https://github.com/facebook/openr/blob/master/openr/docs/Lin... - выполняет мониторинг сетевых интерфейсов, обращаясь через прослойку Platform, а также управляет сеансами модуля Spark и транслирует выявленные соседние узлы в модуль
KV-STORE (поддерживает локальную базу соседних линков и управляет сеансами с соседними узлами);
- PrefixManager (https://github.com/facebook/openr/blob/master/openr/docs/Pre... - решает задачи автоматического распределения сетевых префиксов;
- Decision (https://github.com/facebook/openr/blob/master/openr/docs/Dec... - вычисляет оптимальные маршруты и строит локальную таблицу маршрутизации на основе информации о топологии сети и базы префиксов, полученных из хранилища KV-STORE;
- FIB (https://github.com/facebook/openr/blob/master/openr/docs/Fib... - работает как прокси для программирования вычисленных маршрутов в фактическом системном окружении, обращаясь к нему через модуль Platform. Также занимается поддержанием базы состояний вычисленных маршрутов (forwarding state);
- Platform (https://github.com/facebook/openr/blob/master/openr/docs/Pla... - прослойка для низкоуровневого программирования маршрутизации и взаимодействия с сетевыми интерфейсами. Создаётся для каждой целевой аппаратной платформы и абстрагирует доступ к ней.
Основные возможности:
- Первоочередная поддержка IPv6 и задействование возможностей IPv6 по привязке локальных адресов для автоматической настройки без необходимости явного задания сетевой конфигурации;
- Полноценная поддержка маршрутизации IPv4 при необходимости;
- Распределение сетевых префиксов и настройка IP-адресов для узлов самоорганизующихся динамических сетей (Ad hoc (https://ru.wikipedia.org/wiki/%D0%91%D0%...
- Возможность перезапуска без остановки работы и без нарушения процессов перенаправления трафика, что позволяет организовать применение обновлений на лету;
- Поддержка подсоединения и вывода из сети узлов и линков;
- Динамическое вычисление метрик RTT (время приема-передачи) и их уточнение через активные проверки;
- Возможность установки собственных значений метрик, их статическая привязка или динамическое вычисление;
- Быстрая конвергенция (https://en.wikipedia.org/wiki/Network_convergence) сети с применением счётчиков отсрочки (backoff) для сбойных линков или узлов;
- Python-библиотека для взаимодействия со всеми основными процессами Open/R;
- Возможность расширения платформы путём распространения любых видов дополнительной информации и изменения логики вычисления маршрута;
- Непрерывный контроль работоспособности сети через отправку проверочных запросов;
- Наличие API для интеграции с централизованными системами управления.
URL: https://code.facebook.com/posts/291641674683314/open-r-open-.../
Новость: http://www.opennet.ru/opennews/art.shtml?num=47577