スピーカー 1
こんにちは。いつもの雑談、まじめな技術、訳していつまじラジオのJです。
スピーカー 2
森原です。
スピーカー 1
今日は第2回ということで、僕がJの方から1つ持ち込みです。
僕の持ち込みですが、年末年始に、NewSQL徹底入門っていう書籍を読んだんで、
それの感想とか、こういうものだよっていう、ちょっとした話をできればなと思っています。
スピーカー 2
あれさ、僕も読もうと思ってたんだけど、Kindle版だとめっちゃ遅いっていうね。
スピーカー 3
あ、発売がね。
スピーカー 2
そうそう。
スピーカー 1
まだかな、1月の下旬ぐらいだったのかな。中頃から下旬ぐらいだったなと思ったから、
僕もどっち買おうかなと思って、あ、まだねえやと思って、書籍、紙の方を買いました。
スピーカー 2
でかいの?
スピーカー 1
いやいや、全然でかくないですよ。
ページ数もそんなになくて、サイズもそんなに大きくない。
ページ数が230とかぐらいかな。
240ぐらいか。240ページだから。
そんなにボリュームもないし、読みやすかったんで、内容も良かったんで、基本的には全員におすすめです。
ニューSQLに興味なくてもおすすめ。
スピーカー 2
作者がMickさんで、かなりSQL周りの名調を出してる方。
スピーカー 3
Mickさんと小林孝博さんという方が書いてて、Mickさんが1章、5、6、7章、小林さんが2、3、4章を担当してるみたいですね。
スピーカー 2
小林さんってあれだ、小説データベースってオライリーの、僕好きな書籍だけど、翻訳してる人だ。
スピーカー 1
そんなお二人から出ている書籍を読みましたというところですね。
これを今日話すにあたって、ちょっとした注意事項というかですが、
口頭のみの説明なので厳密性に書く説明があると思います。
簡易的な説明を今日はしますので、その点ご了承ください。
スピーカー 2
発信されるから注意しないといけないな。
スピーカー 1
説明足りてなくない?みたいな話もあるかもしれませんが、こういった事情です。
じゃあ早速入っていくんですけど、まだNewSQLとは?っていうところから入っていくんですけど、
NewSQLって、僕がNewSQL界隈をウォッチし、軽めにウォッチしだしたせいか、
最近よく見るようになった気がしていますが、
世間的にもちょっとずつよく見るようになったんだろうと勝手に思っているんですけど、
とはいえそんなにまだちゃんと知らないなっていう方も全然多くいるのかなと思うので、
そういった方にとって、こういうもんなんだっていうのを理解してもらえればなと思って話すんですが、
一旦超ざっくりな説明から入ると、
よく言われるものとしては、RDBとNoSQLのいいとこどりっていう話はよくされるかなと思います。
何を持っていいとこどりなのかっていうと、
まずRDBからはスキーマ定義とアシットトランザクション SQLっていうところを取っていて、
NoSQLからはスケーラビリティと効果要性を取っている。
なのでこのスキーマ定義、アシットトランザクション、SQL、スケーラビリティ、効果要性、
こういうところを跳ね備えたものがNewSQLです。
スピーカー 1
っていうのが超ざっくりな説明です。
スピーカー 2
すごいやつよ。
スピーカー 1
そう、すごいんですよ。
こいつすごいわけですが、登場した背景とかを一旦話せればと思うんですけど、
RDBとNoSQLを軸に振り返っていくんですけど、
RDB自体は古くからあるというところで、その辺の歴史とかはここでは触れませんが、
RDBのスケーラビリティ、特に書き込み性能っていうところに限界を感じ出したっていうのが、
2000年代の中頃から後半ぐらい。
主にはSNSが盛り上がり出したっていうのがその頃っぽいんですけど、
FacebookとかTwitterとかその辺がすごく盛り上がっているっていうところで、
この盛り上がりに比例して書き込みもしんどくなってくるみたいな課題感があったっていうのがRDBですね。
そこから2010年前後にその課題をもとに生まれたのがNoSQL。
NoSQLは分散構成をして水平スケーラビリティを確保していますと。
ただその代わりRDBでする意味であったマシットの整合性とかその辺とかSQLを手放すっていうようなことがありましたと。
NoSQL誕生当初はRDBを置き換えるっていう話もあったようなんですが、
現在はこの二つは補い合う関係に落ち着いているっていうところですね。
今、この補い合う関係に落ち着いているんですが、
補い合うからこそある課題が発生しているっていう状況があるようで、
その課題を解決するためにNewSQLっていうものが登場していくっていう話なんですけど、
NewSQLが出てきた当初、コンセプトは最初あったようなんですが、
それがスケーラブルRDBっていうのが当初のコンセプトとしてあったようで、
なのでNoSQLを良くしていくっていうよりはRDBを進化させるっていうのが大きな方向性なのかなと勝手に読み解いたんですけど、
この段階でどういった課題があったのかっていうところでいくと、
この辺とかあんまり書籍に詳しく書いてなかったんで、
ディープサーチとか使いながら見ていったんですけど、2から3。
スピーカー 2
2から3?
スピーカー 1
課題がある。
スピーカー 3
3つ目はNewSQL。
スピーカー 2
この課題って何の課題だっけ?NewSQLにおける課題。
スピーカー 1
これはRDBとNoSQLがそれぞれ独立して存在しているっていう状況での課題。
こっちを立てればこっちは立たないみたいな状況がそれぞれあるから、
そういう状況だとなかなか解消が難しい課題があった。
スピーカー 2
それはRDBをチョイスした場合の課題と、
NoSQLをチョイスした場合の課題についての話?
スピーカー 1
そんなイメージ。
スピーカー 2
両方使ってるとかそういうわけじゃないですかね。
スピーカー 3
両方使ってやれるっていう話もあるのかもしれないんですが、
スピーカー 1
多分そうじゃなしに一つで解決しようと思うと、
NewSQLみたいな構想が必要だよねっていう話かな。
スピーカー 2
今から話そうとしてるのはそれぞれの課題?
スピーカー 1
それぞれひとまとめとして扱ってる。
世間のサービスの課題として挙がっているものがあって、
スピーカー 3
それがRDB単体だと解決できないし、
スピーカー 1
NoSQL単体でも解決できないっていうようなイメージ。
スピーカー 2
なるほど。
ちなみにちょっと戻るんだけど、
SNSが盛り上がってきたときに、
スピーカー 3
なんでRDBの限界が迎えたの?
RDBだとプライマリーである書き込みライターと呼ばれるやつっていうのは、
スピーカー 1
基本的にはスケールが難しいとされているので、
スピーカー 3
例えば日本のTwitterのユーザーもイギリスのユーザーもアメリカのユーザーも、
例えばアメリカのライターに書き込みに行くとかなってくると、
スピーカー 1
そこで時間がかかったりとかして、
そうすると書き込みに時間がかかってしまって、
全体的なパフォーマンスが落ちてしまうというような課題があるというような感じです。
スピーカー 2
じゃあSNSになってから、それまでのサービスと違って、
リード、要するに読み取るよりも書き込みの頻度がすごく上がったことによって、
シングルライターを基本とするRDBだと無理が出てきたみたいな。
スピーカー 1
そうですね、そんな感じですね。
スピーカー 2
なるほど。
スピーカー 1
ありがとうございます。
スピーカー 3
課題の方に戻るんですが、
スピーカー 1
今話したように各地域ごとにユーザーがいるという状況が、
ビッグテックとかだと発生している、
スピーカー 3
しだしていて、なのでグローバルに分散しつつ、
スピーカー 1
強い一貫性の両立というのが一つ課題としてありました。
それがさっき言ったようにRDBだと難しいとか、
あとその辺のスケーラビリティとか、SQLは強いは強いんですが、
例えば今までSQLで書いていたそれを前提としたコードとか、
ORMで使っていればそういうコードとかというところは資産としてあるので、
スピーカー 3
そこを捨てなきゃいけないとか、そういう課題があったりとか、
スピーカー 1
最後3つ目が、これはNewSQLに対する課題というよりは、
スピーカー 3
全体的な何にでも言える課題というところがあるんですけど、
スピーカー 1
デジタル化とか進むにつれて、データ規模の爆発的増加、
世の中にコンテンツ増えるとか、
そういうサービスを使う人が増えるとか、
というところの増加みたいなところが課題としてあって、
それを解決するためにNewSQLが誕生していくというのが流れとしてあったっぽいですね。
スピーカー 3
ただそういう構想自体はずっと前からあったみたいなんですけど、
スピーカー 2
それが時刻に依存しているからっていう話なんですね。
そうですね。
スピーカー 1
なんか全然そんなこと考えたことなかったから、あ、そうなんだ。
スピーカー 2
俺も小説データベースの10章ぐらいでその話、文さんの話してるんだけど、
始めたとき俺もよくわかんなくて、原始時計とかもそうだけど、出てきたけど。
あれはとっつきづらい。
書き込みがすげーあるサービスっていうのがそもそもあんまり、
存在自体、2C向けのサービスだと結構あると思うけど、
我々が扱っているのは2B向けだとあんまりないから、そこまで考えないよねみたいなのは。
あるなーって思う。
そうですね。だからここに対する課題感を持ったことって過去一度もないから、
そうなんだっていう。
つきづらさはあるよね。
スピーカー 3
これが最初の整合性を担保するためにやってることで、
スピーカー 1
あと地球規模に分散可能なってあるんですけど、
分散の話としては、そもそもとしてNew-A-Scaleが分散前提なので、
各地域にストレージの配置っていうのは可能。
日本のユーザーであれば日本にデータを置くとか、
アメリカのユーザーのデータはアメリカに置くとかっていうような設定ができるそうなんで、
そういうユーザーのどこのユーザーなのかとかっていうところで、
最適なストレージの配置っていうのが可能っぽいですね。
あと、一旦このタイミングでRAFTの話をします。
RAFTっていうのが分散合意アルゴリズムと呼ばれるもので、
さっきとろっとスパナーって話をしたんですけど、
スパナーはこれじゃないPAXOSっていう方を使ってるようなんですが、
RAFTの方が一般的なのかな?だと思うんで、
こちらについて話すんですけど、
組織にあった主な役割としてはリーダーの選出。
リーダーっていうのはリードライトじゃなくてチームリーダーとかのリーダーですね。
リーダーの選出とログの複製っていうのがあって、
リーダーっていうのが分散するにあたって、
同じデータをいくつかのノードで持つことになるんですけど、
そのノードのいくつか同じデータを持ってるノードの取りまとめ役みたいな。
それ以外はフォロワーと呼びます。
例えば3つのノードで同じデータを持ってるんであれば、
リーダー1、フォロワー2っていう関係ですね。
スピーカー 3
リーダーの選出っていうのは仮にリーダーに障害が起きた場合に、
スピーカー 1
じゃあ次誰がリーダーになるんだっていう動きですね。
スピーカー 3
リーダーがいないと動かないんですけど、
スピーカー 1
そこで障害が起きても自動的に新しいリーダーが立つっていう仕組みをリーダーの選出と言っています。
スピーカー 2
それってさ、今のRDBで言う、
マイスケールで言うとソースとレプリカの関係。
マスターなんて昔は呼ばれていたけど、
その関係性でマルチレプリカ環境みたいなので、
要するに書き込みできるやつがリーダーになってると思うんだけど、
こいつがいなくなった時にレプリカが昇格するみたいなのと一緒だよね。意味合い的に。
スピーカー 1
そうですね。部分的に見れば一緒だと思いますね。
スピーカー 2
なんかニューエースケールのすごいところって、
リーダーとフォロワーの関係って多分今までのRDBのソースとレプリカの関係で、
そのさらに上にリーダーが複数いて、
こいつを取りまとめるやつ、オーケストレーションみたいな割り振るやつがいて、
スピーカー 1
複数マルチリーダーを実現しているっていう僕は理解なんだけど。
僕はどちらかというと、今回読んだ書籍の場合にもタイDBの本を読んでるんですけど、
さっきちょろっと話したプレースメントドライバー、PDって呼ばれるものが、
スピーカー 3
どのリーダーに対して、このデータにアクセスしたいんであれば、
スピーカー 1
どのリーダーに対してアクセスしてね、みたいなルーティングみたいのはしてる。
それがそれに値するのかな。
スピーカー 2
ラフトが使われるのってこの1個のリーダー、複数のフォロワーに対するものだよね、きっと。
スピーカー 1
そうです。この小さいエリアに対してあって、それがいくつもあるって感じですね。
スピーカー 2
はいはい、そうです。
スピーカー 1
もう一つある役割としてはログ複製ってあるんですけど、
超ざっくり言えばソーサログみたいなものを記録していて、
スピーカー 3
リーダーが何かしら書き込みとかの操作を受け取ったときに、
スピーカー 1
一旦そのフォロワーに対して、こういう操作をこの後しますよっていうのをお知らせして、
受け取ったフォロワーがそのログを自分たちに書き込んだ後に書き込みましたっていうのを返して、
その返答を待ってから実際に書き込むっていう、
2フェーズコミットとか呼ばれると思うんですが、っていう動きをしているっていうところですね。
何かあった場合はそこで作成したログを元に新しいノードを立てることで、
スピーカー 3
同じ状況、3台構成を基本としている場合、
スピーカー 1
1台落ちてもそのログを元にもう1回2台になったのを3台目を作り直すっていうことをしています。
こういうことをするのがRAFTです。
スピーカー 1
実際ストレージエンジンにはキーバリューで持っているんですけど、
そのキーバリューを取るような形に変換した上で、
ストレージエンジンに対してリクエストするので、
スピーカー 3
実際のデータベースのクライアントとしては、
スピーカー 1
SQLでアクセスができるような仕組みになっている。
というところで、さっきの整合性の話と、
地球系の分散という話と、SQLインターフェースを持つという、
この3点をもって、NewSQLと呼ぶという感じですね。
もっと細かいことを話せば、かなりいろんなことがあるんですが、
とりあえず簡易的には説明としてはこんな感じかなっていうところですね。
スピーカー 3
次、じゃあこいつに欠点ないのかという話も一応触れておくと、
スピーカー 1
いくつか挙げられていたうちの4つほど持ってきているんですけど、
まず1つ目はネットワーク転送オーバーヘッドがあるというところで、
スピーカー 3
ノードがいくつかあると、そのノード間はネットワーク越しでのアクセスが発生するので、
ここはオーバーヘッドがあるよねというところでした。
スピーカー 1
ノード数が増えてくると、さっきのラフトの合意形成ということが行われるわけですが、
そこの時間が増えてくる可能性はあるというような指摘がありました。
あとコスト面も割高で、高性能を求めるとノード数が増えるということになってくるんですけど、
そうすると当然コストが増えるというところですね。
今だとRDBとニューSQLで同じ性能を出そうとするとニューSQLの方が高くなることもあるっぽいので、
まだまだコスト面ではこっちの方がニューSQLの方が高いというのがあるようですね。
あとは障害だったり遅延が発生したときの調査が難しいというところですが、
ノード数が多いので単純にどこで問題が起きたのかというところを探っていくのが、
RDBみたいな一つで完結するものに比べれば難しいというのはイメージしやすいかなと思います。
実際どういう調査をするのかとかまでは書かれてなかったのでわからないんですが、
スピーカー 3
難しそうな機会はあるという感じですね。
あと、さっきSQLインターフェースを持つという話をしたんですが、
スピーカー 1
完全な互換性があるわけではないというのも一つあります。
各サービス、なるべく互換性を保つようにやってはいるそうなんですが、
場合によってはこれは担保、互換性ないよというのもあるようなので、
この辺とかは互換性がないケースもあるので、
スピーカー 3
アプリケーションの修正が必要なケースもあるという感じですね。
スピーカー 1
この辺の4点、とりあえず欠点として挙げていますが、
スピーカー 1
いくつかある中で許容できるのであれば選択肢としてはありなのかなという感じですね。
ユースケース、どういうサービスにフィットしているのかという話なんですけど、
作者曰くですが、最もフィットするケースというのは書き込みヘビーなシステム。
例えばEC、注文が大量に発生するようなECとか、金融の決済周りとか、
あまり世の中的には使われていないらしいんですけど、
IoTなんかもいいんじゃないかということを言ってましたね。
この辺の分野には向いているという話で、
実際の投入事例として2パターン持ってきているんですけど、
まずパフォーマンス的な問題を抱えていたケースです。
ドアダッシュというUber Eatsのライバルみたいな会社がアメリカにあるようで、
ここも結構人気のあるサービスらしいんですけど、
注文とかが多くなってくると在庫、注文できるよとか残り少ないよとか在庫ないよとか、
というのを更新する人があるらしいんですけど、
注文が増えてくると書き込みの遅延によって更新が間に合わないという問題があったようですね。
なのでこの部分が書き込みヘビーになっている部分ですね。
それを何に使ってたって言ったのかな、ちょっと忘れちゃったんですけど、
RDBを使っていたところからNewSQLに変えることで、
この辺が解消したという事例が挙げられてましたね。
いろいろと細かく書いてはあったんですけど、ざっくりとそんな感じです。
というのが一パターン目。
もう一つあるパターンとして、これは日本の事例としてDMMの事例が挙がってたんですけど、
スピーカー 3
さっきパフォーマンスの話をしたんですけど、
DMMのケースはパフォーマンスというわけではなくて、
スピーカー 1
いろいろな種類のデータベースの混在によって複雑化しているという状況がありました。
例えばログイン情報とかはMySQLで持ってますRDBですね。
スピーカー 3
セッション情報はコーチベースというのかな。
スピーカー 1
ドキュメント型のNoSQLで使ってたりとか、
ログイン履歴にはカサンドラというキーバリュー形式のNoSQLを使っているとか、
いくつか複数種類のデータベースを使っているということで、
運用コストがかなり上がっていたらしいんですけど、
これらをRDBに置き換えたようで、
そうすることで3つ上げてましたが、
MySQL、コーチベース、カサンドラの3つを対DB化に統一することで、
運用コストを下げるという使い方、導入事例もあるようで、
本社的にはパフォーマンス観点と一種DBの混在による複雑化の2点、
2ケース上げられていて、そういった導入事例は今のところあるようですね。
スピーカー 1
他にもいくつか事例が上がっていたので、興味があればぜひ読んでみてほしいんですが、
こういったところが主なケースでしたね。
一旦ここでNoSQLの紹介みたいな話は終わりなんですが、
スピーカー 3
今話した内容とかユースケースを踏まえて、
スピーカー 2
うちのシステムにNoSQLは有効なのかという話を最後にして終わりたいなと思っています。
NoSQLを導入するってなるとやっぱりアーキテクチャが複雑だから、
すごいその辺りで理解がないと結構、
さっきの調査とか障害調査とかっていう話があったけど、
スピーカー 1
その後に難しくなるんだろうなとは思う。
スピーカー 3
そうですね。
なんか場合によっては入れたいなとか思ってたけど、
正直ユースケース見たりとかすると、
スピーカー 1
なんかわざわざうち入れなくてよさそうだなって思っているっていうのが正直なところ。
うちはそんなに書き込みヘビーでもないし、
スピーカー 3
今後ユーザー増えてくればどうなるかっていう話もありますが、
まあとはいえまだ大丈夫なのかと思ったりもするんですが、
スピーカー 1
ただ唯一この辺がいいよなって思うのは、
アップデートとかは無停止でできるので、
ローリングアップデートしていけるっていうのがあるんで、
スピーカー 1
今のところうちはマイエスケールを使っていますから、
アップデートしようとするとどうしても停止した上でスケールアップするとか、
スピーカー 3
っていう選択になるのかなと思うんですけど、
使うとすればタイDBになるかなとざっくり妄想していますが、
タイDBとか入れればユーザーの増加に伴うアップデートみたいなことは起きないので、
スピーカー 1
その辺はメリットとしてありそうだなと思いますが、
スピーカー 2
その他の部分がどの程度ペイするのかはちょっと怪しい。
今の状況だとやっぱり、今一番恩恵があるのはスケールアウトしやすいよねっていうところが強いんで、
うちもやっぱデータ量結構多くなってきてるし、
今後多分増やしていかないといけないってなった時に、
じゃあ一台のDBをスケールアップし続けるのかっていう話もある。
2台目用意して何かでシャーディングしたとして、
要するにユーザーを分割したとした場合に、
アプリケーション側で結局行き先を制御するとかしないといけなくなるのも辛いなっていうのが。
スピーカー 3
そうですね、パーティションとかそういうの使い出すんであれば、
スピーカー 1
その時はやっぱなんかNewSQLも議論の土台に上がってきそうな気はします。
スピーカー 2
あとは今すべての情報がRDBで管理されているけど、
本来はスキーマレスでいいよねっていう情報も結構たくさんあると思っていて、
そのあたりを細かく適切なデータベースにとかやっていくとDMMと同じ状況になるんだろうなみたいな。
スピーカー 1
その辺のスキーマレス力がちょっと低いからあんまピンときてないところは正直あるけど、
実際そういうことがあれば、確かにじゃあNewSQLに行った方がいいんじゃないみたいな、
スピーカー 3
その他のメリットとかも見ればみたいな話は確かにありそうですね。
スピーカー 2
結局、例えば操作履歴、たびたび僕が何かどっかで言ってるけど、
操作履歴とかって別に隙間必要ない。操作したたびにじゃんじゃん書き込みに行くから、
それこそドキュメントDBみたいな、ただJSONの形みたいなので保存していくでいいと思うんだよね。
確かにあんまり操作履歴がRDBとかと一緒になってると、操作履歴って本質的じゃないじゃない?
スピーカー 1
システムにおいてってこと?
スピーカー 2
そう、業務において。ユーザーの業務において本質的じゃない、別に関心のない部分。
だから、そいつを分離しとくっていうのはなんだろうな。
そいつに引きずられて障害が発生するっていうのもなくなるだろうし、
いい設計にはなるけど、それだけ新しい存在が増えると複雑化していくんで、
理解が難しくなるっていうのもあるよねっていう。
このトレードオフどうするみたいな話はすごいある気がする。
スピーカー 1
実際今、かなり部分的にRedis使ってるところあるけど、
この辺って普段触ってないから、何か起きたときに多分操作履歴になって思うもん。
スピーカー 2
Redis何でどこで使ってるのっていうのってちゃんと言える人ってあんまりいないし、
じゃあこれだからRedisっていうのもうまくまとまってない気がしていて。
スピーカー 3
そうだね。
スピーカー 1
そういう暗黙地みたいなのは増えやすいかもしれないですね、こういう構成。
スピーカー 2
そうだね。だからもしも今後、じゃあもっとサービスシステムを洗練させていくってなったときに、
そういったいろんな機能を分離していくみたいな、
引きずられないようにするみたいな考えでアーキテクチャが複雑になっていくたときに、