SQL Serverの参照系の復旧について考えた

この投稿はアイスタイル Advent Calendar 2020 2枠目 の22日目の記事です。

はじめに

こんにちは、DBAをやっているsaitokaです。
僕はリモートワークを3月からやっていまして、プライベートも含め、自分のライフスタイルがとても変化した一年でした。
もとは、アウトドア派でしたが、意外と巣ごもりも楽しくて、今では完全にインドア派に寝返りました。
お家最高です!U〇〇rさんいつもありがとうございます:bow:

ところで、アイスタイルではSQL Serverを使っていて、更新系サーバーから参照系サーバーへ、データをレプリケーション(同期)をしています。
最近ではデータベースも大きく成長して、参照系サーバーに障害が発生した場合の復旧に時間を要するようになってしまいました。
このままだとまずいので、参照系の復旧方法を見直そうということになったので、検証をしてみました。

目次

現在の参照系の復旧方法と問題点

参照系の復旧を考えたときに、一番問題となっているのが、レプリケーションの復旧です。
障害で、OSが起動することができなくなった場合を想定した現状の復旧方法は、OSを構築した後、サブスクリプションの再初期化をします。
その際、サブスクリプションの再初期化は、以下2つの方法で実施していますが、問題点がいくつかあります。

1. スナップショットを取得して再初期化

  • 再初期化時にスナップショットを取得
  • 参照系のテーブルを削除したのち再作成
  • データがコピーされ、レプリケーション再開

スナップショットを取得して再初期化する場合の問題点

  • スナップショット取得時に、一瞬だがロックが発生して、サービスに影響が出た
  • 大きなパブリケーションのデータコピーが終わらず、ループしてしまい、再初期化が失敗
  • 大きなパブリケーションになると、正常に動作しても、再初期化に時間がかかる

2. DBバックアップを取得して再初期化

  • 再初期化時に更新系DBのバックアップを取得
  • バックアップを参照系にリストア
  • 再初期化をしてレプリケーション再開

DBバックアップを取得して再初期化する場合の問題点

  • 更新系のDBをリストアするので、オブジェクトに差異が生じて、整理するのにとても手間がかかる
  • バックアップのリストアに時間がかかる

課題

レプリケーションが壊れてしまったら再初期するしかないんですが、それ以外の障害復旧でもサブスクリプションを再初期化しないといけない場面があるのは、ちょっと問題だなと思いました。
再初期化の工程をスキップ出来たら、復旧までの時間を大幅に短縮できると考えました。

検証方法/検証

検証方法について考える

サブスクリプションの再初期化をせずに、レプリケーションを復旧させるには、障害発生時の前の状態に戻す必要がありました。
SQL Serverの機能では実現できませんでしたが、サーバーは仮想化されていたので、VMwareバックアップを取得し、仮想マシンごと復元できれば、OSやDBの設定も復元できるし、レプリケーションも復旧できるかもしれないと考えました。

検証内容

  • 障害レベルはOSが起動できない状態を想定
  • 仮想マシンバックアップはスナップショットを代用する(時間がなかったので。。)
  • 一度同期済みとなったデータを再度配信してくれるのか?

検証環境

各サーバーをESXiサーバー上に構築します。
STG-SQL-P:更新系DBサーバー
STG-SQL-S:参照系DBサーバー
STG-SQL-D:ディストリビューター

検証実施

SQL Serverをインストール、DBとテーブルを作成して、レプリケーションを設定しておきましょう。

  1. STG-SQL-Pにデータを挿入して、STG-SQL-Sへのデータ同期が確認できたら、仮想マシンのスナップショットを取得します。

  2. さらにSTG-SQL-Pにデータを挿入します。

  3. 取得したSTG-SQL-Sのスナップショットをリストアします。
    この時点で項番2で挿入したデータは反映されていない状態になります。
    今回の場合はOS、DBは稼働した状態でリストアされます。

  4. レプリケーションモニターで確認すると、一時的にエラーが発生していたものの、ジョブが再試行されてエラーが解消しました。
    その後、項番2で挿入したデータが反映されました。
    さらにデータを追加しても、レプリケーションがエラーになることはありませんでした。

まとめ

スナップショットをリストアしてDBの状態が過去に戻った場合、一度同期済みとなったデータを再度配信してくれるのかが心配でしたが、問題なく配信してくれました。
今回の検証結果からすると、参照系復旧までの時間を短縮できそうです。
ディストリビューションの保有期間を考慮したり、実際にVMwareバックアップを使用するなど、もう少し深堀りして再度検証にチャレンジしていきます!

まだまだ修行中のデータベースエンジニア!毎日楽しくデータベースと格闘中! 元アパレル、趣味も音楽とファッション、DJできますオファーください!w