日本語で「スケール」と言えば、規模のことで、それが向上するならスケールアップ。スケールアウトはちょっと言葉としておかしい、と一般の人は感じるはずです。ここで言う「一般の人」とはIT関係ではない人という意味です。そもそも英語でも、scale outは不自然です。規模が拡大して、枠外にはみ出すこと(つまりout)を表したくて、枠があることが前提になってしまっています。でも、この言葉が使われ出した背景を考えれば、なぜスケールアウトなのか、合点が行きます。
IT用語の解説によると、サーバーの台数を増やして処理能力を高めること、と定義されています。台数を増やさずに元々のハードディスクを増強したりして、処理能力を高めたらスケールアップなのだとか。どちらも、規模の拡大なので、従来の日本語なら、両方ともスケールアップと言わなければなりません。
Vertical Scaling vs. Horizontal Scaling
サーバーというハードウェアで考えず、その中身、つまりデータベースで考えたほうがわかりやすいです。汎用システムではほとんどの場合、まだリレーショナル データベースが使われていると思いますが、すごく単純化して言ってしまえば表計算みたいなものです。レコード数が増えれば増えるほど表がどんどん縦に伸びていきます。レコードが膨大になり過ぎたら、そのデータベースが置かれたサーバー自体の処理能力を増強するしかありません。それを英語でvertical scaling(縦方向の拡張)と言い、それを達成するのがscale upです。
しかし、スケールアップには限度があります。レコード数が天文学的に膨大になったら、サーバーの処理能力を増強してもきりがありません。そこで、リレーショナル データベースのように表の仕様が細かく規定されてレコードが縦に増えていくのではなく、規定をゆるくして、複数サーバーに分散できるデータベースが考え出されました。それをNoSQLデータベースと呼び、リレーショナル データベースのSQLデータベースと対比されます。NoSQLの例としては、MongoDBのようなドキュメント型や、以前の記事に書いたグラフデータベースなどが挙げられます。
SQL vs. NoSQL
NoSQLデータベースのように複数サーバーに分散して拡張できるなら、リレーショナル データベース(表)のように縦に拡張する必要がないので、horizontal scaling(横方向に拡張)と言い、それこそがscale upに対するscale outです。
拡張性の点では、horizontalのほうがverticalよりずっと可能性があるので、システムはスケールアップせずに、断然スケールアウトすべき、ということになりますが、そう簡単でもないようです。
リレーショナル データベースは、システム処理におけるトランザクションのACIDを達成するために考え抜かれたシステムであり、そう簡単に置き換えることはできません。ACIDとは、A(atomicity=原子性/不可分性)C(consistency=一貫性/整合性)I(isolation=独立性/隔離性)D(durability=耐久性/永続性)のことです。お金のやり取りをするようなシステムなどは、この原理を捨てたら成り立ちません。
NoSQL vs. NewSQL
そこで、SQLデータベースではスケールアウトできないが、NoSQLでも困る場合、つまりリレーショナル データベースを何とか頑張ってスケールアウトしたい場合の秘策として、最近はNewSQLデータベースの活用が少しずつ広がっているようです。リレーショナル データベースの表をパーティションによって複数のサブセットに分割し、さらにレプリケーションと二次インデックスの活用で、複数サーバーに分散してもACIDが保てるようにしたデータベースです。
要するに、スケールアップの限界がスケールアウトの必要性を生み、データベースがSQL→NoSQL→NewSQLと、進化を遂げているという話です。NewSQLデータベースの今後に期待が膨らみます。