MySQL の高可用性(HA) は、障害や障害が発生した場合に MySQL データベースを利用可能にするために選択できます。この機能により、より高い稼働時間要件とゼロデータ損失許容誤差を設定できます。この記事では、高可用性の一般的な概念と、MySQL の高可用性オプションの仕組みについて説明します。
高可用性とは
高可用性とは、システムやサービスが機能を継続し、障害や停止が発生した場合でも利用可能な状態を維持する能力のことです。高可用性システムは、組織のミッションクリティカルなシステムとアプリケーションを常に稼働させます。これは、医療、金融、航空などの分野でミッションクリティカルなシステムの障害が深刻な結果をもたらす可能性がある組織にとって特に重要です。
高可用性は通常、SLA(サービス・レベル・アグリーメント)で定義された稼働時間の割合で表され、100 のスコアは、障害のないシステムを表します。これは事実上達成不可能であるため、ほとんどの組織は「5ナイン」または99.999% の可用性を目標としています。
MySQL による高可用性の実現
障害が発生した場合は、可用性の高いシステムが即座にリカバリできる必要があります。高可用性アーキテクチャには、リカバリ性と高可用性を確保するために連携する少なくとも 3 つの基本要素が必要です。
障害検出
MySQL には高可用性オプションがあり、アプリケーションがより高い稼働時間(データ損失許容度なし)の要件を満たすことができます。高可用性オプションがオンの場合、MySQL システムは異なる障害ドメインまたは可用性ゾーンに 3 つのインスタンスを作成します。
データは、MySQL グループ・レプリケーションを使用して 3 つのインスタンス間でレプリケーションされ、アプリケーションはプライマリ・インスタンスに接続して、データベースとの間でデータの送受信を行います。障害が発生すると、数分でセカンダリ・インスタンスへの自動フェイルオーバーが起動します。
フェイルオーバー
フェイルオーバー・メカニズムは、サービスをレプリケートされたインスタンスに転送します。複数のバックアップインスタンスが使用可能な場合、フェイルオーバー・メカニズムはプライマリ・ノードにプロモートする最適なインスタンスを選択します。
リダイレクト・メカニズム
セカンダリ・インスタンスへのフェイルオーバーが発生すると、高可用性機能により、全てのアプリケーションとユーザの接続が新しいプライマリ・ノードにリダイレクトされます。また、全てのクエリを古いプライマリ・ノードから新しいプライマリ・データベースにリダイレクトします。
MySQL の高可用性(HA):稼働時間
稼働時間とは、システムが使用可能で正常に機能する時間であり、システムが稼働すると予想される合計時間の割合として表されます。稼働時間が高いということは、ほとんどの場合、システムが使用可能で期待どおりに機能することを意味します。
MySQL の高可用性(HA)のさまざまなレベルで期待できる稼働時間は、実装する特定の高可用性(HA)ソリューションによって異なります。
MySQL レプリケーション
MySQL レプリケーションでは、冗長性とフェイルオーバーを提供する複数のサーバーをセットアップし、HA 機能のない MySQL サーバーよりも高い稼働時間をサポートできます。マスター・スレーブ構成では、1 つのマスター・サーバーが読み取りと書き込みを受け付け、1 つ以上の読み取り専用スレーブ・サーバーを使用します。マスター・サーバーからのデータは、スレーブ・サーバーに非同期でレプリケートされます。
フェイルオーバーを実装するには、1 つまたは複数のスレーブ・サーバーをスタンバイとして設定し、障害発生時にマスタに昇格させる必要があります。フェイルオーバーは通常、スレーブ・ノードをマスタノードに昇格させる手動プロセスです。昇格されたスレーブのステータスを読み取り/書き込みモードに変更して、クエリを受け入れる必要があります。
フェイルオーバーは手動で行われるため、時間がかかり、人為的ミスが発生しやすくなり、停止時間が長くなる可能性があります。MySQL レプリケーションは非同期レプリケーションも使用します。つまり、マスターに障害が発生した場合、マスターにコミットされたトランザクションがスレーブ・サーバーにレプリケーションされていない可能性があります。重要なデータ損失が発生した場合は、データをリストアし、システムの停止時間を増やす必要があります。
MySQL グループのレプリケーション
MySQL グループ・レプリケーションは、MySQL レプリケーションよりも高い稼働時間を実現します。MySQL グループ・レプリケーションを使用して、1 つのサーバーをプライマリ・サーバーとして、他のサーバーをセカンダリ・サーバーとして指定したグループ内に複数の MySQL サーバーを設定します。グループ内の各サーバーはデータのコピーを保持し、レプリケーションを使用して、コピーが同期されたままであることを確認します。
プライマリ・サーバーがダウンした場合、グループ内のセカンダリ・サーバーは自動的に障害を検出し、フェイルオーバー・プロセスを開始します。セカンダリ・サーバーの 1 つが自動的に新しいプライマリ・サーバーにプロモートされ、クライアントからのリクエストの処理が開始されます。グループ内の他のセカンダリ・メンバーは、新しいプライマリ・サーバーから更新を受信し、クライアント読み取り要求の処理を続行します。
障害が発生したサーバーがオンラインに戻ると、セカンダリ・サーバーとしてグループに自動的に再結合されます。
MySQL グループ・レプリケーションでは障害の検出とフェイルオーバーが自動的に行われるため、ダウンタイムは最小限に抑えられ、ユーザーやアプリケーションは通常、障害が発生したことに気づきません。
MySQL クラスタ
MySQL クラスタ HA ソリューションは、最高レベルの稼働時間を提供します。この高可用性の分散データベースシステムは、自動フェイルオーバーと負荷分散とともに、高可用性、性能、スケーラビリティを提供し、ダウンタイムをほぼゼロにするよう設計されています。
MySQL クラスタは、データの保存と管理のために連携する 3 種類のノードを使用します。
- データノード:データを保存し、読み取り/書き込みクエリを処理します。
- MySQL サーバー・ノード:クライアント・アプリケーションからクエリを受信し、データ・ノードで処理してから、結果をクライアントに返します。
- 管理ノード:クラスタの動作を管理し、障害が発生した場合はフェイルオーバーとリカバリを処理します。
クラスタ内の 1 つ以上のノードに障害が発生した場合、クラスタは自動的に問題を検出し、フェイルオーバー・プロセスをトリガーします。プロセス全体は通常、障害発生後 1 秒以内に発生し、クライアント・アプリケーションへのサービスを中断することはありません。クラスタは、ダウンタイムなしで通常どおり動作し続けます。