Масштабирование DLT до более 1 млн TPS в Google Cloud

Масштабирование DLT до более 1 млн TPS в Google Cloud

Источник · Перевод автора

Radix достигает рекордных 1,4 миллиона финансовых транзакций в секунду, используя инфраструктуру Google Cloud всего за 700 долларов. Тест, который воспроизводил 10-летнюю историю транзакций биткойн менее чем за час, что делается на 1.187 серверах Google, распространяется в 17 странах.

Самая высокая пропускная способность Alipay и более чем в два раза среднее количество сообщений, отправляемых WhatsApp в секунду.

Базовая технология Radix, как мы провели тестирование и как используется Google Cloud Platform (GCP).

Если вы хотите заново создать тест или использовать любой из инструментов, весь соответствующий код доступен здесь:

https://github.com/radixdlt/mtps

Какова была цель этого теста?

Создание протокола TCP (TCP, UDP и так далее) позволяет устанавливать общедоступное соединение с общедоступными, не имеющими разрешения общими ресурсами для бизнеса и отдельных лиц для подключения из любой точки мира.

Децентрализованные технологии Ledger (например, Bitcoin и Facebook Libra) представляют собой следующий этап оцифровки глобальной экономики: государственная инфраструктура, которая может хранить, передавать и программировать деньги, активы и права.

Однако интернет-протоколы несут только информацию; они не хранят информацию после передачи. Кроме того, протокол не заботится о тысячах, миллионах или миллиардах людей.

Деньги не могут быть скопированы – например. Вам запрещено отправлять один и тот же цифровой доллар двум разным людям. Чтобы этого не происходило, система должна иметь постоянно обновляемую запись о том, кому что принадлежит.

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

Самая большая проблема, которую Radix намеревался решить, заключалась в том, как создать протокол, который позволял бы работать одновременно более чем 7,5 миллиардам человек и 500 миллиардам устройств? Этот тест является первым шагом в путешествии, чтобы подтвердить, что наша технология может масштабироваться.

Что такое DLT (технология распределенной книги)?

DLT – это общий термин, который охватывает технологии блокчейна, включая биткойн и Ethereum, технологии DAG (направленный ациклический граф), включая IOTA и Hashgraph, и новые архитектуры, такие как Tempo. Tempo – это архитектура, которую Radix разрабатывает специально для достижения масштабируемости и пропускной способности, необходимых для DLT.

Сеть DLT характеризуется системой общей записи, которая не может быть обновлена. Он часто используется для транзакционных систем, поскольку он хорошо подходит для обеспечения применения более сложных систем правил, часто называемых «смарт-контрактами».

Чем отличается архитектура Radix DLT?

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

На Radix ваш адрес кошелька определенно отображает вас в клочок, на котором живут ваши средства и информация о транзакциях. В результате, нет необходимости в глобальном состоянии – просто состояние уровня шарда.

Любой компьютер может присоединиться к сети и стать «узлом». Эти узлы могут обслуживать столько сегментов, сколько позволяют их локальные ресурсы (ЦП / ОЗУ / хранилище). Несмотря на то, что узел может варьироваться, общее количество шардов в сети Radix всегда составляет 18,4 квинтиллионных шарда (2⁶⁴).

Узлы, работающие с одинаковыми осколками, являются избыточными друг для друга, что означает, что они действительны. Транзакция, как правило, проверяется, по крайней мере, двумя различными шардами: шардом адреса источника (a.k.a., отправляющий кошелек) и диапазоном шардов адреса назначения (читай, принимающего кошелька).

Эта иллюстрация выше иллюстрирует конфигурацию диапазона сегментов в Radix, с зелеными вертикальными линиями, указывающими пространство статического сегмента, и горизонтальными линиями, представляющими узлы и количество пространства сегмента, которое каждый обслуживает.
Чтобы узнать больше о том, как это работает на практике, посмотрите это короткое видео о шардинге в Radix.

Как Radix DLT разворачивается в Google Cloud?

Тестовый сценарий

1187 узлов (виртуальных машин, в которых запущен регистр Radix) разделены на 17 облачных зон Google (центров обработки данных).

