Обслуживание большой пользовательской базы надежными, согласованными данными с малой задержкой — очень сложная задача для любой серверной команды. В Ledger мы сделали стратегический выбор в пользу размещения собственных основных сервисов данных блокчейна. Не полагаясь на третьи стороны, мы можем сами управлять данными наших клиентов, гарантируя, что базовые процессы соответствуют нашим рекомендациям по безопасности и ориентированным на производительность целям уровня обслуживания (SLO).
Но эта стратегия также приносит свои собственные проблемы.
Наша первая задача — перенести эти основные сервисы предоставления данных с классных и блестящих инструментов noSQL. В этой статье я подробно расскажу о том, почему мы приняли это трудное решение, о сложностях, с которыми мы столкнулись, и о преимуществах, которые мы получили.
Цель этой статьи — показать технические аспекты, которые привели нас к выбору PostgreSQL в качестве нашего нового базового уровня хранения данных блокчейна.
Глубокое погружение в данные блокчейна
Данные блокчейна имеют несколько ключевых особенностей.
Во-первых, он постоянно растет, и из него никогда ничего не удаляется. Однако на практике, хотя большая часть блокчейна неизменяема, самая младшая часть блокчейна может измениться из-за конфликтов, которые необходимо разрешить. Действительно, поскольку цепочка является одноранговой сетью, несколько законных блоков могут временно сосуществовать. Обычно старая удаляется, в результате чего мы называем реорганизацию. Короче говоря, данные делятся на неизменный холодный хвост и редко меняющееся состояние головы.
Проблема, которую мы пытаемся решить, заключается в том, что, хотя блокчейны отлично подходят для хранения византийских отказоустойчивых данных, они менее эффективны для их разделения по многим осям. А именно, получить список операций, затронувших учетную запись, очень сложно. Даже получение баланса счета в блокчейне, таком как биткойн, является проблемой, если у вас еще нет списка транзакций.
Чтобы преодолеть эти проблемы, Ledger Explorer Services индексирует всю цепочку блоков. Это большой, критически важный и чувствительный к производительности сервис, полностью написанный на Scala с использованием кошачий эффект высокая производительность во время работы. У нас более 10 95 об/с в биткойнах, при этом задержка хвоста p100 составляет менее XNUMX мс. Мы также набираем .
Немного истории
В начале нашей истории, задолго до того, как я присоединился к компании, уровень обслуживания данных Ledger обрабатывался встроенной базой данных Neo4j. Каждый блок обслуживания индексировал свои собственные данные и обслуживал их локально, что вызывало много проблем.
Согласованность данных между экземплярами не гарантировалась, а сам размер состояния, которое необходимо было проиндексировать, в сочетании с использованием диска и оперативной памяти neo4j не поддавался масштабированию. Эта проблема только усугублялась по мере роста компании, что усложняло создание новых экземпляров.
Кассандра затем был выбран в качестве основного драйвера этой новой установки: это кластеризованная, горизонтально масштабируемая база данных, которая находится на стороне AP теоремы CAP. Он решает проблемы, связанные с совместным использованием данных, и обеспечивает четкое разделение между индексированием, компонентом, поддерживающим блокчейн, и безголовыми API-серверами.
Но какой смысл иметь доступ ко всему историческому состоянию, если мы никогда не собираемся его читать?
Что касается нашего варианта использования, необработанные исторические данные редко нужны, потому что из них можно агрегировать состояние учетной записи нашего пользователя. Это побудило нас бросить вызов существующему решению для хранения данных, основанному на распределенной базе данных Cassandra.
Объем данных, который нам нужно хранить в каждой цепочке блоков, хотя и находится в диапазоне терабайт, это не то, что можно назвать «большими данными». Более того, часть if that будет использоваться для ответа на большинство запросов (он же Hot path) еще меньше. В настоящее время можно легко найти стандартные аппаратные серверы с более чем 16 ТБ хранилища NVMe SSD. Вертикальное масштабирование — очень мощный инструмент, как и реляционная база данных.
Наконец, основная проблема, с которой мы столкнулись при текущей настройке cassandra, заключалась не в расточительной модели хранения или плохо подогнанном сценарии использования данных, а в недостатке удобства для разработчиков. Разработка новой функции на основе данных в cassandra оказалась излишне трудоемкой. Мы стремились реализовать каждую новую ось, по которой нам нужно предоставить данные.
Учитывая опыт нашей команды в области моделирования данных и знания SQL, PostgreSQL был идеальным кандидатом. Это решение проверено в боевых условиях, надежно и легко расширяемо, что делает его идеальным выбором.
Почему мы выбрали SQL, а не NoSQL:
- Чтение/запись остатков: вариант использования данных блокчейна был сильно перекошен в отношении чтения, а не записи (блокчейн записывает очень мало данных с очень разумной скоростью, даже для такого блокчейна, как Polygon). Cassandra способна поглощать очень большое количество операций записи — путь чтения на самом деле дольше чем путь записи.
- Поддержка индексации: индексы являются ключевым компонентом СУБД для ответа на запросы и новые бизнес-кейсы или возможности. Cassandra имеет ограниченную поддержку индексации. Индексы эффективны только в том случае, если в запросе уже указан способ ограничения раздела, в котором будет выполняться запрос. Мы платим здесь стоимость иметь произвольно распределенный база данных. Поддержка PostgreSQL для индексов эффективна, расширяема и находится на переднем крае.
- Поддержка агрегации: тот же случай для агрегации; поскольку Cassandra не допускает многораздельную агрегацию и не допускает предложения GROUP BY в своем языке запросов, ее поддержка отсутствует. PostgreSQL предлагает обширную поддержку агрегирования даже для экзотических типов данных, таких как диапазоны и большие двоичные объекты jsonb.
- Моделирование данных: Cassandra очень и очень ограничивает возможности моделирования данных. Таблица должна быть создана почти для каждого запроса, на который вы хотите ответить, и данные должны быть денормализованы в большие строки (полностью используя широкий колонный магазин аспект C*, а также тот факт, что писатели стоят очень дешево). PostgreSQL позволяет нам использовать реляционный аспект блокчейна (вызовы, транзакции, блоки) и свободное дисковое пространство, поощряя повторное использование данных.
- Специальные запросы и аудит: Возможность использовать полный стандарт SQL и выполнять произвольные запросы означает, что мы можем исследовать и искать потенциальную основную причину ошибки или иметь исследовательские данные для будущих вариантов использования. Мы действительно можем использовать базу данных как интерактивный и интеллектуальный инструмент, а не как простое хранилище. Делая это на Cassandra без обширного и дорогостоящего вычислительного кластера аналитики, такого как Presto, Spark и т. д. (а поскольку мы работаем на серверах без операционной системы, у нас нет доступа к легко создаваемым инструментам анализа распределенных данных, таким как EMR).
- Использование памяти: Cassandra предполагает, что хранилище очень дешевое и что кластер можно легко расширить за счет новых машин. Что означает, что все ограничения как на индексы, так и на агрегации должны быть оплачены хранилищем. Отсутствие глобально эффективных индексов и поддержки соединения означает, что мы должны денормализировать и хранить копию всей таблицы для каждой оси, которую мы хотим запросить. PostgreSQL экономит нам терабайты памяти.
- Согласованность: Поскольку Cassandra является распределенной базой данных, ориентированной на точки доступа (связь между узлами осуществляется путем обмена сообщениями), согласованность возможна только в отношении операций записи. Вы можете настроить политику согласованности каждого оператора как для чтения, так и для записи, но целью этой базы данных никогда не было строгой согласованности. PostgreSQL имеет богатую историю использования для критически важных задач и обладает высокой устойчивостью. Централизованность также означает, что в пути записи нет сети.
- Транзакции и MVCC:
- Транзакции: Cassandra поддерживает только легкие транзакции по запросам DML. Может быть применена некоторая пакетная обработка (док), но есть множество предостережений, а именно то, что строки должны находиться на одном сервере (= разделе), чтобы не иметь ужасной производительности.
- MVCC: Cassandra поддерживает отметку времени строки, но полный MVCC не гарантируется. Сжатие может стереть устаревшие данные, и нет способа сказать C*, что этого делать не следует (как, например, в случае с транзакцией в PG).
- PostgreSQL поддерживает мощную модель MVCC, которая обеспечивает согласованный путь чтения для наших пользователей.
- Инструменты: PostgreSQL имеет гораздо больше инструментов, которые широко используются для упрощения работы с базой данных. Кроме того, такой инструмент, как пролетный путь гарантирует, что мы поддерживаем строгое управление версиями схемы базы данных. Мы уже успешно интегрировали его с нашей кодовой базой. На Кассандре нет эквивалента с таким уровнем зрелости.
- Горизонтальная масштабируемость: это ключевой аргумент в пользу Cassandra. Просто добавляйте больше машин по мере расширения ваших данных. Нет эквивалента для PostgreSQL, так как сегментирование и разбиение необходимо выполнять вручную.
Как мы планируем масштабироваться
Как мы видели, единственным недостатком использования установки Postgres является масштабирование как при чтении, так и при хранении. Что мы можем сделать, чтобы преодолеть это ограничение?
Первый эффективный инструмент, который у нас есть, — это выделить каждый протокол или блокчейн, который мы поддерживаем, в свою собственную базу данных, которая, таким образом, может быть соответствующим образом масштабирована с учетом объема и трафика. Сегментация по доменам бизнеса обеспечивает первый уровень масштабирования.
Развивая эту концепцию, мы также можем разделить холодные исторические данные на временные разделы. Последние версии Postgres значительно улучшили удобство использования секционированных таблиц, что позволяет беспрепятственно перемещать данные по кластеру машин. Например, мы могли бы использовать более дешевые машины с меньшей вычислительной мощностью для размещения большей части исторических данных, сохраняя при этом мощных гигантов с оперативной памятью, обслуживающих пользователей, для размещения агрегированных таблиц и последних операций пользователя.
Этот подход очень хорошо работает в нашем случае использования, потому что в историческом хранилище нет внешних ключей между разделами (в конечном итоге все привязано к блоку). С точки зрения главного сервера доступ к историческим данным может быть даже прозрачным с использованием секционирования и расширения postgres_fdw.
Чтобы помочь разместить все это на месте, мы также изучили расширение TimescaleDB. Это расширение добавляет множество функций к базовому postgres, и большинство из них идеально подходят для наших вариантов использования:
- Автоматическое разбиение таблиц на основе временного столбца (в нашем случае мы адаптируем его, взяв за основу высоту блокчейна).
- Автоматическое сжатие старых фрагментов с учетом типа данных и столбцов. Это обеспечивает почти идеальную степень сжатия за счет использования современных алгоритмов для очень похожих данных.
- Эффективная агрегация на основе периодов времени для простого вычисления исторических балансов и графиков рыночных данных.
Мы только начинаем экспериментировать с хранилищем, и это открывает множество вариантов использования. Доказательство концепции с использованием небольшого количества данных (~ 10 тыс. блоков в основной сети Эфириума, то есть около 2 дней данных) показал сокращение места на диске до 40%.
Как мы видели, объем данных, если мы используем правильную стратегию, не является проблемой. Но как масштабироваться с размером нашей пользовательской базы?
Здесь у нас уже есть приятное преимущество: мы индексируем все данные блокчейна. Таким образом, необходимое хранилище будет расти не как количество пользователей, а как общий размер блокчейна. Оптимизации хранения и чтения полностью ортогональны по своему разрешению.
Эта конфигурация в сочетании с очень низкой потребностью в записи по сравнению с объемом чтения, который необходимо обслуживать, является идеальной конфигурацией для шаблона реплики лидера-последователя. Чтобы еще больше повысить производительность и пропускную способность, мы также можем разместить реплики чтения postgres на тех же машинах, что и серверы API, и воспользоваться преимуществами сокетов домена UNIX, чтобы пропустить круговые поездки по сети.
Вот пример стратегии репликации данных, которую мы могли бы использовать для масштабирования чтения. Светло-серые прямоугольники обозначают отдельные серверы. Здесь мы видим, что модули API расположены непосредственно рядом с репликами самых горячих данных, чтобы обеспечить минимальное время передачи между хранилищем и пользователями. Экземпляры архива, описанные ранее, не представлены, чтобы не слишком усложнять схему.
Заключительные замечания
Как давний пользователь Cassandra, я хочу подчеркнуть, что это отличная база данных по своему дизайну, которая подходит для самых разных приложений. К сожалению, выбор, сделанный в Ledger для его использования, был сделан на примере использования данных, который так и не был реализован.
Это повлияло на производительность нашей команды, и, предвкушая проблемы, которые нам предстоит решить, мы решили стиснуть зубы и не поддаваться на заблуждение о невозвратных затратах.
Во многих случаях ваши данные не являются большими данными. Управление распределением данных в большинстве случаев не является сложной задачей, и действительно необходимо тщательно взвесить компромиссы, связанные с полноценной распределенной базой данных. Ключевым моментом является опыт разработчика, поскольку он высвобождает драгоценное время для создания чего-либо еще. Это реальный вариант использования, в который нам нужно вложить значительные средства.
- SEO-контент и PR-распределение. Получите усиление сегодня.
- ПлатонАйСтрим. Анализ данных Web3. Расширение знаний. Доступ здесь.
- Чеканка будущего с Эдриенн Эшли. Доступ здесь.
- Покупайте и продавайте акции компаний PREIPO® с помощью PREIPO®. Доступ здесь.
- Источник: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :имеет
- :является
- :нет
- $UP
- 10
- 10K
- 20
- a
- способность
- в состоянии
- доступ
- Доступ
- Учетная запись
- через
- на самом деле
- приспосабливать
- Добавить
- Добавляет
- придерживаться
- плюс
- агрегирование
- алгоритмы
- Все
- позволять
- позволяет
- уже
- Также
- Несмотря на то, что
- количество
- an
- анализ
- аналитика
- и
- ответ
- любой
- все
- API
- Приложения
- прикладной
- подхода
- надлежащим образом
- архив
- МЫ
- около
- Искусство
- гайд
- AS
- внешний вид
- аспекты
- предположение
- At
- доступен
- знать
- прочь
- ОСИ
- Ось
- Backend
- Баланс
- Остатки
- Использование темпера с изогнутым основанием
- основанный
- Базовая линия
- BE
- , так как:
- было
- до
- начало
- Бегемоты
- не являетесь
- Преимущества
- между
- большой
- Big Data
- Немного
- Bitcoin
- Заблокировать
- блокчейн
- данные блокчейна
- блокчейны
- Блоки
- изоферменты печени
- Коробка
- коробки
- Приносит
- Ошибка
- строить
- бизнес
- но
- by
- призывают
- Объявления
- CAN
- кандидат
- глава
- осторожно
- случаев
- случаев
- Вызывать
- вызванный
- централизованная
- цепь
- вызов
- проблемы
- сложные
- изменение
- изменения
- дешево
- более дешевый
- более дешевые машины
- выбор
- Выберите
- выбрал
- выбранный
- Очистить
- Кластер
- код
- кодовая база
- холодный
- Column
- сочетании
- товар
- Связь
- Компания
- сложности
- компонент
- Вычисление
- сама концепция
- понятия
- рассмотрение
- считается
- последовательный
- Холодные
- Основные
- Цена
- может
- создали
- критической
- Текущий
- данным
- анализ данных
- обмен данными
- хранение данных
- База данных
- Дней
- решение
- описано
- Проект
- Застройщик
- развивающийся
- трудный
- непосредственно
- грязь
- распределенный
- распределение
- Разделенный
- do
- приносит
- дело
- домен
- Dont
- нижняя сторона
- мечта
- водитель
- два
- e
- каждый
- легко
- легко
- Edge
- Эффективный
- эффективный
- еще
- встроенный
- подчеркивать
- включить
- поощрение
- повышать
- обеспечивать
- обеспечивает
- обеспечение
- Эквивалент
- и т.д
- Эфириума
- ОСНОВНАЯ СЕТЬ Эфириума
- Даже
- эвентуальный
- НИКОГДА
- Каждая
- многое
- пример
- существующий
- Экзотический
- раскрываться
- опыт
- опыта
- Больше
- исследователь
- продлить
- расширение
- обширный
- факт
- Осень
- Особенность
- Особенности
- несколько
- Найдите
- First
- соответствовать
- Что касается
- иностранный
- вперед
- дружелюбие
- от
- полный
- полноценный
- полностью
- функциональные возможности
- далее
- будущее
- получающий
- данный
- ГЛОБАЛЬНО
- цель
- будет
- Графики
- серый
- большой
- группы
- Расти
- Рост
- гарантированный
- методические рекомендации
- было
- Жесткий
- Аппаратные средства
- Есть
- имеющий
- сильно
- высота
- помощь
- здесь
- High
- очень
- исторический
- кашель
- ГОРЯЧИЙ
- горячие
- Как
- How To
- Однако
- HTML
- HTTPS
- i
- идеальный
- if
- неизменный
- влияние
- Осуществляющий
- улучшенный
- in
- все больше и больше
- индекс
- Индексы
- пример
- интегрированный
- интерактивный
- в
- Грин- карта инвестору
- вовлеченный
- вопрос
- вопросы
- IT
- ЕГО
- присоединиться
- присоединился
- JPG
- всего
- хранение
- Основные
- ключи
- Вид
- Отсутствие
- язык
- большой
- Задержка
- последний
- слой
- привело
- Ledger
- законный
- Меньше
- уровень
- Кредитное плечо
- легкий
- легкий
- такое как
- ограничение
- недостатки
- Ограниченный
- Список
- мало
- в местном масштабе
- Длинное
- смотрел
- искать
- серия
- Низкий
- Продукция
- сделанный
- Главная
- mainnet
- поддерживать
- Большинство
- Создание
- управлять
- управления
- вручную
- многих
- рынок
- Данные рынка
- зрелость
- макс-ширина
- Май..
- означает
- металл
- мигрировать
- минимальный
- миссиях
- модель
- моделирование
- БОЛЕЕ
- Более того
- самых
- двигаться
- много
- должен
- а именно
- почти
- Необходимость
- необходимый
- потребности
- ни
- сеть
- никогда
- Новые
- хороший
- нет
- узлы
- ничего
- номер
- многочисленный
- целей
- of
- on
- ONE
- только
- работать
- Операционный отдел
- Возможности
- or
- заказ
- наши
- себя
- за
- Преодолеть
- собственный
- выплачен
- часть
- Стороны
- путь
- шаблон
- ОПЛАТИТЬ
- вглядываться
- пиринговых
- ИДЕАЛЬНОЕ
- производительность
- перспектива
- Часть
- план
- Платон
- Платон Интеллектуальные данные
- ПлатонДанные
- Стручки
- Точка
- политика
- Polygon
- возможное
- Postgresql
- потенциал
- мощностью
- мощный
- практика
- Проблема
- Процессы
- производительность
- доказательство
- доля
- предлагает
- протокол
- доказанный
- обеспечивать
- при условии
- положил
- Запросы
- Оперативная память
- ассортимент
- Обменный курс
- скорее
- соотношение
- Сырье
- Читать
- реальные
- на самом деле
- разумный
- снижение
- по
- Связанный
- складская
- реорганизация
- ответ
- копирование
- представлять
- представленный
- запросить
- упругий
- Постановления
- решен
- в результате
- снова использовать
- правую
- надежный
- корень
- год
- РЯД
- Run
- Бег
- то же
- масштаб
- масштабируемые
- Шкала
- масштабирование
- легко
- Поиск
- безопасность
- посмотреть
- видел
- сегмент
- сегментация
- продажа
- пункт продажи
- обслуживание
- Услуги
- выступающей
- набор
- установка
- несколько
- Sharding
- разделение
- Короткое
- показывать
- сторона
- аналогичный
- с
- одинарной
- Размер
- навыки
- небольшой
- меньше
- умный
- So
- Решение
- РЕШАТЬ
- Решает
- некоторые
- Space
- Искриться
- Порождать
- SQL
- стандарт
- Область
- заявление
- диск
- магазин
- История
- Стратегический
- Стратегия
- сильный
- сильно
- Успешно
- поддержка
- Поддержка
- ТАБЛИЦЫ
- взять
- с
- Сложность задачи
- команда
- Технический
- сказать
- terms
- чем
- который
- Ассоциация
- The Block
- Государство
- их
- тогда
- Там.
- Эти
- они
- В третьих
- третье лицо
- этой
- пропускная способность
- время
- в
- слишком
- инструментом
- инструменты
- Всего
- ПОЛНОСТЬЮ
- трафик
- сделка
- Сделки
- перевод
- прозрачно
- напишите
- Типы
- В конечном счете
- под
- лежащий в основе
- К сожалению
- Юникс
- отпирает
- необязательно
- us
- юзабилити
- Применение
- использование
- прецедент
- используемый
- Информация о пользователе
- пользователей
- через
- обычно
- ценный
- разнообразие
- вертикальный
- очень
- объем
- хотеть
- законопроект
- Путь..
- we
- Web2
- Web3
- ЧТО Ж
- Что
- Что такое
- когда
- который
- в то время как
- В то время как
- все
- зачем
- широкий
- широко
- будете
- без
- работает
- записывать
- письменный
- являетесь
- Самый молодой
- ВАШЕ
- зефирнет