【データベース入門4】バックアップ,クラスター,レプリケーション

本記事は全6回に渡るデータベース入門記事のうち、第4回「バックアップ・クラスター・レプリケーション」です。

その他のデータベースの入門記事ついては以下の記事をどうぞ。

また、本記事ではデータベースの耐障害性・障害復旧に焦点を当てて以下の技術を解説します。

概念説明対策可能な障害
バックアップある時点のデータの複製ストレージのデータロスト
クラスターノード(コンピュータ)を複数用意ノード障害
レプリケーション稼働中のデータの複製
クラスターのノード間でデータを複製する技術
ストレージのデータロスト
ノード障害
スポンサーリンク

バックアップ

バックアップ手法には次の3グループの手法があります。

  • 「ホットバックアップ」or「コールドバックアップ」
  • 「物理バックアップ」or「論理バックアップ」
  • 「フルバックアップ」or「差分/増分バックアップ」

「ホットバックアップ」or「コールドバックアップ」

ホットバックアップとは、バックアップ対象のデータベースを稼働したままでバックアップデータを取得する方法です。

コールドバックアップとは、バックアップ対象のデータベースを停止してバックアップデータを取得する方法です。

代表的な RDBMS で各バックアップを取得する方法は以下のとおりです。

RDBMSホットバックアップコールドバックアップ
MySQLmysqldumpOS のコマンド:cp, tar コマンド等
PostgreSQLpg_dumpOS のコマンド:cp, tar コマンド等

「物理バックアップ」or「論理バックアップ」

物理バックアップとは、物理的なファイルをバックアップする方法です。

論理バックアップとは、SQL ベース等でバックアップする方法です。

「物理バックアップ」と「論理バックアップ」の性質の違いは以下のとおりです。

性質物理バックアップ論理バックアップ
フォーマットバイナリ形式テキスト形式
バックアップ速度速い遅い(バイナリ⇔テキストの変換が必要)
バックアップサイズ小さい大きい
移植性低い(他のバージョンや他のDBMSに移行不可能)高い(他のバージョンや他のDBMSに移行可能)
データ書き換え困難容易(SQL 文を書き換えるだけ)

代表的な RDBMS で各バックアップを取得する方法は以下のとおりです。

RDBMS物理バックアップ論理バックアップ
MySQLMySQLEnterpriseBackupmysqldump
PostgreSQLpg_basebackuppg_dump

「フルバックアップ」or「差分/増分バックアップ」

フルバックアップは、データベース全体をバックアップする方法です。

https://downloads.mysql.com/presentations/20151208_01_MySQL_Backup_for_Beginners.pdf

差分/増分バックアップは、直近のバックアップ以降に更新されたデータのみをバックアップする方法です。

  • 差分バックアップ:直近のフルバックアップ以降に更新されたデータをバックアップする方法
  • 増分バックアップ:直近のバックアップ(種別はフルとは限らない)以降に更新されたデータをバックアップする方法
https://downloads.mysql.com/presentations/20151208_01_MySQL_Backup_for_Beginners.pdf

「フルバックアップ」と「差分/増分バックアップ」の性質の違いは以下のとおりです。