Во время теста каждый узел настроен на небольшое перекрытие друг с другом. Мы сделали это, разрезав доступные шарды (2⁶⁴) на части по 2⁴⁴. Затем мы распределили узлы равномерно по этим частям. Шарды, обслуживаемые узлом, называются «диапазоном осколков узла». Во время теста каждый диапазон осколков узла имел примерно 10%-ное перекрытие с диапазоном осколков узла его соседних узлов.

Этот сценарий предназначен для достижения максимальной пропускной способности сети с минимальными затратами. В производственной сети мы ожидаем, что каждый из них будет покрыт как минимум 100 различными узлами. Это не имеет большого значения для пропускной способности.
Во время теста узлы «сплетничают» друг с другом для обмена транзакционной информацией и метаданными (через UDP). В сети Radix каждый узел сплетничает (в среднем) до восьми случайных пиров; таким образом, сложность распространения составляет O (8n), как описано здесь.

Примечания о состоянии сети

Там, где это возможно, мы хотели создать тестовый сценарий. Это включает в себя:

  • Использование только общедоступных IP-адресов
  • Географическое распределение узлов

Основным узким местом между континентами по-прежнему является скорость света, что делает задержки пакетов умеренно репрезентативными. Однако следует отметить, что во время теста Gossipped Transactions никогда не покидали высокопроизводительную сеть Google, и это уменьшало задержки между узлами.

При нормальной работе не происходит потери пакетов в сетях Google. Предполагается, что обычная потеря пакетов в Интернете составляет менее 3%; который хочет снизить эффективность основной сети Radix примерно на столько же по сравнению с этими тестами.

Узел Explorer

Узел Explorer очищает и объединяет метрики и данные со всех других узлов. Наиболее важной службой, размещенной на узле Explorer, является служба Explorer, которая обслуживает пользовательский интерфейс и предоставляет API метрик. Radix поддерживает публичную версию

Explorer по адресу: https://test.radixdlt.com/.

Узел подготовки набора данных

Узел подготовки набора данных преобразует транзакционные данные биткойна в транзакционные данные, совместимые с Radix, чтобы их можно было воспроизвести в сети Radix. Процесс очень загружает процессор и требует интенсивного ввода-вывода, поэтому мы решили разместить его отдельно.

Эта функция состоит из двух сервисов, которые мы создали для этой цели:

Механическая обработка

Каждый оптимизированный тестовый прогон стоит около 700 долларов. Чтобы сократить время работы виртуальных машин, мы решили создать собственный образ Ubuntu 16.04 с установленными зависимостями Radix Core (Docker). Для этого мы использовали упаковщик, который хорошо работал в GCE.

Остальная подготовка основных виртуальных машин была выполнена во время начальной загрузки через cloudinit. Этот инструмент вполне может быть использован пользователем облака (Google) Cloud, но нам это нравится, потому что он позволяет нам использовать один и тот же сценарий инициализации для любого облачного провайдера, который его поддерживает (что они почти все делают).

В этом проекте мы используем инструмент управления конфигурацией libcloud. Он предоставляет API-интерфейсы Python и является прямой альтернативой Google Cloud SDK (он же «gcloud»). Мы переключились на libcloud, когда наши скрипты оболочки стали слишком сложными для нас, чтобы их поддерживать. Дополнительным преимуществом использования libcloud перед gcloud является то, что он может включить SSH-клиент python, который, в отличие от gcloud, поддерживает (косвенную) аутентификацию SSH-ключей с использованием Yubikeys.

Как Google помог Radix DLT достичь 1 млн TPS?

Чтобы упростить задачу, мы создали специальный скрипт Python mtps.py, который выполняет все настройки узла за один вызов. Это блок-схема инструмента mtps.py. Этот скрипт идемпотентен, то есть он хочет пропустить уже созданные компоненты.

«Загрузочный узел» находится на обычном базовом узле. Сначала он запускается, поэтому может предоставить конкретный IP-адрес для других узлов.

Предварительные условия

  • Вам необходимо иметь учетную запись Google Cloud
  • Настройте libcloud для использования вашей учетной записи Google Cloud
  • Установите libcloud и paramiko с помощью:pip3 install – пользовательская криптография apache-libcloud paramiko
  • Начните с интерактивного терминала Python: python3

gce = ComputeEngine(
“libcloud@m-tps-test.iam.gserviceaccount.com”,
“~/m-tps-test.json”,
project=”m-tps-test”
)

