helloworlds

not a noun, it's a verb

DBの高度な機能について

近頃DBにまわりの業務を担当することが多いので、DBの業務を行うにあたって 基本的なDBの機能について復習していきます。

物理サーバでもクラウドサービスを使用していても基本的な概念を精通していることが多いので、 機能ベースで確認していきます。

基本的な概念を抑えておけば、あとは各サービスの特徴を調べることが容易になったり 業務を行う上での近道になりそうです。

スケールアウト

そもそもスケールアウトとは、基本的に「仮想マシンの台数を増やす」ことを指します。 逆に「減らす」ことをスケールインといいます。

スケールアウトするための仕組みとして、主に以下の2つのワードをよく使用します。

レプリケーション

レプリケーションの目的としては、主に参照系処理をスケールアウトするということと覚えておきましょう。

具体的には、マスターサーバからスレーブサーバに対してDBの更新処理を送信し、 リアルタイムにコピーする機能です。

レプリケーションは、バックアップとは別であるということを意識します。 バックアップは定期的に行われるものだったりします。 そして、バックアップの場合は、異なる媒体(例えばAWSサービスのS3など)に転送されることが多いでしょう。 また、バックアップを使用する際というのは、リストアの作業が必要になります。

しかし、レプリケーションの場合は同様のシステム間で複製されることが多いのでしょう。 これは、なにか障害が起こった場合、マスターからスレーブへと切り替えサービス継続させるためです。

レプリケーションには、同期レプリケーション非同期レプリケーションがあります。

対象サーバへの同期が完了してから、次の処理を行います。 差分ログの転送までの同期と、差分ログの転送とデータへの適用までの同期などの厳密な区分がある。 つまり、基本的には完全なコピーがあるということです。

他のサーバにデータを送っている途中でも、次の処理を行います。 レスポンスの向上が見込めます。が、元のサーバがダウンするとデータの消失があるかもしれません。

また、レプリケーションには、マスターサーバが1台の場合や複数の場合などがあります。 企業やサービスなどによって異なるので、頭の片隅に「マスターサーバはいくつあるんだろう?」と、疑問に思うことを忘れないにしておくくらいでいいかと思います。

シャーディング(sharding)

よくAWSなんかさわっているとシャードなんてワードをよく目にします。 ドキュメント読んでる最中は、なんとなく理解しているつもりではいるのですが、 日が経つと「あれ?シャードってどんなんだっけか?」となります。

そこで色々調査した結果、シャードとは、 「1つのDBを分割して、複数に分散させて管理/運用すること」みたい。

Oracleさんに言わせるとこんなかんじ。

まあ、水平分割して負荷を下げられますよ、みたいなことなんだろうか。 レプリケーションでは参照系処理を行うサーバをスケールアウトさせるためでしたが、 「更新処理を行うサーバもスケールアウトさせたい」と思うことは普通のことです。

デメリットとしては、JOINなどが普通できない。 ただ、こんなものも用意されているようだからいいのかな?

最近は以下のようなかんじで、ほとんど気にしないで運用しているかと思う。

AWS Sharding Writeパターン

こちらが参考になります。

今ではAWSのようなクラウドサービスで仕組みだけ理解しておけば簡単に構成が組めてしまいますね〜。

次はもう少し内部の部分を確認します。

DBでは、I/Oがよくボトルネックになってくる場合があります。 これは過去記事で、DBMS内について復習している記事ですが、こちらにもSQLでI/Oを意識することが大切だと紹介しました。

o21o21.hatenablog.jp

このI/Oコストを少なくして高速に処理するための工夫がRDBMSにはあります。

データキャッシュ

これはよくご存知だと思います。 データキャッシュとは、ハードディスクから読み込まれたデータをメモリ上に保持しておくことで、 ハードディスクに再度アクセスすることを避けます。

パーティショニング

AWSでは、パーティションなんて言われます。 パーティショニングとは、実際は1つのテーブルを(指定した)ルールに基いて分離し格納する機能のことです。

簡単に言うと、アプリケーション側からは1つのテーブルに見えるので(SQLを変更することはなく) データが存在するパーティションだけを検索し応答速度を向上させることができる、みたいなかんじです笑

今度は、機能というより構成について簡単に確認してみます。

クラスタ

このワードもよくクラウドサービスを利用していると出てくるワードですね。 DB系のサービスでは、事ある毎にクラスター、インスタンス、.....などとワードが飛び交うと、 なにがどの機能を果たすのかわからなくなることがあります。わたしは笑

クラスタとは、複数のコンピュータを連結し、利用者や他のコンピュータに対して全体で1台のコンピュータであるように構成されているものです。

クラスタ内の代表的な構成としては、フェイルオーバーを意識したアクティブスタンバイ構成が挙げられます。 稼働しているサーバ(アクティブサーバ)に障害が起こると、スタンバイしているサーバ(スタンバイサーバ)のどれかが、 アクティブサーバに昇格します。

また、手動でアクティブサーバを切り替えることを、スイッチオーバーといいます。

以上、よく耳にするワードからDBをの機能を見直してみました。 基本的なことばかりですが、いろんなサービスで共通して使用されている概念だと思うので 少し用語(呼び方)が変わっても慌てず理解していけるようになれるといいです。