Проблемы и решения горизонтальной масштабируемости EMQX — кластеризация брокера MQTT, часть 3

В этом сообщении блога мы представим некоторые улучшения масштабируемости кластера брокера MQTT. В основном мы сосредоточимся на механизме базы данных, который EMQX использует внутри, и на том, как мы улучшили его в EMQX 5.0.

Прежде чем мы начнем, вы должны знать, как данные реплицируются в кластере EMQX: EMQX Брокер хранит информацию времени выполнения о темах и клиентах в Мнезия база данных, которая помогает реплицировать эти данные в кластере.

Что такое Мнезия?

Давайте более подробно обсудим, что такое Мнезия и как она работает. Mnesia — это система управления базами данных с открытым исходным кодом, разработанная корпорацией Ericsson в рамках Открытая телекоммуникационная платформа. Первоначально он предназначался для обработки данных конфигурации и времени выполнения в телекоммуникационных коммутаторах уровня ISP. Вплоть до версии 4.3 EMQX использовал его для хранения всех видов данных времени выполнения, таких как темы, маршруты, правила ACL, сигналы тревоги и многое другое.

Вы, вероятно, знакомы с базами данных, такими как MySQL, Postgres, MongoDB, и хранилищами в памяти, такими как Redis и Memcached. Мнезия, с другой стороны, остается относительно неясной. Тем не менее, он уникален во многих отношениях, отчасти потому, что он сочетает в себе множество функций вышеупомянутых продуктов в одном удобном приложении.

Мы начнем с довольно академического определения: Mnesia — это встроенная распределенная транзакционная база данных NoSQL. Это довольно много! Итак, давайте разберемся, что все это значит.

Встроенный

Начнем с «встроенной» части. Наиболее широко используемые базы данных, такие как MySQL и Postgres, используют модель клиент-сервер: база данных работает в отдельном процессе, часто на выделенном сервере, и бизнес-приложения взаимодействуют с ней, отправляя запросы по сети или сокету домена UNIX и ожидая. для ответов. Эта модель удобна во многих отношениях, поскольку позволяет отделить бизнес-логику от хранилища и управлять ими отдельно. Однако у него есть и недостатки: взаимодействие с удаленным процессом неизбежно увеличивает задержку для каждого запроса.

Напротив, встроенные базы данных выполняются в том же процессе, что и бизнес-приложение. Одним из ярких примеров встроенной базы данных является SQLite. Mnesia также попадает в эту категорию: она работает в том же процессе, что и остальные приложения EMQX. Чтение данных из таблицы Mnesia может быть таким же быстрым, как чтение локальной переменной, поэтому мы можем читать из базы данных в горячих точках без ущерба для производительности.

Распределенный

Ранее мы упоминали, что Mnesia — это распределенная база данных. Это означает, что таблицы реплицируются сетью в разных физических местах. Тип распределенной базы данных, в котором узлы не совместно используют какие-либо физические ресурсы, такие как ОЗУ или диск, а координация осуществляется на уровне приложений, называется архитектурой без общего доступа (SN). Этот подход часто предпочтительнее, поскольку он не требует специального оборудования и может масштабироваться по горизонтали.

Приложение Mnesia, работающее вместе с EMQX, помогает реплицировать обновления таблицы на все узлы в кластере по протоколу распределения Erlang. Это означает, что бизнес-приложения могут считывать обновленные данные локально. Это также помогает с отказоустойчивостью: данные в безопасности, пока жив хотя бы один узел в кластере. EMQX использует эту функцию для репликации информации о маршрутизации в кластере.

Транзакционный

Мнезия поддерживает КИСЛОТА транзакции, что является довольно уникальной функцией встроенной базы данных. Это означает, что несколько операций чтения и обновления могут быть сгруппированы вместе. Транзакция Mnesia является атомарной (она должна быть либо завершена полностью, либо не иметь никакого эффекта), последовательной (хотя гарантии слабее, чем, например, в Postgres), изолированной (она не влияет на другие транзакции) и устойчивой. Все эти гарантии сохраняются во всем кластере.

