大規模なユーザー ベースに信頼性が高く、一貫性があり、遅延が少ないデータを提供することは、どのバックエンド チームにとっても非常に困難な課題です。 Ledger では、独自のブロックチェーン コア データ サービスをホストするという戦略的な選択をしました。 サードパーティに依存しないことで、当社はクライアントのデータを自社で管理し、基盤となるプロセスが当社のセキュリティ ガイドラインとパフォーマンス指向のサービス レベル目標 (SLO) に確実に準拠していることを確認できます。
しかし、この戦略には独自の課題も伴います。
私たちの最初の課題は、これらのコアなデータ提供サービスをクールで光沢のある noSQL ツールから移行することです。 この記事では、なぜこの難しい決断を下したのか、直面した複雑さ、そして得られたメリットについて詳しく説明します。
この記事の目的は、ブロックチェーン データの新しいベースライン ストレージ レイヤーとして PostgreSQL を選択するに至った技術的側面を示すことです。
ブロックチェーンデータの詳細
ブロックチェーン データにはいくつかの重要な特徴があります。
第一に、それは常に成長し続けており、そこから何も削除されることはありません。 ただし実際には、ブロックチェーンの大部分は不変ですが、ブロックチェーンの最も新しい部分は、解決する必要がある競合により変更される可能性があります。 実際、チェーンはピアツーピア ネットワークであるため、いくつかの正当なブロックが一時的に共存する可能性があります。 通常、古いものが削除され、いわゆる再編成が行われます。 簡単に言うと、データは不変のコールド テールとほとんど変化しないヘッド状態に分割されます。
私たちが解決しようとしている問題は、ブロックチェーンはビザンチンフォールトトレラントなデータを保持するのには優れているものの、多くの軸でデータをスライスしたりダイスしたりするのにはあまり効果的ではないということです。 つまり、アカウントに影響を与えた操作のリストを取得することは非常に困難です。 トランザクションのリストをまだ持っていない場合、ビットコインのようなブロックチェーン上のアカウント残高を取得することさえ困難です。
これらの課題を克服するために、Ledger Explorer Services はブロックチェーン全体のインデックスを作成します。これは、完全に Scala で書かれた大規模で重要なパフォーマンス重視のサービスであり、 猫効果 高性能ランタイム。 テール p10 レイテンシーを 95 ミリ秒未満に維持しながら、ビットコインでは 100 rps を超えています。 募集も行っております 😊。
歴史の少し
私が入社するずっと前の話の始まりでは、Ledger データ サービス層は組み込みの Neo4j データベースによって処理されていました。 各サービング ボックスは独自のデータにインデックスを付けてローカルで提供していたため、多くの問題が発生しました。
インスタンス間のデータの一貫性は保証されておらず、neo4j のディスクと RAM の使用量を考慮すると、インデックスを作成する必要がある状態のサイズが非常に大きく、スケーラブルではありませんでした。 この問題は会社が成長するにつれて悪化するばかりで、新しいインスタンスを生成することがますます困難になってきました。
カサンドラ 次に、この新しいセットアップの主な推進要因として選択されました。これは、CAP 定理の AP 側にある、クラスター化された水平方向にスケーラブルなデータベースです。 これにより、データ共有に関連する問題が解決され、インデックス作成、ブロックチェーン対応コンポーネントとヘッドレス API サーバーの間の明確な分離が可能になります。
しかし、実際に読み取るつもりがないのであれば、歴史的状態全体を利用できるようにすることに何の意味があるのでしょうか?
私たちのユースケースに関しては、ユーザーのアカウントの状態をそこから集約できるため、生の履歴データが必要になることはほとんどありません。 これにより、Cassandra 分散データベースをベースとした既存のデータ ストレージ ソリューションに挑戦することになりました。
ブロックチェーンごとに保存する必要があるデータの量は、テラバイトの範囲ではありますが、「ビッグデータ」と呼べるものではありません。 さらに、ほとんどのクエリに答えるために使用される if の部分 (別名ホット パス) はさらに小さくなります。 現在では、16 TB を超える NVMe SSD ストレージを備えた汎用ハードウェア サーバーを簡単に見つけることができます。 垂直スケーリングは非常に強力なツールであり、リレーショナル データベースも同様です。
最後に、現在の cassandra セットアップで私たちが抱えていた主な問題は、無駄なストレージ モデルでも、適切に適合していないデータ ユースケースでもなく、開発者へのフレンドリーさの欠如でした。 cassandra での新しいデータベースの機能の開発には、不必要に時間がかかることがわかっています。 私たちは、データを提供する必要がある新しい軸をそれぞれ実装することに努めました。
データ モデリング スキルと SQL の熟練度に関する当社チームの専門知識を考慮すると、 PostgreSQL 完璧な候補者でした。 このソリューションは実戦でテストされており、堅牢で拡張が容易であるため、理想的な選択肢となります。
NoSQL ではなく SQL を選択した理由:
- 読み取り/書き込みバランス: ブロックチェーン データのユースケースは、書き込みではなく読み取りに大きく偏っています (Polygon のようなブロックチェーンであっても、ブロックチェーンは非常に合理的な速度でごくわずかなデータを書き込みます)。 Cassandra は、非常に大量の書き込みを吸収する能力を備えています。読み取りパスは実際には より長いです 書き込みパスよりも。
- インデックス作成のサポート: インデックスは、クエリや新しいビジネス ケースや機会に答えるための DBMS の重要なコンポーネントです。 Cassandra のインデックス作成のサポートは限定的です。 インデックスは、クエリが実行されるパーティションを制限する方法がクエリですでに指定されている場合にのみ有効です。 私たちはここで費用を支払います 任意に分散 データベース。 PostgreSQL のインデックスのサポートは効率的で拡張可能で、エッジにあります。
- 集約のサポート: 集計についても同様です。 Cassandra はマルチパーティションの集約を許可せず、クエリ言語で GROUP BY 句を許容しないため、サポートが不足しています。 PostgreSQL は、範囲や jsonb BLOB などの特殊なデータ型でも、広範な集計サポートを提案しています。
- データモデリング: Cassandra は、データ モデリングを可能にする方法が非常に制限されています。 応答したいほぼすべてのリクエストに対してテーブルを作成する必要があり、データを大きな行に非正規化する必要があります ( ワイドコラムストア C* の側面と、ライターが非常に安価であるという事実)。 PostgreSQL を使用すると、ブロックチェーンのリレーショナルな側面 (呼び出し、トランザクション、ブロック) と予備のディスク領域を活用でき、データの再利用が促進されます。
- アドホッククエリと監査: SQL の完全な標準を使用して任意のクエリを実行できるということは、潜在的なバグの根本原因を探索して検索したり、将来のユースケースに備えた探索的なデータを取得したりできることを意味します。 データベースを単なるストレージではなく、インタラクティブでスマートなツールとして実際に使用できます。 Presto、Spark などの大規模でコストのかかる分析コンピューティング クラスターを使用せずに Cassandra 上でこれを実行します (また、ベアメタル サーバー上で実行しているため、EMR などの簡単に生成される分散データ分析ツールにアクセスできません)。
- ストレージの使用状況: Cassandra は、ストレージが非常に安価で、クラスターは新しいマシンで簡単に拡張できると想定しています。 つまり、 インデックスと集計の両方に対するすべての制限は、ストレージで支払う必要があります。。 グローバルに効率的なインデックスと結合のサポートがないため、クエリを実行する軸ごとにテーブル全体のコピーを非正規化して保存する必要があります。 PostgreSQL により、テラバイト規模のストレージが節約されます。
- 一貫性: Cassandra は分散型の AP 指向のデータベースであるため (通信はノード間のゴシップで行われます)、一貫性は書き込みに関しては最終的にのみ発生します。 読み取りと書き込みの両方について各ステートメントの一貫性ポリシーを調整できますが、このデータベースの目標は強い一貫性を持つことではありませんでした。 PostgreSQL には重要なミッションに使用されてきたという強い歴史があり、復元力が非常に優れています。 集中化されているということは、書き込みパスにネットワークが関与していないことも意味します。
- トランザクションとMVCC:
- トランザクション: Cassandra がサポート 軽量トランザクションのみ DML クエリについて。 一部のバッチ処理を適用できます (DOC) ただし、多くの注意点があります。つまり、ひどいパフォーマンスを発生させないためには、行が同じサーバー (= パーティション) 内に存在する必要があるということです。
- MVCC: Cassandra は行タイムスタンプをサポートしていますが、完全な MVCC は保証されていません。 コンパクションによって古いデータが消去される可能性がありますが、それを消去すべきではないことを C* に伝える方法はありません (PG のトランザクションなど)。
- PostgreSQL は、ユーザーに一貫した読み取りパスを保証する強力な MVCC モデルをサポートしています。
- ツーリング: PostgreSQL には、データベースを簡単に操作するために広く使用されているツールが他にもたくさんあります。 さらに、次のようなツール フライウェイ これにより、データベース スキーマの強力なバージョン管理が維持されます。 すでにコードベースと正常に統合されています。 Cassandra には、このレベルの成熟度に匹敵するものはありません。
- 水平方向のスケーラビリティ: これが Cassandra の重要なセールス ポイントです。データが拡大するにつれてマシンを追加するだけです。 シャーディングとパーティショニングは手動で行う必要があるため、PostgreSQL に相当するものはありません。
スケールをどのように計画するか
これまで見てきたように、Postgres セットアップを使用する唯一の欠点は、読み取りとストレージの両方でのスケーリングです。 この制限を克服するにはどうすればよいでしょうか?
私たちが持つ最初の効果的なツールは、サポートするすべてのプロトコルまたはブロックチェーンを独自のデータベースに分離することです。これにより、ボリュームとトラフィックを考慮して適切に拡張できるようになります。 ビジネスドメインごとにセグメント化することで、スケーリングの最初のレイヤーが保証されます。
この概念をさらに進めることで、コールドな履歴データを時間的なパーティションにセグメント化することもできます。 Postgres の最新バージョンでは、パーティション分割テーブルの使いやすさが大幅に向上しており、マシンのクラスタ間でデータをシームレスに移動できるようになります。 たとえば、計算能力の低い安価なマシンを使用して履歴データの大部分をホストしながら、集約されたテーブルとユーザーの最新の操作をホストするために、ユーザーに提供する RAM を積み重ねた巨大な巨大マシンを維持することができます。
履歴ストレージにはパーティション間の外部キーがない (最終的にはすべてがブロックにアタッチされる) ため、このアプローチはこのユースケースでは非常にうまく機能します。 メインサーバーの観点から見ると、パーティショニングと postgres_fdw 拡張機能を使用して履歴データに透過的にアクセスすることもできます。
これらすべてを適切に導入するために、TimescaleDB 拡張機能も検討しました。 この拡張機能はベースライン postgres に多くの機能を追加し、そのほとんどが私たちのユースケースに完璧に適合します。
- 列のような時間に基づいてテーブルを自動的に分割します (この例では、ブロックチェーンの高さを基準にして調整しています)。
- データ型を認識し、古いチャンクを列ベースで自動的に圧縮します。 これにより、非常に類似したデータに対して最先端のアルゴリズムを使用することにより、ほぼ完璧な圧縮率が保証されます。
- 効率的なタイムバケットベースの集計により、過去の残高や市場データのグラフを簡単に計算できます。
私たちはストレージに関する実験を始めたばかりで、これにより多くのユースケースが開かれます。 少量のデータを使用した概念実証 (イーサリアム メインネット上の約 10 ブロック、つまり約 2 日分のデータ) ディスク容量が 40% も削減されたことがわかりました.
これまで見てきたように、適切な戦略を使用すれば、データ量は問題になりません。 しかし、ユーザーベースの規模に応じてどのように拡張するのでしょうか?
ここでは、ブロックチェーン データ全体にインデックスを付けるという優れた利点がすでにあります。 したがって、必要なストレージはユーザーの数のように増加するのではなく、ブロックチェーンの合計サイズのように増加します。 ストレージと読み取りの最適化は、解決策において完全に直交しています。
この設定は、処理する必要がある読み取り量に比例して書き込みの必要性が非常に低いことと相まって、クラス分けリーダー/フォロワー レプリカ パターンにとって夢のような設定です。 パフォーマンスとスループットをさらに向上させるために、API サーバーと同じマシンに postgres リードレプリカを配置し、UNIX ドメイン ソケットを利用してネットワークの往復をスキップすることもできます。
以下は、読み取りをスケールするために使用できるデータ レプリケーション戦略の例です。 明るい灰色のボックスは単一サーバーを表します。 ここでは、ストレージとユーザー間の転送時間を最小限に抑えるために、API ポッドが最もホットなデータのレプリカと直接同じ場所に配置されていることがわかります。 前に説明したアーカイブ インスタンスは、スキーマが複雑になりすぎないように表されていません。
結論
Cassandra の長期ユーザーとして、Cassandra がさまざまなアプリケーションに適した設計の優れたデータベースであることを強調したいと思います。 残念ながら、Ledger でそれを使用するという選択は、決して実現しなかったデータのユースケースに基づいて行われました。
私たちのチームの生産性は影響を受けましたが、解決しなければならない課題を見据えて、サンクコストの誤謬に陥らないように、全力で取り組むことを選択しました。
多くの場合、データはビッグデータではありません。 ほとんどの場合、データ分散の管理は難しい作業ではありませんが、本格的な分散データベースのトレードオフについては、慎重に検討する必要があります。 重要な考慮事項は、他のものを構築するために貴重な時間を解放するための開発者エクスペリエンスです。これは、多額の投資が必要な実際のユースケースです。
- SEO を活用したコンテンツと PR 配信。 今日増幅されます。
- プラトアイストリーム。 Web3 データ インテリジェンス。 知識増幅。 こちらからアクセスしてください。
- 未来を鋳造する w エイドリエン・アシュリー。 こちらからアクセスしてください。
- PREIPO® を使用して PRE-IPO 企業の株式を売買します。 こちらからアクセスしてください。
- 情報源: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :持っている
- :は
- :not
- $UP
- 10
- 10K
- 20
- a
- 能力
- できる
- アクセス
- アクセス
- 越えて
- 実際に
- 適応する
- 加えます
- 追加
- 付着します
- 利点
- 凝集
- アルゴリズム
- すべて
- 許す
- ことができます
- 既に
- また
- しかし
- 量
- an
- 分析
- 分析論
- &
- 回答
- どれか
- 何でも
- API
- 適用された
- アプローチ
- 適切に
- Archive
- です
- 周りに
- 宝品
- 記事
- AS
- 側面
- 側面
- 仮定
- At
- 利用できます
- 知って
- 離れて
- 軸
- 軸
- バックエンド
- バランス
- ベース
- ベース
- ベースライン
- BE
- なぜなら
- き
- 開始
- ベヒーモス
- さ
- 利点
- の間に
- ビッグ
- ビッグデータ
- ビット
- Bitcoin
- ブロック
- ブロックチェーン
- ブロックチェーンデータ
- ブロックチェーン
- ブロック
- 両言語で
- ボックス
- ボックス
- もたらす
- バグ
- ビルド
- ビジネス
- 焙煎が極度に未発達や過発達のコーヒーにて、クロロゲン酸の味わいへの影響は強くなり、金属を思わせる味わいと乾いたマウスフィールを感じさせます。
- by
- コール
- コール
- 缶
- 候補者
- キャップ
- 慎重に
- 場合
- 例
- 原因となる
- 生じました
- 集中型の
- チェーン
- 挑戦する
- 課題
- 挑戦
- 変化する
- 変化
- 安い
- 安い
- 安い機械
- 選択
- 選択する
- 選んだ
- 選ばれた
- クリア
- クラスタ
- コード
- コードベース
- 冷たい
- コラム
- 組み合わせた
- 商品
- コミュニケーション
- 会社
- 複雑さ
- コンポーネント
- 計算
- コンセプト
- コンセプト
- 考慮
- 見なさ
- 整合性のある
- クール
- 基本
- 費用
- 可能性
- 作成した
- 重大な
- 電流プローブ
- データ
- データ分析
- データ共有
- データストレージ
- データベース
- 日
- 決定
- 記載された
- 設計
- Developer
- 開発
- 難しい
- 直接に
- 土
- 配布
- ディストリビューション
- 分割された
- do
- ありません
- すること
- ドメイン
- ドント
- 下側
- 夢
- ドライバー
- 原因
- e
- 各
- 簡単に
- 簡単に
- エッジ(Edge)
- 効果的な
- 効率的な
- ほかに
- 埋め込まれた
- 強調する
- enable
- 心強い
- 高めます
- 確保
- 確実に
- 確保する
- 同等の
- 等
- イーサリアム
- イーサリアムメインネット
- さらに
- やがて
- EVER
- あらゆる
- すべてのもの
- 例
- 既存の
- エキゾチック
- 拡大する
- 体験
- 専門知識
- 探る
- エクスプローラ
- 伸ばす
- 広範囲
- 実際
- 秋
- 特徴
- 特徴
- 少数の
- もう完成させ、ワークスペースに掲示しましたか?
- 名
- フィット
- 外国の
- フォワード
- 親しみやすさ
- から
- フル
- 本格的
- 完全に
- 機能性
- さらに
- 未来
- 受け
- 与えられた
- グローバルに
- 目標
- 行く
- グラフ
- グレー
- 素晴らしい
- グループ
- 成長する
- 成長
- 保証
- ガイドライン
- 持っていました
- ハード
- Hardware
- 持ってる
- 持って
- 重く
- 高さ
- 助けます
- こちら
- ハイ
- 非常に
- 歴史的
- host
- HOT
- 一番ホットな
- 認定条件
- How To
- しかしながら
- HTML
- HTTPS
- i
- 理想
- if
- 不変
- 影響を受けた
- 実装
- 改善されました
- in
- ますます
- index
- 索引
- 統合された
- 相互作用的
- に
- 投資する
- 関係する
- 問題
- 問題
- IT
- ITS
- join
- 参加した
- JPG
- ただ
- 保管
- キー
- キー
- 種類
- 欠如
- 言語
- 大
- レイテンシ
- 最新の
- 層
- ツェッペリン
- 元帳
- 正当な
- less
- レベル
- 活用します
- 光
- 軽量
- ような
- 制限
- 制限
- 限定的
- リスト
- 少し
- 局部的に
- 長い
- 見
- 探して
- たくさん
- ロー
- マシン
- 製
- メイン
- メインネット
- 維持する
- 大多数
- 作成
- 管理します
- 管理する
- 手動で
- 多くの
- 市場
- 市場データ
- 満期
- 最大幅
- 五月..
- 手段
- 金属
- 移動します
- 最小限の
- ミッション
- モデリング
- 他には?
- さらに
- 最も
- ずっと
- しなければなりません
- すなわち
- ほぼ
- 必要
- 必要とされる
- ニーズ
- どちらでもありません
- ネットワーク
- 決して
- 新作
- nice
- いいえ
- ノード
- 何も
- 数
- 多数の
- 目的
- of
- on
- ONE
- の
- 操作する
- 業務執行統括
- 機会
- or
- 注文
- 私たちの
- 自分自身
- が
- 克服する
- 自分の
- 支払われた
- 部
- パーティー
- path
- パターン
- 支払う
- ピア
- ピアツーピア
- 完璧
- パフォーマンス
- 視点
- 場所
- 計画
- プラトン
- プラトンデータインテリジェンス
- プラトデータ
- ポッド
- ポイント
- 方針
- ポリゴン
- 可能
- Postgresql
- 潜在的な
- 電力
- 強力な
- 練習
- 問題
- ラボレーション
- 生産性
- 証明
- 割合
- 提案する
- 実績のある
- 提供します
- 提供
- 置きます
- クエリ
- RAM
- 範囲
- レート
- むしろ
- 比
- Raw
- 読む
- リアル
- 本当に
- 合理的な
- 削減
- に対する
- 関連する
- 信頼性のある
- 再編
- 返信
- レプリケーション
- 表す
- で表さ
- 要求
- 弾力性のあります
- 解像度
- 解決
- 結果として
- 再利用
- 右
- 堅牢な
- ルート
- 円形
- 行
- ラン
- ランニング
- 同じ
- スカラ
- ド電源のデ
- 規模
- スケーリング
- シームレス
- を検索
- セキュリティ
- 見て
- セグメント
- セグメンテーション
- 販売
- セールスポイント
- サービス
- サービス
- サービング
- セッションに
- いくつかの
- シャーディング
- シェアリング
- ショート
- 表示する
- 側
- 同様の
- から
- サイズ
- スキル
- 小さい
- より小さい
- スマート
- So
- 溶液
- 解決する
- 解決する
- 一部
- スペース
- スパーク
- スポーン
- SQL
- 標準
- 都道府県
- ステートメント
- ストレージ利用料
- 店舗
- ストーリー
- 戦略的
- 戦略
- 強い
- 強く
- 首尾よく
- サポート
- サポート
- テーブル
- 取る
- 取得
- 仕事
- チーム
- 技術的
- 言う
- 条件
- より
- それ
- ブロック
- ステート
- アプリ環境に合わせて
- その後
- そこ。
- ボーマン
- 彼ら
- 三番
- 第三者
- この
- スループット
- 時間
- 〜へ
- あまりに
- ツール
- 豊富なツール群
- トータル
- 完全に
- トラフィック
- トランザクション
- 取引
- 転送
- 透明に
- type
- 最終的に
- 下
- 根本的な
- 残念ながら
- UNIX
- ロック解除
- 不必要に
- us
- 使いやすさ
- 使用法
- つかいます
- 使用事例
- 中古
- ユーザー
- users
- 通常
- 貴重な
- 多様
- 垂直
- 非常に
- ボリューム
- 欲しいです
- ました
- 仕方..
- we
- Web2
- Web3
- WELL
- この試験は
- 何ですか
- いつ
- which
- while
- 一方で
- 全体
- なぜ
- ワイド
- 広く
- 意志
- 無し
- 作品
- 書きます
- 書かれた
- 貴社
- 最年少
- あなたの
- ゼファーネット