Обслуговування великої бази користувачів надійними, узгодженими даними з низькою затримкою є дуже важким завданням для будь-якої команди бекенда. У Ledger ми зробили стратегічний вибір щодо розміщення наших власних основних служб даних блокчейну. Не покладаючись на треті сторони, ми можемо самостійно керувати даними наших клієнтів, гарантуючи, що базові процеси відповідають нашим інструкціям щодо безпеки та орієнтованим на продуктивність цілям рівня обслуговування (SLO).
Але ця стратегія також приносить свої власні труднощі.
Нашим першим завданням є перенесення цих основних служб надання даних із крутих і блискучих інструментів noSQL. У цій статті я розповім, чому ми прийняли це важке рішення, з якими складнощами ми зіткнулися та які переваги ми отримали.
Мета цієї статті — показати технічні аспекти, які змусили нас вибрати PostgreSQL як наш новий базовий рівень зберігання даних блокчейну.
Глибоке занурення в Blockchain Data
Дані блокчейна мають кілька ключових особливостей.
По-перше, він постійно зростає, і нічого з нього ніколи не видаляється. Однак на практиці, хоча більша частина блокчейну є незмінною, наймолодша частина блокчейну може змінюватися через конфлікти, які необхідно вирішити. Дійсно, оскільки ланцюжок є одноранговою мережею, кілька законних блоків можуть співіснувати тимчасово. Зазвичай старіший видаляється, що призводить до того, що ми називаємо реорганізацією. Коротше кажучи, дані розподіляються між незмінним холодним хвостом і рідко мінливим головним станом.
Проблема, яку ми намагаємося вирішити, полягає в тому, що, хоча блокчейни чудово підходять для зберігання візантійських відмовостійких даних, вони менш ефективні для нарізання та розділення їх на багато осей. А саме, отримати список операцій, які вплинули на рахунок, дуже складно. Навіть отримати баланс рахунку в такому блокчейні, як біткойн, є проблемою, якщо у вас ще немає списку транзакцій.
Щоб подолати ці проблеми, Ledger Explorer Services індексує весь блокчейн. Це велика, критична та чутлива до продуктивності служба, повністю написана на Scala з використанням коти-ефект висока продуктивність виконання. Ми маємо понад 10 тисяч обертів за секунду на біткойнах, зберігаючи затримку p95 менше 100 мс. Також проводимо набір 😊
Трохи історії
На початку нашої історії, задовго до того, як я приєднався до компанії, рівень служби даних Ledger оброблявся вбудованою базою даних Neo4j. Кожен блок обслуговування індексував власні дані та обслуговував їх локально, що викликало багато проблем.
Узгодженість даних між екземплярами не була гарантована, а сам розмір стану, який потрібно було проіндексувати, у поєднанні з використанням диска та оперативної пам’яті neo4j, не можна було масштабувати. Ця проблема лише погіршилася в міру того, як компанія зростала, що створювало нові екземпляри дедалі складніше.
Кассандра потім було обрано як головний драйвер цієї нової установки: це кластерна база даних з горизонтальним масштабуванням, яка знаходиться на стороні AP теореми CAP. Це вирішує проблеми, пов’язані із спільним використанням даних, і забезпечує чітке відокремлення між індексуванням, компонентом з підтримкою блокчейну та безголовими серверами API.
Але який сенс мати доступ до цілого історичного стану, якщо ми ніколи не збираємося його фактично читати?
Що стосується нашого варіанту використання, необроблені історичні дані потрібні рідко, оскільки стан облікового запису нашого користувача можна агрегувати з них. Це змусило нас поставити під сумнів існуюче рішення для зберігання даних, яке базується на розподіленій базі даних Cassandra.
Обсяг даних, які нам потрібно зберігати в блокчейні, хоча й у терабайтах, не можна назвати «великими даними». Більше того, частина if, яка використовуватиметься для відповідей на більшість запитів (така ж The hot path), ще менша. Сьогодні можна легко знайти типові апаратні сервери з більш ніж 16 ТБ пам’яті NVMe SSD. Вертикальне масштабування є дуже потужним інструментом, як і реляційна база даних.
Нарешті, головна проблема, яку ми мали з поточним налаштуванням cassandra, полягала не в марнотратній моделі зберігання чи погано підігнаному варіанті використання даних, а в незручності для розробників. Виявилося, що розробка нової функції на основі даних на cassandra займає надто багато часу. Ми прагнули реалізувати кожну нову вісь, за якою нам потрібно надати дані.
Враховуючи досвід нашої команди в навичках моделювання даних і знання SQL, PostgreSQL був ідеальним кандидатом. Це рішення перевірено в боях, надійне, легко розширюється, що робить його ідеальним вибором.
Чому ми вибрали SQL замість NoSQL:
- Читає/записує баланси: сценарій використання даних у блокчейні був сильно спотворений щодо читання, а не запису (блокчейн записує дуже мало даних з дуже розумною швидкістю, навіть для такого блокчейну, як Polygon). Cassandra має здатність поглинати дуже велику кількість записів – насправді це шлях читання довше ніж шлях запису.
- Підтримка індексації: Індекси є ключовим компонентом СУБД для відповідей на запити та нових бізнес-кейсів або можливостей. Cassandra має обмежену підтримку індексування. Індекси ефективні, лише якщо в запиті вже визначено спосіб обмеження розділу, на якому виконуватиметься запит. Ми оплачуємо тут вартість, щоб мати довільно розподілені бази даних. Підтримка PostgreSQL для індексів є ефективною, розширюваною та на межі.
- Підтримка агрегації: той самий випадок для агрегації; Оскільки Cassandra не допускає агрегації з кількома розділами та не допускає пропозиції GROUP BY у своїй мові запитів, її підтримки начебто бракує. PostgreSQL пропонує розширену підтримку агрегації, навіть для екзотичних типів даних, таких як діапазони та jsonb blobs.
- Моделювання даних: Cassandra дуже, дуже обмежує можливості моделювання даних. Таблиця повинна бути створена майже для кожного запиту, на який ви хочете відповісти, а дані мають бути денормализовані у великі рядки (повністю використовуючи широкий колонний магазин аспект C*, а також той факт, що автори дуже дешеві). PostgreSQL дозволяє нам використовувати реляційний аспект блокчейну (виклики, транзакції, блоки) і звільняти дисковий простір, заохочуючи повторне використання даних.
- Спеціальні запити та аудит: Можливість використовувати повний стандарт SQL і виконувати довільні запити означає, що ми можемо досліджувати й шукати потенційну першопричину помилки або мати дослідницькі дані для майбутніх випадків використання. Ми дійсно можемо використовувати базу даних як інтерактивний та розумний інструмент, а не як тупе сховище. Робити це на Cassandra без великого та дорогого аналітичного обчислювального кластера, як-от Presto, Spark тощо (і оскільки ми працюємо на «голих металевих» серверах, ми не маємо доступу до легко створюваних інструментів аналізу розподілених даних, таких як EMR).
- Зберігання використання: Кассандра припускає, що сховище дуже дешеве і що кластер можна легко розширити новими машинами. Це означає, що всі обмеження як на індекси, так і на агрегації повинні бути оплачені сховищем. Відсутність глобально ефективних індексів і підтримки об’єднань означає, що нам доведеться денормалізувати та зберігати копію всієї таблиці для кожної осі, яку ми хочемо запитати. PostgreSQL зберігає нам терабайти пам’яті.
- консистенція: Оскільки Cassandra є розподіленою базою даних, орієнтованою на AP (зв’язок здійснюється за допомогою пліток між вузлами), узгодженість є лише кінцевою з точки зору записів. Ви можете налаштувати політику узгодженості кожного оператора як для читання, так і для запису, але ціль цієї бази даних ніколи не полягала в тому, щоб мати сувору узгодженість. PostgreSQL має сильну історію використання для критичних місій і дуже стійкий. Централізація також означає, що в шляху запису немає жодної мережі.
- Транзакції та MVCC:
- Транзакції: підтримує Cassandra лише легкі транзакції на запити DML. Можна застосувати певне дозування (doc), але є численні застереження, а саме те, що рядки мають бути на одному сервері (= розділі), щоб не мати жахливої продуктивності.
- MVCC: Cassandra підтримує відмітку часу рядка, але повний MVCC не гарантується. Ущільнення може стерти застарілі дані, і немає способу повідомити C*, що цього не повинно бути (наприклад, у випадку з транзакцією в PG).
- PostgreSQL підтримує потужну модель MVCC, яка забезпечує послідовний шлях читання для наших користувачів.
- Інструменти: PostgreSQL має багато інших інструментів, які широко використовуються для легкої роботи з базою даних. Більше того, такий засіб, як проліт забезпечує надійне керування версіями схеми бази даних. Ми вже успішно інтегрували його з нашою кодовою базою. Немає еквівалента цьому рівню зрілості на Кассандри.
- Горизонтальна масштабованість: це головна перевага Cassandra. Просто додайте більше машин, коли ваші дані збільшаться. Немає еквівалента для PostgreSQL, оскільки шардинг і розділення потрібно виконувати вручну.
Як ми плануємо масштабувати
Як ми бачили, єдиним недоліком використання налаштування Postgres є масштабування як при читанні, так і при зберіганні. Що ми можемо зробити, щоб подолати це обмеження?
Першим ефективним інструментом, який ми маємо, є відокремлення кожного протоколу або блокчейну, який ми підтримуємо, у власну базу даних, оскільки таким чином можна відповідно масштабувати його відповідно до обсягу та трафіку. Сегментація за доменом бізнесу забезпечує перший рівень масштабування.
Розвиваючи цю концепцію далі, ми також можемо сегментувати холодні історичні дані на часові розділи. В останніх версіях Postgres значно покращено зручність використання розділених таблиць, що дозволяє безперешкодно переміщувати дані між кластером машин. Наприклад, ми могли б використовувати дешевші машини з меншою обчислювальною потужністю для розміщення більшості історичних даних, водночас зберігаючи потужні гіганти, що обслуговують користувачів, зі стеком оперативної пам’яті для розміщення зведених таблиць і останніх операцій користувача.
Цей підхід дуже добре працює в нашому варіанті використання, оскільки в історичному сховищі немає зовнішніх ключів між розділами (усе остаточно приєднується до блоку). З точки зору головного сервера доступ до історичних даних можна навіть отримати прозоро за допомогою розділення та розширення postgres_fdw.
Щоб допомогти розмістити все це на місці, ми також розглянули розширення TimescaleDB. Це розширення додає багато функціональних можливостей до базового postgres, і більшість із них ідеально підходить для наших випадків використання:
- Автоматичне розбиття таблиць на основі стовпця типу часу (у нашому випадку ми адаптуємо його, взявши за орієнтир висоту блокчейну).
- Автоматичне стиснення старих блоків з урахуванням типу даних і на основі стовпців. Це забезпечує майже ідеальний коефіцієнт стиснення завдяки використанню найсучасніших алгоритмів для даних, які дуже схожі.
- Ефективне агрегування на основі часових проміжків для легкого обчислення історичних балансів і графіків ринкових даних.
Ми лише на початку експериментів щодо зберігання, і це відкриває багато варіантів використання. Підтвердження концепції з використанням невеликої кількості даних (~10 тисяч блоків у мережі Ethereum, тобто близько 2 днів даних) показали зменшення дискового простору на 40%.
Як ми бачили, обсяг даних, якщо ми використовуємо правильну стратегію, не є проблемою. Але як масштабувати з розміром нашої бази користувачів?
Тут ми вже маємо хорошу перевагу: ми індексуємо всі дані блокчейна. Таким чином, необхідне сховище буде рости не як кількість користувачів, а як загальний розмір блокчейну. Оптимізація зберігання та читання повністю ортогональна у своїй роздільній здатності.
Ця настройка в поєднанні з дуже низькою потребою в записі пропорційно обсягу зчитування, який потрібно обслуговувати, є налаштуванням мрії для шаблону репліки лідер-послідовник класу. Щоб підвищити подальшу продуктивність і пропускну здатність, ми також можемо розмістити репліки читання Postgres на тих самих машинах, що й сервери API, і скористатися перевагами доменних сокетів UNIX, щоб пропустити мережеві зворотні передачі.
Ось приклад стратегії реплікації даних, яку ми можемо використати для масштабування наших читань. Світло-сірі квадрати представляють окремі сервери. Тут ми бачимо, що модулі API розташовані безпосередньо разом із копіями найактуальніших даних, щоб забезпечити мінімальний час передачі між сховищем і користувачами. Архівні екземпляри, описані раніше, не представлені, щоб не надто ускладнювати схему.
Заключні зауваження
Як тривалий користувач Cassandra, я хочу підкреслити, що це чудова база даних за своїм дизайном, яка підходить для широкого спектру програм. На жаль, вибір, який було зроблено в Ledger щодо його використання, було зроблено на основі використання даних, яке так і не реалізувалося.
Це вплинуло на продуктивність нашої команди, і, з нетерпінням чекаючи на виклики, які нам доведеться вирішити, ми вирішили скуштувати все й не впадати в оману про затонулих витрат.
У багатьох випадках ваші дані не є великими даними. Керування розповсюдженням даних у більшості випадків не є складним завданням, і компроміси повноцінної розподіленої бази даних дійсно потребують ретельного розгляду. Ключовим фактором є досвід розробника, оскільки він звільняє дорогоцінний час для створення чогось іншого. Це реальний варіант використання, у який нам потрібно інвестувати значні кошти.
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- PlatoAiStream. Web3 Data Intelligence. Розширення знань. Доступ тут.
- Карбування майбутнього з Адріенн Ешлі. Доступ тут.
- Купуйте та продавайте акції компаній, які вийшли на IPO, за допомогою PREIPO®. Доступ тут.
- джерело: https://www.ledger.com/blog/serving-web3-at-web2-scale
- : має
- :є
- : ні
- $UP
- 10
- 10K
- 20
- a
- здатність
- Здатний
- доступ
- доступний
- рахунки
- через
- насправді
- пристосовувати
- додавати
- Додає
- дотримуватися
- Перевага
- агрегація
- алгоритми
- ВСІ
- дозволяти
- дозволяє
- вже
- Також
- хоча
- кількість
- an
- аналіз
- аналітика
- та
- відповідь
- будь-який
- все
- API
- застосування
- прикладної
- підхід
- відповідним чином
- архів
- ЕСТЬ
- навколо
- Art
- стаття
- AS
- зовнішній вигляд
- аспекти
- припущення
- At
- доступний
- знати
- геть
- Оси
- Вісь
- Backend
- Balance
- баланси
- база
- заснований
- Базова лінія
- BE
- оскільки
- було
- перед тим
- початок
- Бегемоти
- буття
- Переваги
- між
- Великий
- Великий даних
- Біт
- Біткойн
- Блокувати
- blockchain
- дані блокчейн
- блокчейни
- блоки
- обидва
- Box
- коробки
- Приносить
- Помилка
- будувати
- бізнес
- але
- by
- call
- Виклики
- CAN
- кандидат
- кришка
- обережно
- випадок
- випадків
- Викликати
- викликаний
- централізована
- ланцюг
- виклик
- проблеми
- складні
- зміна
- заміна
- дешево
- більш дешевий
- дешевші машини
- вибір
- Вибирати
- вибрав
- вибраний
- ясно
- кластер
- код
- кодова база
- холодний
- Колонка
- комбінований
- товар
- Комунікація
- компанія
- складності
- компонент
- обчислення
- концепція
- поняття
- розгляду
- вважається
- послідовний
- Прохолодно
- Core
- Коштувати
- може
- створений
- критичний
- Поточний
- дані
- аналіз даних
- обмін даними
- зберігання даних
- Database
- Днів
- рішення
- описаний
- дизайн
- Розробник
- розвивається
- важкий
- безпосередньо
- dirt
- розподілений
- розподіл
- розділений
- do
- робить
- справи
- домен
- Не знаю
- зворотний бік
- мрія
- водій
- два
- e
- кожен
- легко
- легко
- край
- Ефективний
- ефективний
- ще
- вбудований
- підкреслити
- включіть
- заохочення
- підвищувати
- забезпечувати
- гарантує
- забезпечення
- Еквівалент
- і т.д.
- Ефіріума
- ГОЛОВНА МЕРЕЖЕ ETHEREUM
- Навіть
- евентуально
- НІКОЛИ
- Кожен
- все
- приклад
- існуючий
- Екзотичний
- розширюється
- досвід
- експертиза
- дослідити
- дослідник
- продовжити
- розширення
- обширний
- факт
- Падати
- особливість
- риси
- кілька
- знайти
- Перший
- відповідати
- для
- іноземні
- Вперед
- дружелюбність
- від
- Повний
- повноцінний
- повністю
- функціональні можливості
- далі
- майбутнє
- отримання
- даний
- Глобально
- мета
- буде
- графіки
- сірий
- великий
- Group
- Рости
- Зростання
- гарантований
- керівні вказівки
- було
- Жорсткий
- апаратні засоби
- Мати
- має
- голова
- сильно
- висота
- допомога
- тут
- Високий
- дуже
- історичний
- господар
- ГАРЯЧА
- гаряча
- Як
- How To
- Однак
- HTML
- HTTPS
- i
- ідеальний
- if
- непорушний
- вплив
- реалізації
- поліпшений
- in
- все більше і більше
- індекс
- індекси
- екземпляр
- інтегрований
- інтерактивний
- в
- Invest
- залучений
- питання
- питання
- IT
- ЙОГО
- приєднатися
- приєднався
- JPG
- просто
- зберігання
- ключ
- ключі
- Дитина
- відсутність
- мова
- великий
- Затримка
- останній
- шар
- Led
- Гросбух
- законний
- менше
- рівень
- Важіль
- світло
- легкий
- як
- обмеження
- недоліки
- обмеженою
- список
- трохи
- локально
- Довго
- подивився
- шукати
- серія
- низький
- Машинки для перманенту
- made
- головний
- основна мережа
- підтримувати
- Більшість
- Робить
- управляти
- управління
- вручну
- багато
- ринок
- дані ринку
- зрілість
- макс-ширина
- Може..
- засоби
- метал
- мігрувати
- мінімальний
- місіях
- модель
- моделювання
- більше
- Більше того
- найбільш
- рухатися
- багато
- повинен
- а саме
- майже
- Необхідність
- необхідний
- потреби
- ні
- мережу
- ніколи
- Нові
- приємно
- немає
- вузли
- нічого
- номер
- численний
- цілей
- of
- on
- ONE
- тільки
- працювати
- операції
- Можливості
- or
- порядок
- наші
- себе
- над
- Подолати
- власний
- оплачувану
- частина
- Сторони
- шлях
- Викрійки
- Платити
- однолітка
- пірінгових
- ідеальний
- продуктивність
- перспектива
- місце
- план
- plato
- Інформація про дані Платона
- PlatoData
- Стручки
- точка
- політика
- Багатокутник
- це можливо
- postgresql
- потенціал
- влада
- потужний
- практика
- Проблема
- процеси
- продуктивність
- доказ
- частка
- пропонує
- протокол
- доведений
- забезпечувати
- за умови
- put
- запити
- Оперативна пам'ять
- діапазон
- ставка
- швидше
- співвідношення
- Сировина
- Читати
- реальний
- насправді
- розумний
- скорочення
- про
- пов'язаний
- надійний
- реорганізація
- відповідь
- копіювання
- представляти
- представлений
- запросити
- пружний
- дозвіл
- вирішене
- в результаті
- знову використовувати
- право
- міцний
- корінь
- круглий
- ROW
- прогін
- біг
- то ж
- масштаб
- масштабовані
- шкала
- Масштабування
- плавно
- Пошук
- безпеку
- побачити
- бачив
- сегмент
- сегментація
- Продаж
- пункт продажу
- обслуговування
- Послуги
- виступаючої
- комплект
- установка
- кілька
- заточування
- поділ
- Короткий
- Показувати
- сторона
- аналогічний
- з
- один
- Розмір
- навички
- невеликий
- менше
- розумний
- So
- рішення
- ВИРІШИТИ
- Вирішує
- деякі
- Простір
- Іскритися
- Ікра
- SQL
- standard
- стан
- Заява
- зберігання
- зберігати
- Історія
- Стратегічний
- Стратегія
- сильний
- сильно
- Успішно
- підтримка
- Опори
- таблиця
- Приймати
- взяття
- Завдання
- команда
- технічний
- сказати
- terms
- ніж
- Що
- Команда
- Блок
- Держава
- їх
- потім
- Там.
- Ці
- вони
- третій
- треті сторони
- це
- пропускна здатність
- час
- до
- занадто
- інструмент
- інструменти
- Усього:
- ТОТАЛЬНО
- трафік
- угода
- Transactions
- переклад
- прозоро
- тип
- Типи
- Зрештою
- при
- що лежить в основі
- на жаль
- UNIX
- розблокує
- необов'язково
- us
- юзабіліті
- Використання
- використання
- використання випадку
- використовуваний
- користувач
- користувачі
- використання
- зазвичай
- Цінний
- різноманітність
- вертикальний
- дуже
- обсяг
- хотіти
- було
- шлях..
- we
- Web2
- Web3
- ДОБРЕ
- Що
- Що таке
- коли
- який
- в той час як
- У той час як
- всі
- чому
- широкий
- широко
- волі
- з
- без
- працює
- запис
- письмовий
- ви
- Наймолодший
- вашу
- зефірнет