性質フルバックアップ差分/増分バックアップ
リストア単純複雑(PITR 後述します
バックアップ取得時間長い短い(変更したデータだけ)
バックアップサイズ大きい小さい

代表的な RDBMS で各バックアップを取得する方法は以下のとおりです。

RDBMSフルバックアップ差分/増分バックアップ
MySQLmysqldumpバイナリログ
PostgreSQLpg_dumpWAL ログ
スポンサーリンク

PITR(Point In Time Recovery)

PITR とは、「バックアップ + アーカイブログ(バックアップから変更した内容)」を利用して、特定の時点までデータをリカバリすることです。

PITR を利用したデータの復旧は以下の流れとなります。

PITR はクラッシュリカバリトランザクションログを利用した仕組みです。

多くの DBMS では、以下のようにトランザクションログをアーカイブし、アーカイブログとします。(MySQL の場合はバイナリログを利用します。

スポンサーリンク

クラスターとは

クラスターとは、1つの機能を実行するために、複数のコンピュータを利用することです。

構成をクラスター化する理由は、主に次の2つを向上させるためです。

  • 「可用性(継続的に稼働すること)」
  • 「パフォーマンス」

データベースにおけるクラスターには次の2つの概念があります。

シェアードディスクとは

シェアードディスクとは、各ノード(コンピュータ)が共通のストレージを利用して並列して処理を行うことで、パフォーマンスを向上させるクラスター構成です。

シェアードディスクでは以下のように各ノードが共通のストレージを利用します。

ノードの前段にはロードバランサーを置いたりします

これにより、ノードを増やすことで CPU やメモリ等のリソースを追加することができます。

ただし、複数のノードが同じフィールドに対して同時に書き込むと、書き込みロックが発生します。また、ストレージは追加できないため、ストレージへのアクセスがボトルネックとなります。

シェアードナッシングとは

シェアードナッシングとは、各ノード(コンピュータ)が別々のストレージを持つことでパフォーマンスを向上させるクラスター構成です。

シェアードナッシングでは、以下のように各ノードは別々のテーブル情報を持ちます。

https://www.digitalocean.com/community/tutorials/understanding-database-sharding より改変

このテーブルを分割する単位をシャードと呼び、処理するテーブルデータが被らないようにします。これにより、各ノードは必ず処理するデータが他のノードと被らないため、ロックが発生しません。

つまりノードを増やせば増やすほどストレージの読み書きを分散できるため、パフォーマンスが求められる NoSQL で利用されることがあります。

シャーディング(レコードをシャードに振り分ける)には、次の3つの方法があります。

  • Key Based Sharding
  • Range Based Sharding
  • Directory Based Sharding

Hash Base Sharding (Key Based Sharding)

Hash Base Sharding とは、指定したカラムのハッシュ値を元にレコードをシャードに振り分ける方法です。

以下の図は COLUMN1 に対してハッシュ関数を利用して、シャード1、2のどちらかにレコードを割り当てています。

https://www.digitalocean.com/community/tutorials/understanding-database-sharding

ハッシュ値のとりうる値 = シャードの数です。

Range Based Sharding

Range Based Sharding とは、値の範囲ごとにレコードをシャードに振り分ける方法です。

以下の例では、PRICE カラムの値を元に3つのシャードに振り分けています。

https://www.digitalocean.com/community/tutorials/understanding-database-sharding

Directory Based Sharding

Directory Based Sharding は、カラムでシャードを指定することで、レコードをシャードに振り分ける方法です。

以下の例では、DELIVERY ZONE カラムで振り分けるシャードを指定しています。

アクティブ/パッシブ(アクティブ/スタンバイ)構成とは

アクティブ/パッシブ構成とは、いくつかのノードを待機状態にして、障害時に切り替えて処理を引き継ぐことで可用性を向上させるクラスター構成です。

アクティブ/パッシブ構成の動作は以下のとおりです。

アクティブ/パッシブ構成は、パッシブ側の状態によって次のように分かれます。

  • ホットスタンバイ:データベースを起動して待機している場合
  • コールドスタンバイ:データベースを起動せずに待機している場合

コールドスタンバイにする理由は、待機中のデータベースライセンス費をカットできることです。その代わり、障害が発生してからデータベースを起動するため、切り替えが遅くなります。

アクティブ/アクティブ構成とは

アクティブ/アクティブ構成とは、通常時は全てのノードを稼働させパフォーマンスを向上し、障害発生時は残ったノードで処理を継続することで可用性を向上させるクラスター構成です。

アクティブ/アクティブ構成の動作は以下のとおりです。

アクティブ/アクティブでは、アクティブ/パッシブとは異なり正常時は両方のノードが稼働します。

障害時は残ったノードに負荷が集中する点については注意が必要です。

また、複数のノードがほぼ同時に書き込みを行うと、後から書き込んだノードに上書きされることを防ぐために以下の対策があります。

  • シェアードディスク:行ロック
  • シェアードナッシング:シャーディング

レプリケーション

レプリケーションとは、データの複製(レプリカ)を別のストレージにも保存することです。

レプリケーションでは、役割ごとに以下のように呼びます。

  • 書き込み/読み込み可能:マスター・プライマリー等と呼ぶ
  • 読み込みのみ可能:レプリカ・セカンダリ・スレーブ・スタンバイ等と呼ぶ

今まで紹介したクラスター構成では、ストレージに障害が発生すると、一部もしくは全てのデータを失います。

そこで、ストレージにあるデータをレプリケーションすることで冗長化します。

なお、レプリカは読み込み可能なので、クライアントからの読み込みクエリを負荷分散可能という副産物もあります。

レプリケーションのやり方には次の2種類の方法があります。

  • シングルマスターレプリケーション(レプリケーションは通常、こちらを指す)
  • マルチマスターレプリケーション

シングルマスターレプリケーションとは

シングルマスターレプリケーションとは、1つのマスターと1つ以上のレプリカを持つ構成のことです。

そのため、クライアントからの書き込みクエリはマスターの役割を持つノードでしか行なえません。

シングルマスターレプリケーションでは、バイナリログ(MySQL の場合)やトランザクションログ(PostgreSQL の場合 WAL ログ)を利用して、マスター側の更新をレプリカ側に反映します。

MySQL レプリケーション
https://downloads.mysql.com/presentations/20151207_02_MySQL_Replication_for_Beginners.pdf
© 2019 NTT DATA Corporation 19 アーキテクチャ walsender walreceiver startup データベース クライアント ②変更 ③書き込み WAL WAL ⑤読み込み ⑥WAL転送 ⑦書き込み ❾読...
PostgreSQL のレプリケーション
※スタンバイ=レプリカ
https://www.slideshare.net/nttdata-tech/postgresql-replication-10years-nttdata-fujii-masao

マスターの役割を持つノードに障害が発生した場合、レプリカの役割を持つノードがマスターに切り替わります(フェイルオーバーと言います)。

マルチマスターレプリケーションとは

マルチマスターレプリケーションとは、全てのノードがマスターとなる構成のことです。

マルチマスターレプリケーションでは全てのノードでクライアントからの書き込みクエリが実行可能です。また、全てのマスターが他のマスターの更新結果のレプリケーションを受け取ります。

図2-1の説明が続きます。
https://docs.oracle.com/cd/E16338_01/server.112/b72089/repmaster.htm

複数のノードが同じテーブルに書き込む場合、後から書き込んだ内容に上書きされることを防ぐために、テーブルロックを行ったり、シャーディングを行うことで対策します。

データベース入門記事の続き

データベース入門記事「バックアップ・クラスター・レプリケーション」に関する説明は以上となります。

その他のデータベースの入門記事ついては以下の記事をご確認ください。

参考資料

MySQL5.7入門(バックアップ編)
https://downloads.mysql.com/presentations/20151208_01_MySQL_Backup_for_Beginners.pdf

MySQL 5.7入門(レプリケーション編)

https://downloads.mysql.com/presentations/20151207_02_MySQL_Replication_for_Beginners.pdf

コメント