ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。LINEヤフー Tech Blog

テクノロジー

最新ハードウェアを活用するMySQLストレージエンジンの共同研究

本記事は2022年11月に開催した「Tech-Verse 2022」で発表したセッションを要約したものです。アーカイブ動画を文末に掲載しています。質疑応答の様子も収録されていますのでぜひご覧ください。

現在、ヤフーではLINEと協働して、最新ハードウェアを有効活用する独自のMySQLストレージエンジンの研究開発を行っています。まずは共同研究開発の動機となる「Unleash the Power of Data:データの力を解放する」のコンセプトについて説明します。

データが人々の活動を支えると同時に、人々の活動も有益なデータを生み出します。人々の知る、買う、つながる、楽しむといった活動はデータによって支えられています。

例えば、インターネットで物を買う場合、商品情報はデータベースにデータとして保存されます。インターネットで音楽を楽しむ場合に、音楽のデータもデータベースに保存されます。ヤフーとLINEでも、インターネットにおける人々の「知る、買う、つながる、楽しむ」といった活動に貢献する、さまざまなサービスを提供しています。これらのサービスは、ユーザーからのフィードバックというデータをもとに、より良いサービスとなるよう磨き込みを行っています。

良いインターネットサービスを提供するには、速く、安定した良いデータプラットフォームが必要です。遅いデータプラットフォームではデータの検索に時間がかかり、ユーザー体験を損ね、不安定なデータプラットフォームでは必要なときに必要なデータが検索できない問題が生じます。

良いデータプラットフォームの3つの条件

では、良いデータプラットフォームの条件とは一体何でしょうか。さまざまな答えがあると思いますが、今回焦点を当てたいのが、「性能」「安定性」「拡張性」の3点です。

1点目の性能とは大規模なデータやアクセスを高速に処理できるかです。データを高速に処理できるからこそ、ユーザーに「動作が重い」といったストレスを与えず、使い心地の良いサービスを提供できます。

2点目の安定性とは止まらないことです。データプラットフォームが止まれば、それを利用しているインターネットサービスも止まり、ユーザーが情報を得られない、サービスを利用できないといった事態が生じてしまいます。

3点目は拡張性です。インターネットサービスは人々のニーズや社会の変化に対応するように、常に進化や拡張が求められます。データ量やアクセス数の増加にも柔軟に対応できるようにしなければなりません。

すでにヤフーとLINEには高速で、安定し、拡張性があるデータプラットフォームがあり、それを本番環境で安定的に運用しています。2021年3月には、ヤフーを含むZホールディングスがLINEと経営統合したことで、両社がタッグを組み、より良いサービスを作れる体制となりました。

今後は両社サービス間でのコラボレーションが進み、データベースのワークロードが増加していくと予想されます。われわれも、データプラットフォームをより速く、より安定的で、より拡張性の高いものへと進化させる必要が出てきました。そこで新しいデータプラットフォームの創発を目的として、2022年より共同研究開発に着手しています。

注目の新たなハードウェア技術

より高速で、より安定的、より拡張性の高いデータプラットフォームを実現するために、私たちが注目している新しいハードウェア技術があります。大きくメモリ、ネットワーク、ストレージの3つの観点からそれぞれ解説します。

メモリ技術

1点目の「Non-Volatile Memory(以下、不揮発性メモリ)」は「Persistent Memory」とも呼ばれるメモリ技術です。その名の通り、電源を切った後もデータが残るのが特徴です。バイト単位でアクセスでき、性能・容量面ではDRAMとSSDの中間的な性質を有しています。I/O性能面ではSSDよりは優れ、DRAMより劣ります。逆に容量面ではSSDよりは小さく、DRAMよりは大きくなります。

「CXL Memory Pool」のCXLはCompute Express Linkの略で、CPUやGPUなどのアクセラレータ、NIC、メモリといったデバイス類を接続するためのオープンな規格です。同規格のバージョン2.0では、メモリをプーリングして複数のホスト間でそのメモリプールを共有することが可能です。

例えば、下図の右にあるように、CXL 2.0対応のスイッチを経由して巨大なメモリプールを作り、そこから各ホストに割り当てるためのメモリを切り出すことができます。巨大なメモリプールを複数のホストで共有すれば、メモリリソースの利用効率を高められます。

CXL Memory Poolの概念図

CXL対応のCPUやメモリデバイスはまだサンプル出荷段階のものが多く、本格量産は開始されていませんが、いくつかのデバイスベンダーは近日中に量産を開始する意向を示しています。

ネットワーク技術

2点目は高速なネットワーク技術の「RDMA(Remote Direct Memory Access)」と、RDMAをイーサネットネットワークで行う「RoCE(RDMA over Converged Ethernet)」です。RDMAは、ターゲットと呼ばれるリモートマシン上のメモリにイニシエイターと呼ばれるI/O発行元のマシンから、低レイテンシでデータを書き込んだり、読み込んだりする技術です。

RDMA/RoCEでは、データが配置されているユーザー空間のメモリから、カーネル空間へのデータコピーが発生しない、すなわちゼロコピーと呼ばれる形のデータ転送が可能です。距離に強く影響されますが、極めて低いレイテンシで、イニシエイターとターゲット間でのデータ転送やデータ同期が可能です。またRDMA/RoCEは主にHPC(ハイパフォーマンスコンピューティング)分野で使われますが、データベースのデータ同期や不揮発性メモリ間でのデータ同期にも使われています。

ストレージ技術

3点目は新しい記憶階層、記憶デバイスに対応したストレージソリューションです。昨今では不揮発性メモリやNVMe SSDsといった新しい記憶デバイスに対応したストレージソリューションが登場してきています。

これらのソリューションはSoftware Defined Storage(SDS)やハードウェアアプライアンスとして提供されており、HPCやAIのワークロード高速化に用いられています。このような新しいストレージソリューションの1つに「DAOS(Distributed Asynchronous Object Storage)」と呼ばれるSDSがあります。

DAOSは不揮発性メモリやNVMe SSDsの高速性を活かすように最適化されています。DAOSが稼働するストレージノードに対して、POSIX APIやMPI(Message Passing Interface)を通してI/Oを発行することで、低レイテンシでスループットの高いI/Oが可能になります。

不揮発性メモリの高速性を引き出すMySQL独自ストレージエンジン

ヤフーとLINEの共同研究開発では、データベースの新しい記憶階層である不揮発性メモリの高速性を生かせる、MySQLストレージエンジンのアーキテクチャ研究と、その開発実装を行っています。具体的には、不揮発性メモリにデータベースのデータやインデックスデータを含むヒープファイル、トランザクションの永続性やアトミック性を保証するためのログファイルを配置し、それにバイト単位でアクセスすることで、データベース処理の高速化を狙っています。

加えて、データベースはさまざまなインターネットサービスの基盤となるので、あるデータベースノードが障害を起こしても、インターネットサービスの提供が継続できるように、不揮発性メモリの性能特性を生かしつつも、耐障害性を実現する機能も実装しています。

具体的には、イニシエイターに対応するMySQLのソースノードからターゲットとなるレプリカノードに対して、トランザクションコミット時にログをRDMAに転送します。これにより、不揮発性メモリの性能特性である低レイテンシを生かしつつ、ソースとレプリカ間でデータ同期を図ります。

ソースノードが障害で落ちた場合には、アプリケーションの接続先をレプリカノードに自動的に切り替えて、アプリケーション処理を継続することで、止まらないインターネットサービスの提供を実現できます。

独自開発によりI/Oスループットは3倍以上に

不揮発性メモリの高速性を活かすためとはいえ、「わざわざ独自のストレージエンジンを作る必要があるのか?」「MySQLのデフォルトストレージエンジンであるInnoDBを不揮発性メモリで実行すれば良いのでは?」という疑問を抱く方もいるかもしれません。これについて、少し説明します。

下図は不揮発性メモリ搭載マシンで、同メモリに10並列で書き込みした際のI/Oスループットを示したものです。ハードウェアのスペック上、理論的に達成可能なI/Oスループットの上限は22.2GB/secです。左側のConventional File Accessとあるものが不揮発性メモリでInnoDBを動かした場合に実行されるアクセス方法ですが、この方法では理論上限の4分の1未満の5GB/sec程度の I/O スループットです。

不揮発性メモリ搭載マシンで、同メモリに10並列で書き込みした際のI/Oスループットを示したグラフ

一方、不揮発性メモリに最適化した独自のアクセス方法を利用したI/Oスループットが右です。こちらでは、理論上限値の70%以上である15GB/secを実現しました。

これらの結果から、不揮発性メモリの性能を引き出すには、やはりストレージエンジンからメモリへのアクセス方法を独自に最適化する必要があるとご理解いただけるかと思います。これが私たちが独自にストレージエンジンの研究開発を行っている理由です。

実運用を想定し、バックアップの仕組みも独自に構築

このようなストレージエンジンを実際のインターネットサービスで使う場合に重要となる、運用面の技術開発も共同で進めています。例えば、独自ストレージエンジンが管理するデータのバックアップやリストア機能がそれにあたります。

MySQLのデフォルトストレージエンジンであるInnoDBであれば、既存ツールでフルバックアップや差分/増分バックアップを取得することが可能です。

一方で、私たちが開発している独自ストレージエンジンは、レコードやページのフォーマットがInnoDBとは異なるため、差分バックアップや増分バックアップを取る手段がありませんでした。そこでこれらのバックアップを取得する処理を共同で開発し、NASやS3互換のオブジェクトストレージにアップロードする機能を実装しました。現在はそれらのバックアップデータを用いて、任意の地点にデータをリストアする機能も実装中です。

不揮発性メモリの容量以上のデータを取り扱う際の対処

これまでの話は、全てのデータを不揮発性メモリに配置することを前提としたものでしたが、サーバに搭載した不揮発性メモリの容量以上のデータを取り扱いたい場合にも対応できるよう研究開発も進めています。

新しいストレージソリューションの一つであるDAOSを、われわれの独自ストレージエンジンと連携する開発もその1つです。具体的にはDAOSのクラスターからプールというストレージ領域を切り出し、独自ストレージエンジンを組み込んだMySQLのソース・レプリカからなるクラスターを共有する機能です。このプールをストレージエンジンのテーブルスペース領域として使うことで、不揮発性メモリ容量以上のデータの取り扱いが可能です。

すでに切り出したDAOSプールの空き容量が少なくなると、DAOSプールのサイズをオンライン拡張して対処するような、「共有ディスク型アーキテクチャ」の機能開発も共同で進めています。

補足すると、DAOSは主要ハードウェアベンダーが主導して開発しているOSSのSDSソリューションです。下図の右はDAOS内部アーキテクチャ概要図です。DAOSのクラスターは複数のノードから構成され、各ノードに搭載されている不揮発性メモリとNVMe SSDsはターゲットと呼ばれる論理単位で管理します。プールを作成する際、それをどのターゲットから構成するかを指定します。

DAOS内部アーキテクチャ概要図

例えば小容量のDAOSプールを作成するなら、2つのターゲットから構成します。より大容量のDAOSプールを作成するなら、3つ以上のターゲットからプールを作ることで初期容量のコントロールが可能です。プール容量を拡張するなら、対象プールに新たなターゲットを加えることで容量拡張できます。

DAOSクライアントプログラムとの連携方式

DAOSとわれわれが独自に開発しているストレージエンジンを含め、DAOSクライアントプログラムとの連携方式には複数の選択肢があります。

1点目はFUSEを使った方法です。DAOSプールをソースノードやレプリカノードにFUSEマウントすることで、POSIX I/Oの発行が可能です。この連携方式ではPOSIX I/OでDAOSプールにアクセスできるため、DAOS以外の別環境にもストレージエンジンが対応できて、ポータビリティが優れているという特性があります。

一方で、この連携方式ではFUSEデーモンがPOSIX I/OをDAOSのネイティブAPIに変換する必要があるため、その変換処理に起因する性能面でのオーバーヘッドが生じます。

2点目は1点目と同様にFUSEを使いますが、こちらはDAOSプールへのRead/Writeリクエスト発行時に、カーネル空間をバイパスする最適化ライブラリを使います。これで性能面のオーバーヘッドを抑えつつ、ポータビリティも維持します。

3点目はDAOSのネイティブAPIをストレージエンジンから直接発行する連携方式です。この方法が性能面では最も良くなりますが、DAOS環境以外と連携できず、ポータビリティの課題が発生します。

これら3点の連携方式の中から、私たちは性能面もポータビリティも優れている2点目を選択し、ストレージエンジンとDAOSの連携機能を現在実装中です。

サービスを良くするためのデータプラットフォームを目指して

最後に今後の共同研究開発の方向性について説明します。

1点目は、私たちが開発している独自ストレージエンジンと最新のハードウェア技術を有効活用するDAOSのような拡張性の高いストレージとの連携の進化です。

具体的にはストレージエンジンを組み込んだ複数のMySQLクラスターから、DAOSのような拡張性の高いストレージを共有するマルチテナンシー化を進めたいと思います。これを進めるにあたり、異なるテナント間でノイジーネイバーのような性能競合が発生しないように、パフォーマンスのアイソレーション、QoS管理にも努めます。

2点目は、ストレージエンジンを組み込んだMySQLクラスターと拡張性の高いストレージを一体化した、統合管理の仕組みの検討を進めることです。より安定的で安心できる統合管理、統合運用技術の検討も進めます。

3点目はDAOS以外の拡張性の高いストレージエンジンとの連携も検証し、拡張性の高いストレージエンジンの汎用性やその他ストレージとの接続確認も進めます。

より将来を見据えると、CXLメモリ対応とメモリプーリングを見据えた研究開発も進めていきたいと思います。複数のデータベースクラスター間で巨大なCXLメモリプールを共有し、実際のメモリ使用量に合わせてオンラインでメモリを共有するといった検討をしていきます。

性能要求が高いサービスに対してはCXLメモリを用いてデータをインメモリ化したり、バッファヒット率を高くして性能要件を満たしたり、実際のメモリ使用量に合わせてメモリプールをオンラインで追加するなどの技術検討も進めていきます。

ヤフーとLINEは今後も力を合わせて、より良いサービスを実現するため、速く安定的でより拡張性の高いデータプラットフォームの研究開発を進めていきます。

アーカイブ動画

こちらの記事のご感想を聞かせください。

  • 学びがある
  • わかりやすい
  • 新しい視点

ご感想ありがとうございました


松浦 聖平
データベースエンジニア
ヤフーでデータベース技術の研究開発を行っています。

このページの先頭へ