Узел Explorer и основные узлы должны быть адресованы из Интернета, поэтому нам нужно пробиться через брандмауэр:

explorer_ports = [
{“IPProtocol”: “tcp”, “ports”: [“22”, “443”]},
{“IPProtocol”: “udp”, “ports”: [“20000”]}
]
core_ports = [
{“IPProtocol”: “tcp”, “ports”: [“22”, “443”, “20000”]},
{“IPProtocol”: “udp”, “ports”: [“20000”]}
]
gce.ex_create_firewall(
name=’explorer-ingress-rules’,
allowed=explorer_ports,
description=’explorer-ingress-rules’)
gce.ex_create_firewall(
name=’core-ingress-rules’,
allowed=core_ports,
description=’core-ingress-rules’)

[ doc ] [ source ]

Создать узел Explorer

Следующим шагом является создание узла Explorer, в котором размещается служба Explorer.

ПРИМЕЧАНИЕ. Для этой команды требуется допустимая конфигурация explorer_cloud_init (строка), основанная на этом шаблоне. Создать этот шаблон вручную довольно сложно, поэтому следующий блок кода не может быть выполнен как:

node = gce.create_node(
name = “explorer”,
image = “https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20190530c”,
size = “n1-standard-8”,
location = “europe-west3-a”,
ex_metadata = {“user-data”: explorer_cloud_init},
ex_disks_gce_struct = [
{
‘autoDelete’: True,
‘boot’: True,
‘type’: ‘PERSISTENT’,
‘mode’: ‘READ_WRITE’,
‘deviceName’: “explorer”,
‘initializeParams’: {
‘diskName’: “explorer”,
‘sourceImage’: “https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20190530c”
}
},
]
)

[ doc ] [ source ]

Создать загрузочный узел / Создать основные узлы

HTTPS порт 443 и прослушивание Gossip (UDP) порт 20000.

Создание 1187 базовых узлов один за другим с помощью gce.create_node (как мы делали с узлом Explorer выше) теоретически возможно, но очень неэффективно. Вот почему мы создали группы экземпляров – по одной в каждом регионе GCE.

ПРИМЕЧАНИЕ. Аналогично созданию узла Explorer, для этого базового узла необходимо создать конкретную конфигурацию cloudinit для этого базового узла, который выходит за рамки этого блога.

Облачный регион Google – это географическое местоположение (город) с несколькими дата-центрами (зонами). У Google есть три зоны в каждом регионе. В консоли Google Cloud можно создать группу экземпляров в регионе, не ограничивая ее определенной зоной. Однако libcloud 2.5.0 поддерживает только создание групп экземпляров для каждой зоны. Решением является следующий патч обезьяны, который будет работать до тех пор, пока libcloud не догонит:

def create_core_group(gce, region, size, template, prefix=”cores”):
try:
region = region or gce.region
if not hasattr(region, ‘name’):
region = gce.ex_get_region(region)
request = ‘/regions/%s/instanceGroupManagers’ % (region.name)
manager_data = {}

If the user gave us a name, we fetch the GCEInstanceTemplate for it.

if not hasattr(template, ‘name’):
template = gce.ex_get_instancetemplate(template)
manager_data[‘instanceTemplate’] = template.extra[‘selfLink’]

If base_instance_name is not set, we use name.

manager_data[‘name’] = manager_data[‘baseInstanceName’] = “{0}-{1}”.format(prefix, region.name)
manager_data[‘distributionPolicy’] = dict(
zones = [{“zone”: “zones/” + z.name} for z in gce.ex_list_zones() if z.status == “UP” and z.name.startswith(region.name)]
)
manager_data[‘targetSize’] = size
manager_data[‘description’] = None
gce.connection.request(request, method=’POST’, data=manager_data)
except ResourceExistsError:
pass

[ source ]

Заключительные слова

1M TPS тесты в GCE. В целом, наш опыт работы с платформой очень положительный. Однако некоторые функции отсутствуют, и о них стоит упомянуть более подробно (ниже).

Что нам понравилось в Google Cloud Platform

Надежность и стабильность производительности