EMQX использует транзакции Mnesia в тех местах, где важна согласованность данных.

NoSQL

В традиционных реляционных базах данных для взаимодействия с базой данных используется специальный язык запросов, называемый SQL. Часто ОРМ Используется для ускорения разработки. Mnesia, с другой стороны, не имеет специализированного языка запросов: в качестве языка запросов используется Erlang (или Elixir), поэтому нет необходимости в ORM. Он напрямую работает с терминами Erlang, что делает интеграцию с бизнес-логикой очень гладкой.

Архитектура

В кластере Mnesia все узлы равны. Каждый из них может хранить реплики любой таблицы, запускать транзакции и получать доступ к таблицам. Кластер Mnesia использует полносвязную топологию: каждый узел общается со всеми остальными узлами в кластере. Каждая транзакция реплицируется на все узлы в кластере, как показано на рисунке ниже:

Кластер МнезияКластер Мнезия

С точки зрения Теорема CAP (Непротиворечивость, Доступность, Допуск к разделению: выберите два), Mnesia по умолчанию использует AP.

Проблемы

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

Хотя Mnesia не зависит от аппаратного обеспечения, изначально она разрабатывалась с учетом конкретной архитектуры кластера: набора серверов, соединенных между собой быстрой локальной сетью с малой задержкой.

В идеальных условиях ячеистая топология может уменьшить задержку репликации транзакций: вся связь между узлами может осуществляться параллельно, без каких-либо посредников. Однако это ограничивает горизонтальную масштабируемость кластера, так как количество связей между узлами растет пропорционально квадрату числа узлов. Поддержание идеальной синхронизации всех узлов обходится все дороже и дороже, а производительность транзакций падает.

Равный характер узлов также подыгрывал традиционной кластерной парадигме: она упрощала замену одного узла, однако количество узлов, которые могут одновременно присоединиться к кластеру, было ограничено.

Сейчас мы живем в другое время: кластеры развернуты в геоизбыточных облачных средах, все динамично и эфемерно, узлы работают в автомасштабируемых группах, и мы ожидаем, что они все время будут то подниматься, то опускаться.

В ответ на эти вызовы мы разработали расширение Mnesia под названием Mria.

Представляем Мрию

Мария — это расширение с открытым исходным кодом для Mnesia, которое добавляет конечную согласованность кластеру.

Mria переходит от полносвязной топологии к топологии сетка+звезда. Каждый узел принимает на себя одну из двух ролей: ядро ​​или репликант.

Основные узлы ведут себя так же, как обычные узлы Mnesia: они связаны в полную сетку, и каждый узел может инициировать транзакции записи, удерживать блокировки и т. д. Ожидается, что основные узлы будут более или менее статичными и постоянными.

С другой стороны, узлы-репликанты не участвуют в транзакциях. Они подключаются к одному из основных узлов и пассивно копируют транзакции с него. Это означает, что узлам-репликантам не разрешено выполнять какие-либо операции записи самостоятельно. Вместо этого они просят основной узел обновить данные от их имени. При этом у них есть полная локальная копия данных, поэтому доступ для чтения такой же быстрый.

Кластер МрияКластер Мрия

Можно представить себе Mria как комбинацию клиент-сервера и встроенной базы данных: запись идет через сервер, а чтение — локально.

Эта топология кластера решает две проблемы:

  • Горизонтальная масштабируемость
  • Он включает автомасштабирование кластера

Поскольку узлы-репликанты не участвуют в записи, задержка транзакций не увеличивается при добавлении в кластер дополнительных репликантов. Это позволяет создавать более крупные кластеры EMQX.

Кроме того, узлы-репликанты спроектированы так, чтобы быть эфемерными. Их добавление или удаление не повлияет на избыточность данных, поэтому их можно поместить в группу автоматического масштабирования, что позволит улучшить методы DevOps.

В следующем посте мы более подробно обсудим, как настроить EMQX, чтобы в полной мере использовать Mria.

Первоначально опубликовано на

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *