更新日:2019/11/01
中園 翔(なかぞの しょう)/内山 寛之(うちやま ひろゆき)
IoT(Internet of Things)においてモノどうしがやり取りし合う状況や、複数のWebサービスが連携し、自動でAPI(Application Programming Interface)を呼び出し合うなど、機械やプログラムがその他のサービスを呼び出すM2M(Machine to Machine)が台頭しています。結果として、これまでにないほどの膨大なデータベース処理が発生しています。近年、CPU上のトランジスタ数はムーアの法則にしたがって増加していますが、それらはCPUのコア数を増加させることで実現されてきました(図1)。既存のデータベースでは、このようなメニーコアCPUを想定してつくられていないため、コア数を増やすとむしろデータベース処理のスループットが減少する例が報告されています(1)。増加するデータベース処理に対応するため、読込処理が大半を占めるユースケースに対しては、メニーコアCPUにおいてもスケールするSiloといった研究プロダクトが提案されています(2)。しかし、これらのプロダクトは、更新処理が多いユースケースにおいては、スケールしないことが知られています。IoTを用いたサービスが増加するにつれて、モノの位置や温度といったセンサ情報や数万点にものぼるサプライチェーンマネージメントの状態を逐次更新する必要が生じています。
また、キャッシュレス決済や小額決済、小額の送金等の処理においても、更新処理量の増加が見込まれています。これらの処理は、トランザクションの分離性*1を担保しながら更新される必要があります。各CPUコアが並列して処理する際に、同じデータ群に対する読み書きを、1つずつ処理することで分離性を担保して処理を行うことができます。しかし、このような処理の仕方では、各CPUコアは、お互いの処理が終わるのを待ってから処理をするためにスケールせず、データベース処理のスループットは減少してしまいます。
図2では、データベース処理に利用される既存のアルゴリズムが、CPUコア数に対してトータルスループットがどのように変化するかを示しています。コア数が32程度でスループットの上限を迎え、さらにコア数を増加させていくと全体のスループットが落ち込んでいくことが観測されます。そのため、更新処理の多いユースケースに対しては、データベースが利用されている現場においては、データベースの分離レベル*2を緩和することで、処理性能を高速化するなどの対応が取られています。しかし、このような対応では、危険性がつきまといます。例えば、あるビットコインの交換所では、分離レベルを下げたデータベースを用いたために、ハッカーから攻撃を受け、交換所にある通貨をすべて引き出されてしまい、交換所が閉鎖に追い込まれるという事態となりました。必ずしも事業が停止するほどのインパクトがあるわけではないにせよ、実際に処理したデータが分離性を持たない場合、何らかの影響を事業やユーザに与える可能性があります。以上のことから、データベースの分離性を担保したうえで、メニーコアCPU上における読込・更新・削除処理を高速化することは、サービスを安定かつ低コストで提供するために極めて重要な課題となります。
前述のように、読込の多いユースケースにおいては、いくつかの高速処理手法が提案されてきましたが、今後想定される更新処理の多いユースケースに対しては、処理を高速化することができませんでした。1つのデータに対して、更新処理を複数のコアが並列して実行した場合、どちらかが必ず待つ必要があるためです。この課題に対し、NTTソフトウェアイノベーションセンタでは、Invisible Writeと呼ばれる新たな手法を開発し、更新処理の大幅な高速化を実現しました。本手法では、「誰にも読まれないならば、更新処理を行う必要がない」ことに着目し、もっとも安全な分離レベルを担保しつつ、更新処理の入替を…