Трудно разработать, отладить и реализовать традиционный веб-сервис. Это еще сложнее для приложений с высокой доступностью, где необходимо синхронизировать глобальное состояние между узлами кворума (обычно 3 или 5). Узел на противоположной стороне мира, так как тогда латентность становится серьезной проблемой. Наш тестовый сценарий с 1187 узлами, распределенными по большинству облачных регионов Google, сделал это еще более сложным.

Несмотря на эту сложность и глобальное распространение, облачная платформа Google была для нас непревзойденной и одним из немногих компонентов, с которыми у нас не было проблем. В частности, при анализе изменений производительности между запусками тестов GCE очень последовательный, что позволяет нам сосредоточиться на настройке RadixCore. Чтобы продемонстрировать это, см.

Следующие два графика производительности транзакций в секунду с течением времени. Обратите внимание, что это то же программное обеспечение, та же конфигурация, то же количество регионов GCE, одинаковое количество узлов / регион (1187); единственная разница на 13,5 часов позже, чем у других:

Стабильный API и инструменты

Изначально мы использовали gcloud. До того, когда наш сценарий оболочки (с использованием облачного CLI) стал слишком большим и слишком сложным для обслуживания. В целом мы обнаружили, что у нас не возникает проблем со временем. Единственная недостающая функция – это возможность подключения к нашему YubiKey (ключ SSH).

Проектная безопасность

Нам нравится, что границы GCPsecurity организованы: на верхнем уровне у вас есть ваша организация, а внутри вашей организации вы создаете проекты. В нашем случае в одном проекте выполняются критически важные для бизнеса службы, а в другом – 1M TPS-тестов. Это позволило уровни контроля доступа для наших критически важных для бизнеса услуг по сравнению с тестами 1M TPS.

Решение Google Identity Access Management (IAM) довольно интуитивно понятно. Нам удалось выяснить, какие временные разрешения нам не хватало, путем быстрой проб и ошибок в приложении Cloud Console. Большую часть времени инструмент фактически говорит вам, что разрешение отсутствует.

Поддержка хорошая и отзывчивая

Мы не нуждались в поддержке Google Cloud ни для чего, кроме повышения квот, но для многих.

Мы получили подтверждение и ответ в течение 24 часов, за исключением того, что платформа Google Cloud вышла из строя. Помощь была существенной, хотя получение квот было очень болезненным и трудоемким процессом.

Области для улучшения

Процесс квоты

Прекрасный мир GCP квот! Если вы устали получать то, что хотите: больше виртуальных машин!

Как только вы это выясните, вы можете легко запросить его через Google Cloud Console. На самом деле, это так просто, что заманчиво запускать отдельные запросы на квоты, как только вы понимаете, что что-то упустили. Процессоры до 800 процессоров в одной зоне, особенно если вы хотите перейти с восьми процессоров на 800 процессоров в одной зоне. На некоторых уровнях их организации.

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

Квоты высшего уровня

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

Например, в нашем тестовом сценарии необходимо добавить следующее предложение:

  • Процессоры
  • Используемые IP-адреса
  • Постоянный диск SSD (ГБ)
    В качестве предлагаемого улучшения вместо предоставления каждой квоты пользователю может быть использована более совершенная виртуальная машина. – например, новую форму квоты лучше всего начинать с этого меню:

В новой форме квоты у пользователя будут возможности высокого уровня для:

  • Получить х больше, как это в текущей зоне
  • Получить х больше, как это в текущем регионе
  • Получить х больше, как это в любом регионе
  • Пользовательский (вы бы приняли устаревшую форму квоты)
    Это приведет к более точным и полным запросам квот, что снизит нагрузку на службу поддержки Google Cloud и быстрее разблокирует конечного пользователя.

Вывод

Мы очень гордимся тем, что у нас есть идеальный продукт на восемь недель. Не вдаваясь в подробности, в проекте задействовано много маленьких точек принятия решений.

Один из лучших Мы сделали наш проект на Google Cloud Platform. Это решение было основано на нашем предыдущем опыте работы с GCP; на самом деле мы имеем (и все еще имеем) много того, что мы делаем и что мы делаем.

Инфраструктура Google надежна, и его служба поддержки может обрабатывать нетрадиционные сценарии использования (1187 эфемерных узлов), подобные нашему, и реагировать на них в течение разумного периода времени.