Web3の特徴のひとつは、データのマネタイズへの取り組みです。多くの企業にとって、データは最も価値のある資産の1つになっています。しかし、そのデータから最大の価値を得るためには、データをより効率的に保存し、分析する必要があります。顧客はより複雑なクエリを作成し、より速い結果を求めており、従来のリレーショナル・データベースでは追いつくのがやっとです。MySQLを例にとってみましょう。MySQLの場合、テーブルデータが数千万行に達すると、パフォーマンスが低下します。シャーディングは一般的な解決策ですが、これは複雑な作業です。従来のオンライン分析処理(OLAP)データベースも、このような需要に応えることはできません。
このブログでは、このような問題を解決する効率的でシンプルな方法として、金融サービス企業を例にTiDB + Amazon Web Services (AWS)のソリューションを紹介します。TiDBは、オープンソースのHTAP (Hybrid Transactional and Analytical Processing) データベースで、MySQLと互換性があり、水平方向の拡張が可能です。AWSは、人気の高いクラウドサービスプロバイダーです。AWS上でTiDBを使用するソリューションは、グローバルな金融サービス企業によって、本番環境での効率性が証明されています。同社はTiDBを活用して、データ量の多い金融ダッシュボードを構築し、増え続けるデータをミリ秒単位で遅延を抑えながら保存、処理、分析を行っています。
また、今回はブロックチェーン分析アプリケーションを例に、AWS上で稼働するTiDBがどのようにサポートし、1億行を超える1つのテーブルのデータを処理・分析し、数秒以内にクエリ結果を返すかを詳しく説明します。
ブロックチェーンデータの分析アプリケーションの要件
Web3では、分散型ブロックチェーン技術が最も顕著な「姿」の1つであり、ブロックチェーンのデータは指数関数的に増加しています。例えば、人気のブロックチェーン技術「Ethereum」のアーカイブノードの中には、10億件以上の取引を含む10テラバイト以上のデータが保存されており、Ethereumでは毎日100万件以上の新しい取引が処理されています。さらに難しいのは、多くの企業がこうした膨大な量のデータをリアルタイムで処理し、分析しなければならないことです。
そのために、データを保存・集計するための集中型分析アプリケーションを構築し、データベースやビッグデータ技術を採用して完全な分析を行うことが多いのです。ブロックチェーン分析アプリケーションでは、データそのものが最も重要です。そして、アプリケーションでは次の内容が必要となります:
- 膨大な量のデータ処理:ブロックチェーンデータには、各パブリックチェーンの全データが含まれています。この量はテラバイトになることもあります。大規模なチェーンでは数百億行のデータを持っているものもあります。
- 問い合わせに対するリアルタイム対応:各パブリックチェーンの最新の取引とデータをリアルタイムで同期させ、ユーザーにより正確な分析結果を提供する必要があります。
- 高性能:アプリケーションは、新しいデータの書き込みや同期が行われても、同時に大量のクエリを処理しなければいけません。
- 低レイテンシー:快適なユーザーエクスペリエンスを提供するためには、すべてのクエリとページの読み込みが1秒以内に終了する必要があります。
- 水平方向のスケールアウト:データ量やクエリが急激に増加した場合、アプリケーションシステムはダウンタイムを必要とすることなく、ビジネスへの影響を最小限に抑えながら水平方向にスケールアウトする必要があります。
- 容易な操作やメンテナンス:コスト削減のためには、システムの運用やメンテナンスが簡単でシンプルであることが必要です。
- シンプルな技術スタック:シンプルなテクノロジースタックは、日々の作業や製品開発を容易にします。これは、小規模な開発チームを持っている場合に特に重要です。
- スマートでシンプルなアーキテクチャ:AWSなどのホスティングサービスを活用したクラウドネイティブアーキテクチャであること。これにより、柔軟なスケーラビリティを実現します。
データベースソリューションとしてTiDBを使用
データベースは、ブロックチェーンデータ分析アプリケーションの中核となるものです。以下の図では、TiDBによるブロックチェーンデータの保存と、分析するためのEthereum用分析アプリケーションをサポートについて表しています。
Ethereum向けアプリケーションをサポートするTiDB
アプリケーションの管理やスケールを容易にするために、TiDBをクラウド上に展開することが推奨されます。ここでは、AWS上にTiDBをデプロイします。下図は、この分析アプリケーションのアーキテクチャで、TiDBをAmazon Elastic Kubernetes Service (EKS)上にデプロイしています。
Amazon EKS上のTiDBアーキテクチャ
このアプリケーションをサポートするためにEKS上のTiDBを使用すると、次のような利点があります:
- TiDBはデータを保存するだけでなく、クエリや分析処理も行います。
- コンピューティングとストレージが分離されます。
- TiDBはMySQLと互換性があります。
- EKS上で稼働するTiDBは、アプリケーションを簡単に拡張することができます。
- TiDBのパフォーマンスは、2つの有名なオープンソースの監視システム(PrometheusとGrafana)でリアルタイムに監視されます。
また、KubernetesにおけるTiDBクラスタの自動運用システムであるTiDB OperatorをAmazon EKS上に導入することをお勧めします。こうすることで、Kubernetesの手法を全面的に採用してTiDBクラスタを展開・管理することができます。例えば、TiDBクラスタのスケールインやスケールアウトは、YAMLファイル内のレプリカ数の値を変更するだけです。これを以下に示します。
YAMLファイルでTiDBクラスタを設定する
Note:TiDBをAWS EKS上に手動でデプロイして設定する代わりに、TiDBのフルマネージドDBaaS(Database-as-a-Service)であるTiDB Serverlessを試すこともできます。 TiDB Serverlessは、TiDB on Amazon EKSと同様に堅牢なパフォーマンスを提供し、柔軟性とスケーリングが容易であるため、動的なワークロードや変動するデータ需要にとって魅力的な選択肢となります。
TiDBにデータをインポートする
準備
1. Ethereumのノードを設定します。
2.ブロックチェーンのデータを同期するために、Amazon EC2上でGethをダウンロードし、実行します。
Note: Ethereumノードのセットアップには、Parityなどの他のツールを使用することもできます。
> nohup geth [ --syncmode fast | full| light ] &
3. Amazon EKS上で、TiDBをデプロイします。詳細なガイドについては、ドキュメントDeploy TiDB on AWS EKSを参照してください。
4.EthereumのノードをTiDBで接続します。TiDBはMySQLと互換性があるため、任意のMySQLクライアントで接続することができます。
5.TiDB上で、ブロックチェーンのデータを格納するためのテーブルを作成します。ここでは、blockchain.eth_blockとblockchain.eth_transactionsという2つのサンプルテーブルを作成します。テーブル構造の詳細については、スキーマのドキュメントを参照してください。
CREATE DATABASE blockchain;
CREATE TABLE `blockchain.eth_block` (
`hash` char(66) NOT NULL PRIMARY KEY,
`number` bigint,
`parent_hash` char(66),
`nonce` bigint,
`gas_limit` bigint,
`gas_used` bigint,
`transaction_count` bigint,
`extra_data` text,
`logs` text,
……
)
CREATE TABLE `blockchain.eth_transactions` (
`hash` char(66),
`nonce` bigint,
`block_hash` char(66),
`block_number` bigint,
`transaction_index` bigint,
`from_address` char(42),
`to_address` char(42),
`value` double,
`gas` bigint,
`gas_price` bigint,
`input` mediumtext,
……
)
TiDBにデータをインポートする
EthereumノードからTiDBにデータをインポートするには、オープンソースの抽出、変換、ロード(ETL)ツールであるEthereum ETLを使用します。その最新版をダウンロードすることをお勧めします。
以下のコマンドを実行し、EthereumノードからTiDBにデータをインポートします。
> ethereumetl stream -e block,transaction --start-block <start_position> --end-block <end_position> --provider-uri file://<your_path>/geth.ipc --output=mysql+pymysql://<username>:<password>@<tidb_endpoint>:<port>/<dbname>[?<options>]
TiDBにデータをインポートする
Ethereumノードが起動するとgeth.ipcファイルが作成され、他のサービスがそのサーバーにアタッチしてデータを読み込むことができるようになります。上記のコマンドは、各Ethereumノードのgeth.ipcファイルからブロックチェーンのデータとトランザクションを読み込み、先ほど作成したblockchain.eth_blockテーブルとblockchain.eth_transactionsテーブルに書き込んでいます。
検証
データのインポート処理が完了したら、MySQLクライアント経由でSQL文を実行し、データがTiDBに正しくインポートされたかどうかを検証することができます。以下3つの例を紹介します:
- TiDBに書き込まれた行数が正しいかどうかを確認します。
select count(*) FROM blockchain.eth_block;
select count(*) FROM blockchain.eth_transactions;
- 特定のアドレスの取引記録が正しいかどうか確認します。
SELECT from_address, to_address, time_at from blockchain.eth_transactions where from_address = '0x1XXXXXXXXXXX48';
- Ethereumのトランザクション数が正しいことを確認します。
SELECT sum(value) AS TOTAL FROM blockchain.eth_transactions;
ベンチマーク
この分析アプリケーションを実装するには、大量のデータを1つのテーブルに格納する必要があります。そのためには、高いデータベース性能が必要です。TiDBのパフォーマンスを監視するために、いくつかのストレステストをシミュレーションしてみます。
TiDBのベンチマークを行うにはいくつかの方法があります。ここでは、オープンソースのデータベースベンチマークツールとして有名な「Sysbench」を使用します。それぞれ1億行のデータを持つ50個のテーブルを処理し、合計で約1テラバイトのサイズを持つTiDBの性能をテストしてみます。
テストでは、以下の構成のAmazon EKSクラスタを4つ使用しています。
- 標準-3:TiDBクラスタ3台、TiKVクラスタ3台、PD (Placement Driver)クラスタ3台
Service type | EC2 type | Instances |
PD | m5.xlarge (gp3 20GB 3000 IOPS 125MB/s) | 3 |
TiKV | i3.4xlarge (2 x 1,900 GB NVMe SSD) | 3 |
TiDB | c5.4xlarge (gp3 20GB 3000 IOPS 125MB/s) | 3 |
- Hybrid-6:TiDBクラスタ6台、TiKVクラスタ6台、PDクラスタ3台
Service type | EC2 type | Instances |
PD | m5.xlarge (gp3 20GB 3000 IOPS 125MB/s) | 3 |
TiDB | i3.4xlarge (2 x 1900 GB NVMe SSD) | 6 |
TiKV | i3.4xlarge (2 x 1,900 GB NVMe SSD) | 6 |
- Hybrid-12:TiDBクラスタ12台、TiKVクラスタ12台、PDクラスタ3台
Service type | EC2 type | Instances |
PD | m5.xlarge (gp3 20GB 3000 IOPS 125MB/s) | 3 |
TiDB | i3.4xlarge (2 x 1900 GB NVMe SSD) | 12 |
TiKV | i3.4xlarge (2 x 1,900 GB NVMe SSD) | 12 |
- Hybrid-18:TiDBクラスタ18台、TiKVクラスタ18台、PDクラスタ3台
Service type | EC2 type | Instances |
PD | m5.xlarge (gp3 20GB 3000 IOPS 125MB/s) | 3 |
TiDB | i3.4xlarge (2 x 1900 GB NVMe SSD) | 18 |
TiKV | i3.4xlarge (2 x 1,900 GB NVMe SSD) | 18 |
TiDBの性能は主に、ポイントセレクト、読み取りと書き込み、書き込みのみの3つのシナリオでテストしています。
ポイントセレクト
Sysbenchの実行:
> sysbench —config-file=config oltp_point_select —tables=50 — table-size=100000000 run
Sysbenchの結果:
point_select 50 tables (100m rows per table) 1TB data in total |
||||
TiDB | Standard-3 | Hybrid-6 | Hybrid-12 | Hybrid-18 |
Threads | 2500 | 3500 | 4000 | 10000 |
Max QPS | 72,035 | 121,559 | 293,274 | 482,598 |
95% latency (ms) | 44.17~137.35 | 34.33~82.96 | 20.74~56.84 | 15~44.17 |
読み取り・書き込み
Sysbenchの実行:
> sysbench —config-file=config oltp_read_write —tables=50 — table-size=100000000 run
Sysbenchの結果:
read_write 50 tables (100m rows per table) 1TB data in total |
||||
TiDB | Standard-3 | Hybrid-6 | Hybrid-12 | Hybrid-18 |
Threads | 2500 | 3500 | 4000 | 10000 |
Max QPS | 61,048.60 | 55,872.14 | 112,274.7 | 170,125.06 |
95% latency (ms) | 475.79~1836.24 | 601.29~2120.76 | 314.45~1191.92 | 287.38~787.74 |
書き込みのみ
Sysbenchの実行:
> sysbench —config-file=config oltp_write_only —tables=50 — table-size=100000000 run
Sysbenchの結果:
write_only 50 tables (100m rows per table) 1TB data in total | ||||
TiDB | Standard-3 | Hybrid-6 | Hybrid-12 | Hybrid-18 |
Threads | 2500 | 3500 | 4000 | 10000 |
Max QPS | 31,375.17 | 40,469.28 | 78,566.19 | 119,137.42 |
95% latency (ms) | 325.98~1089.3 | 292.6~1050.76 | 150.29~569.67 | 114.72~390.3 |
テストの結果、スレッド数の増加に伴い、TiDBクラスタはスケールアウトし、最大QPSは大幅に増加し、95%の待ち時間が短縮されることがわかりました。
- ストレステストではCPUリソースの使用量を制限していないため、本番環境と比較してレイテンシーが相対的に高くなる可能性があります。
まとめ
Sysbenchの結果、TiDBは継続的に増加するビジネストラフィックにも、突然のスパイクにも、安定した低レイテンシーを維持しながら対応できることが分かりました。あるサービスプロバイダは、このソリューションを使って、数十のパブリックチェーンのデータをカバーする高度なDeFi Dashboardを構築しました。TiDBは高性能です。1つのTiDBクラスタが保存するデータ量は100テラバイトを超え、現在も増え続けています。平均QPSは25,000~30,000、P99レイテンシーは50ms程度です。
ビジネスを減速させることなく大量のデータを処理・分析する必要があるデータ集約型アプリケーションを構築している場合、Amazon EKS上に展開されたTiDBによるソリューションをぜひご検討ください。ビジネスに影響を与えることなく簡単にスケールインまたはスケールアウトでき、OLTPとOLAPの両方のワークロードを処理することができます。また、オープンソースのEthereum ETLツールにより、データの移行、製品開発、運用・保守コストの削減を容易に行うことができます。
TiDBを体験するには、無料サインアップよりTiDB Serverlessをお試しください。日本語ドキュメントのTiDBクイックスタートガイド、または無料オンライントレーニングのご利用をお勧めします。ご不明な点などございましたら、お問い合わせフォームよりご連絡ください。 また、GitHubにて問題を報告することもできます。
参考情報:
NFTマーケットプレイスに適したデータベースを選択する方法
Spring BootとTiDBによるWebアプリケーションの構築
TiDB CloudとSnowflakeでEコマースシステムを構築する
TiDB Cloud Dedicated
TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。
TiDB Cloud Serverless
TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。