Введение
Transparent Inter Process Communication (TIPC) - это служба межпроцессной связи (IPC) в Linux, предназначенная для работы на уровне кластера. Иногда он представляется как Cluster Domain Sockets, в отличие от хорошо известной службы Unix Domain Socket; последний работает только на одном ядре.
Реализация
Протокол TIPC доступен в качестве модуля в основном ядре Linux, а следовательно, в большинстве дистрибутивов Linux. Проект TIPC также предоставляет реализацию протокола с открытым исходным кодом для других операционных систем, включая VxWorks от Wind River и Solaris от Sun Microsystems. Приложения TIPC обычно написаны на C (или C++) и используют сокеты семейства адресов AF TIPC. Также доступна поддержка Go, D, Perl, Python и Ruby.
Адресация услуг
В заявке TIPC могут использоваться три типа адресов. Адрес службы. Этот тип адреса состоит из 32-битового идентификатора типа службы и 32-битового идентификатора экземпляра службы. Идентификатор типа, как правило, определяется и жестко кодируется программистом пользовательского приложения, но его значение может быть скоординировано с другими приложениями, которые могут присутствовать в том же кластере. Идентификатор экземпляра часто вычисляется программой на основе конкретных критериев приложения. Обслуживающий диапазон. Этот тип адресов представляет собой диапазон адресов обслуживания одного и того же типа, а экземпляры расположены между нижним и верхним пределом диапазона. Привязывая сокет к этому адресному типу, можно заставить его представлять многие экземпляры, что оказалось полезным во многих случаях. Адрес сокета. Этот адрес является ссылкой на конкретный разъем в кластере. Он содержит 32-битный номер порта и 32-битный номер узла. Номер порта генерируется системой при создании сокета, а номер узла устанавливается либо по конфигурации, либо, начиная с Linux 4.17, генерируется из соответствующего идентификатора узла. Адрес такого типа может использоваться для подключения или для отправки сообщений таким же образом, как и сервисные адреса, но действителен только до тех пор, пока существует ссылаемый сокет. Сокет может быть связан с несколькими различными адресами или диапазонами услуг, так же как различные сокеты могут быть связаны с одним и тем же адресом или диапазоном услуг. Привязки также квалифицируются с возможностью видимости, т.е. локальной видимостью узла или глобальной видимостью кластера.
Послания с датграммами
Послания датграмм представляют собой дискретные единицы данных длиной от 1 до 66 000 байтов, передаваемые между не связанными сокетами. Как и их аналоги UDP, TIPC-даттаграммы не гарантируют, что они достигнут места назначения, но их шансы на доставку все еще намного лучше, чем у первых. Из-за гарантии доставки на уровне связи единственным ограничивающим фактором для доставки датграммы является размер буфера приема сокета. Шансы на успех могут быть также увеличены отправителем, придавая его разъему соответствующий приоритет важности доставки. Датаграммы могут передаваться тремя различными способами. Единоборство. Если указан адрес сокета, сообщение передается именно на этот сокет. В TIPC термин unicast используется для обозначения этого режима адресации. Любой каст. Когда используется адрес службы, может быть несколько соответствующих пунктов назначения, и метод передачи становится тем, что часто называют anycast, то есть, что любой из соответствующих пунктов назначения может быть выбран. Внутренняя функция, которая переводит из служебного адреса в адрес разъема, использует алгоритм круглого стола для уменьшения риска смещения нагрузки между пунктами назначения. Многоканальная передача. Тип адреса диапазона обслуживания также используется в качестве многоканального адреса. Когда приложение указывает диапазон услуг в качестве адреса назначения, копия сообщения отправляется во все совпадающие сокеты в кластере. Любой сокет, связанный с соответствующим сервисом в пределах указанного диапазона мультикаста, получит одну копию сообщения. TIPC будет использовать мультикаст UDP или Ethernet вещание, когда это возможно.
Сообщения, ориентированные на подключение
Соединения могут быть установлены таким же образом, как и с TCP, с помощью приема и подключения на сокетах. Однако в TIPC клиент и сервер используют адреса или диапазоны услуг вместо номеров портов и IP-адресов. TIPC также предлагает две альтернативы этому стандартному сценарию. Сокеты могут быть созданы как SOCK SEQPACKET, что означает, что обмен данными должен происходить в единицах сообщений максимум 66 000 байтов. Клиент может инициировать соединение, просто отправив сообщение данных в приемный сокет. Аналогичным образом, созданный серверный сокет может ответить сообщением о данных обратно к клиенту, чтобы завершить соединение. Таким образом, TIPC обеспечивает подразумеваемый, также известный как 0 RTT механизм настройки соединения, который во многих случаях особенно экономит время. Наиболее отличительным свойством соединений TIPC по-прежнему является их способность оперативно реагировать на потерю контакта с сотовым сокетом, не прибегая к активному сердечному ритму соседа. Когда сокет закрывается по злой воле, либо пользователем, либо из-за сбоя процесса, код очистки сокета ядра по собственной инициативе выдаст сообщение FIN/ERROR для сверстника. Когда контакт с узлом кластера потерян, локальный уровень связи выдаст сообщения FIN/ERROR всем сокетам, имеющим соединения с этим узлом. Время обнаружения неисправности узла однорангового узла может быть настроено до 50 мс, в то время как значение по умолчанию составляет 1500 мс.
Групповое общение
Групповое обмен сообщениями аналогично обмену сообщениями с помощью датграммы, как описано выше, но с контролем потока от конца до конца и, следовательно, с гарантией доставки. Однако есть несколько заметных отличий. Сообщения могут передаваться только в закрытой группе сокетов-членов. Сокет присоединяется к группе с помощью адреса службы, где поле типа указывает идентификатор группы, а поле экземпляра указывает идентификатор члена. Таким образом, участник может связываться только с одним адресом службы. При отправке сообщения anycast алгоритм поиска применяет обычный алгоритм круглого списка, но также учитывает текущую нагрузку, то есть рекламное окно отправки, на потенциальных получателей перед выбором одного. Многоканальная передача выполняется по адресу службы, а не по диапазону, поэтому копия отправленного сообщения будет достигать всех членов, которые присоединились к группе именно с этим адресом. Существует режим групповой трансляции, который передает сообщение всем членам группы, не учитывая их личность. Последовательность сообщений гарантирована, даже между режимами передачи. При входе в группу член может указать, хочет ли он получать события присоединения или ухода для других членов группы. Эта функция использует функцию отслеживания службы, и член группы получит события в собственном сокете члена.
Отслеживание услуг
Приложение получает доступ к службе отслеживания, открывая соединение с внутренним топологическим сервером TIPC, используя зарезервированный адрес службы. Затем он может отправить одно или несколько сообщений об подписке на услугу отслеживания, указывая адрес службы или диапазон, который он хочет отслеживать. В свою очередь, топологическая служба отправляет сообщения о событиях службы обратно в приложение, когда совпадающие адреса связаны или не связаны сокетами в кластере. Служебное событие содержит найденный соответствующий диапазон услуг, плюс порт и номер узла связанного/не связанного сокета. Существует два особых случая отслеживания услуг: отслеживание кластерной топологии. Когда TIPC устанавливает контакт с другим узлом, он создает локальное связывание узла, используя зарезервированный тип службы, в таблице связывания службы. Это позволяет приложениям на узле отслеживать доступные одноранговые узлы в любое время. Отслеживание связи кластера. Когда TIPC устанавливает новую ссылку на другой узел, он создает локальное связывание узла, используя зарезервированный тип службы, в таблице связывания узла. Это позволяет приложениям на узле отслеживать все рабочие ссылки на одноранговые узлы в любое время. Хотя большинство подписок на услуги направлены на локальный топологический сервер узла, возможно установить соединения с серверами других узлов и наблюдать за их локальными связями. Это может быть полезно, если, например, абонент связи хочет создать матрицу всей связи в кластере, не ограничиваясь тем, что можно увидеть с локального узла.
Cluster topology tracking. When TIPC establishes contact with another node, it does internally create a node local binding, using a reserved service type, in the service binding table. This makes it possible for applications on the node to keep track of reachable peer nodes at any time. Cluster connectivity tracking. When TIPC establishes a new link to another node, it does internally create a node local binding, using a reserved service type, in the node's binding table. This makes it possible for applications on the node to keep track of all working links to the peer nodes at any time. Although most service subscriptions are directed towards the node local topology server, it is possible to establish connections to other nodes' servers and observe their local bindings. This might be useful if e. g., a connectivity subscriber wants to create a matrix of all connectivity across the cluster, not limited to what can be seen from the local node.
Кластер
Сеть TIPC состоит из отдельных элементов или узлов обработки. Узлы могут быть физическими процессорами, виртуальными машинами или сетевыми пространствами имен, например, в форме контейнеров Docker. Эти узлы расположены в кластере в соответствии с их присвоенной идентификацией кластера. Все узлы, имеющие одинаковую идентичность кластера, будут устанавливать связи друг с другом, при условии, что сеть настроена так, чтобы между ними было возможно обнаружение взаимных соседей. Идентичность кластера необходимо изменять по умолчанию только в том случае, если узлы в разных кластерах могут обнаруживать друг друга, например, если они присоединены к одной и той же подсети. Узлы в разных кластерах не могут общаться друг с другом с помощью TIPC. До Linux 4.17 узлы должны быть сконфигурированы уникальным 32-битовым номером или адресом узла, который должен соответствовать определенным ограничениям. Начиная с Linux 4.17, каждый узел имеет 128-битовую идентификацию узла, которая должна быть уникальной в кластере узла. Затем число узла рассчитывается как гарантированный уникальный хэш от этой идентификации. Если узел будет частью кластера, пользователь может либо полагаться на возможность автоматической конфигурации узла, где идентификация генерируется при подключении первого интерфейса, либо он может установить идентификацию явно, например, из имени хоста узла или UUID. Если узел не будет частью кластера, его идентификация может оставаться по умолчанию нулевой. Обнаружение соседей осуществляется посредством UDP-мультитрансляции или L2-трансляции, когда она доступна. Если в инфраструктуре отсутствует поддержка вещания/мультикаста, обнаружение может быть выполнено с помощью явно настроенных IP-адресов.
Связи между узлами
Кластер состоит из узлов, взаимосвязанных одной или двумя связями. Ссылка представляет собой надежную услугу передачи пакетов, иногда называемую слоем связи данных "L2.5". Она гарантирует доставку и последовательность для всех пакетов. Он действует как ствол для межузловых соединений и отслеживает их. Когда все контакты с одноранговым узлом утрачены, сокеты с соединениями с этим однорангом уведомляются, чтобы они могли разорвать соединения. Каждая конечная точка отслеживает адресные связки однорангового узла в локальной реплике таблицы связывания услуг. Когда контакт с одноранговым узлом утрачен, все связывания с этого однорангового узла очищаются, и события отслеживания службы выдаются всем соответствующим абонентам. Когда нет регулярного трафика пакетов данных, каждая связь активно контролируется с помощью зондирования / сердечных сокращений. Толерантность обнаружения неисправности может быть настроена от 50 мс до 30 секунд, по умолчанию - 1,5 секунды. По соображениям производительности и избыточности можно установить две связи на пару узлов на отдельных сетевых интерфейсах. Пара линий может быть настроена для совместного использования нагрузки или активного режима ожидания. Если связь не работает, будет создаваться бесперебойный переход к оставшейся связи, если таковая имеется.
Масштабируемость кластера
С Linux 4.7, TIPC поставляется с уникальным, запатентованным, автоматически адаптивным иерархическим алгоритмом мониторинга соседей. Этот алгоритм Overlapping Ring Monitoring, в действительности комбинация мониторинга кольца и протокола Gossip, позволяет создавать полные кластеры сетей до 1000 узлов с временем обнаружения неисправностей 1,5 секунды, в то время как в небольших кластерах он может быть значительно короче.
Выступление
TIPC обеспечивает выдающиеся характеристики, особенно в отношении времени задержки в обратном направлении. Между узлами он обычно на 33% быстрее, чем TCP, внутри узлов в 2 раза быстрее для небольших сообщений и в 7 раз быстрее для больших сообщений. Между узлами он обеспечивает максимальную пропускную способность на 10-30% ниже, чем TCP, в то время как его пропускная способность внутри узлов на 25-30% выше. Команда TIPC в настоящее время изучает, как добавить поддержку GSO / GRO для сообщений внутри узлов, чтобы соответствовать TCP даже здесь.
Транспортные средства
Хотя они разработаны для использования всех видов транспортных носителей, реализация поддерживает UDP, Ethernet и InfiniBand. Внедрение VxWorks также поддерживает общую память, к которой могут иметь доступ несколько экземпляров операционной системы, работающих одновременно на одном и том же оборудовании.
Безопасность
В настоящее время безопасность должна обеспечиваться транспортными средствами, перевозящими ТИПК. При работе через UDP можно использовать IPSec, а при работе по Ethernet MACSec является лучшим вариантом. Команда TIPC в настоящее время изучает возможность поддержки TLS или DTLS, как нативно, так и в дополнение к OpenSSL.
История
Этот протокол был первоначально разработан Джоном Полом Малоем в Ericsson в течение 1996-2005 годов и использовался этой компанией в кластерных приложениях в течение нескольких лет, прежде чем впоследствии был выпущен в сообщество с открытым исходным кодом и интегрирован в основное ядро Linux. С тех пор он претерпел многочисленные улучшения и модернизации, все выполненные специальной командой проекта TIPC с участниками из различных компаний. Инструмент управления TIPC является частью пакета инструментов iproute2, который поставляется в стандартном виде со всеми дистрибутивами Linux.