SQLを使用したリレーショナルデータベース管理システム(RBDMS)は、何十年もの間、アプリケーション情報の保存に使用されてきました。医療や金融などの主要産業のバックボーンとして、データを各行ごとに識別可能なキーを持つテーブルに整理するリレーショナルモデルは、信頼性と効率性が高いことが証明されています。最新の SQL データベースには MySQLと PostgreSQLを含む最新の SQL データベースは、現在も最も一般的に使用されているデータベースの一つです。しかし、どのような場合にSQLでは不十分なのでしょうか?
2000 年代後半に始まったNoSQL(NotOnlySQL)データベースの台頭は、他の多くの進歩と時を同じくして起こりました。マルチコア・プロセッサーや仮想化が一般的になる一方で、クラウドが台頭し、世界中の何百万人ものユーザーがスマートフォンで初めてオンラインに接続するようになったのです。すべてが成長する必要があり、この必要とされる規模を達成するための最も現実的な方法は ホリゾンタルスケーリング.SQLとNoSQLは、「SQLは垂直方向に拡張でき、NoSQLは水平方向に拡張できる」と単純化されすぎているのをよく目にしますが、これは不完全であり、正しくはありません。
水平方向のスケーリング
水平方向の拡張というと、ノードやマシンを追加して環境を大きくすることを意味します。SQLデータベースは、1つのノードにさらにRAMとコンピュートを追加することで比較的簡単に垂直方向に拡張できますが、データセットを複数のノードに分散させることはより困難です。これは シャーディング.大きなデータセットと高いスループットを扱う場合、シャーディングは1台のサーバーの負荷を軽減し、必要に応じてサーバーを追加または削除することでスケーリングを可能にします。
MySQLのシャーディングと制限事項
SQLデータベースは、シャーディングによって水平方向に拡張することができます。その方法とサポートされる機能はデータベースによって大きく異なりますが、注意点を考慮する必要があります。ここでは、より一般的な例の1つである、NDBストレージエンジンを使用したMySQLに焦点を当ててみましょう。MySQLはNDBクラスタをサポートしており、1つの大きなテーブルを複数の小さなテーブルに分割することができます。テーブルを分割するプロセスは、パーティショニングと呼ばれます。複数のサーバーにまたがって保存される場合、これらの小さなテーブルはシャードを構成します。クラスタ内のデータベースは、それぞれシャードの1つを保存します。クラスタ内のデータベースを合わせると、完全なデータセットが構成されます。
SQLデータベースでシャーディングを使用すると、データセットサイズの拡張性が非常に高くなりますが、アプリケーションのロジックがより複雑になる可能性もあります。この決定はデータベース全体のパフォーマンスに影響するため、データを複数のシャー ドに分割する方法を慎重に設定する必要があります。 複雑さと高い時間要件に加え、考慮すべき技術的なハードルもあります。一般的に言われている制限に対抗するため、MySQLでは複数のシャードでジョイン操作を実行するように設定できますが、大規模な場合にはパフォーマンスが犠牲になります。このため、このような環境では分析機能が実用的でなくなる可能性があります。
NoSQLの導入
2000年代後半に誕生して以来、さまざまな種類のNoSQLデータベースが爆発的に普及しています。今回は、最も人気のあるNoSQLデータベースであるMongoDBを取り上げます。MongoDB(語源は「humongous」)は、ドキュメント指向です。データはJSONオブジェクトに似たドキュメントに格納され、各ドキュメントにはフィールドと値のペアが含まれます。これは、テーブルと行を使用してデータをフォーマットするSQLデータベースとは対照的です。MongoDBのようなNoSQLデータベースは、一般的に水平方向のスケーリングに適していると読んだことがあるかもしれないが、その理由を掘り下げてみよう。
なお、MongoDBでは特にJSONから派生したBSONという形式を使用していますが、これは各データベースによって異なるでしょう。
スキーマとシャード
MongoDBは スキーマレス(またはスキーマフリー)、つまりデータベースレベルで定義された組織構造を必要としません。スキーマは代わりにアプリケーションレベルでコードに組み込まれます。このため、データを保持したまま後から構造を変更する柔軟性が高いのです。ACID準拠のSQLデータベースのような厳密な一貫性はありませんが、MongoDBやその他のNoSQLデータベースは、可用性とパーティション耐性に優れています。
SQLデータベースの水平スケーリングについて調べたとき、テーブルをシャードに分割するプロセスについて説明しました。可能ではありますが、データベースに組み込まれた硬直的な構造のため、大きな制約をもたらしました。一方、MongoDBやその他のNoSQLデータベースは、構造レベルでシャーディングに対応するように設計されています。シャードとはデータのサブセットのことで、MongoDBではシャードをレプリカセットとして展開することで、水平方向に拡張することができます。レプリカセットは少なくとも3つのノードからなるクラスタで、同じデータの冗長コピーを持つ。大規模な環境に分散したときに可用性と冗長性を提供し、決められたスキームにとらわれない。
このことから、NoSQLデータベースがスケーラブルであるために譲歩していることがすぐに分かります。NoSQLデータベースは、大規模な水平展開で可用性を実現するために冗長データが必要となるため、SQLデータベースよりも大幅に多くのストレージを使用することが多い。NoSQLの書き込み速度はSQLデータベースを上回る傾向がありますが、クエリの実行速度は遅くなります。NoSQLデータベースは定義された構造を持たないため、本質的にACIDに準拠しておらず、大量の金融トランザクションを扱うアプリケーションには実用的ではありません。また、大規模な分散型NoSQLクラスターを構成することで、パフォーマンスを維持し、ビッグデータや分析に最適な環境を構築することも可能です。
では、どのような場合にSQLでは不十分なのでしょうか?予想されるように、その答えは簡単ではありませんが、アプリケーションを設計する際に考慮すべき一般的なガイドラインがいくつかあります。アプリケーションは何をする必要があり、どれくらいの規模が必要なのか?そこから、最優先事項を決定することができます。"SQLは縦にスケールし、NoSQLは横にスケールする "と言うのは真実ではありませんが、"ほとんどのSQLデータベースは一貫性を考慮して設計されており、ほとんどのNoSQLデータベースはスケーリングに対応するように設計されている "と言うことはできます。
この一般的なガイドラインには、常に反論があります。MySQLは水平方向に拡張でき、MongoDBはマルチドキュメントACIDトランザクションのサポートを開始しました。これらのデータベースがどのように設計されているかを理解すればするほど、その仕事に最適なツールを選択するための洞察力が身につきます。
Linodeにデータベースを展開する
Linodeマネージドデータベースについての詳細や、ご希望のデータベースエンジンのアップデートを受け取るためにサインアップしてください。また、MongoDBのようなデータベースマネージドシステムをLinodeMarketplace からデプロイしたり、 CentOS 7にMongoDBをインストールするなど、様々なLinuxディストロにデータベースをインストールするガイドをご覧ください。
コメント