ホームページ >バックエンド開発 >PHPチュートリアル >MySQL の組み込みレプリケーション機能を使用して可用性を最適化する_PHP チュートリアル
Soundbreak では、ライブ オーディオとビデオを 1 日 24 時間再生しているため、MySQL の新しいレプリケーション機能について説得力のあるテストを行うことはできません。テストを通じて、この機能を使用してバックアップ データベース サーバーとのデータ同期を維持できることがわかりました。これにより、何らかの理由でメイン サーバーに障害が発生した場合でも、バックアップ マシンを使用してすべてのクエリを処理できるようになります。このような要件に対して、2 つのサーバーを構成することは難しくありません。プロセス全体について詳しく説明し、メインサーバーに障害が発生した場合に PHP を使用してクエリをリダイレクトする方法についても説明します。
MySQL の内部レプリケーション機能は、複数のサーバー間で確立され、サーバー間に主従関係を設定することで実現されます。そのうちの 1 つはマスター サーバーとして機能し、他のものはスレーブ サーバーとして機能します。 2 つのサーバーを構成して、1 台をマスター、もう 1 台をスレーブにする方法について具体的に説明します。そして、それらを切り替えるプロセスについて説明します。 MySQL バージョン 3.23.23 で構成とセットアップのプロセスを実行し、このバージョンでテストも実行しました。 MySQL 開発者は、最新バージョンを使用することが最善であり、マスター サーバーとスレーブ サーバーの両方で同じバージョンを使用することを推奨しています。同時に、MySQL バージョン 3.23 はまだベータ版であり、このバージョンには下位互換性がない可能性があります。このため、実際の Web サイトではまだこのバージョンを使用していません。フォールト トレランスの利点の 1 つは、クエリを中断することなくサーバーをアップグレードできることです。
ステップ 1: メインサーバーを構成する
この記事の残りの部分では、2 つのサーバーを指定します。 A (IP は 10.1.1.1) がメイン サーバー (ホストと呼ばれます) として機能します。 B (IP は 10.1.1.2) はバックアップ サーバー (バックアップ サーバーと呼ばれます) として機能します。
MySQL のレプリケーション機能の実装プロセスは次のとおりです。スタンバイ マシン (B) がホスト マシン (A) に接続し、ホスト マシンのバイナリ更新ログを読み取り、変更を自身のデータベースにマージします。スタンバイ マシンにはホスト マシンに接続するためのユーザー アカウントが必要なので、次のようにホスト マシン上にアカウントを作成し、ファイル権限のみを付与します。
パスワードで識別された @10.1.1.2 を複製するには *.* にファイルを許可します;
スタンバイマシンがメインマシンに接続できるようにするには、メインマシンで FLUSH PRIVILEGES を実行する必要がありますが、次の手順でサーバーを停止しますので、心配しないでください。
ここで、ホスト データベースのスナップショットを取得し、バイナリ更新ログの生成を許可するようにホストを構成する必要があります。まず、my.cnf ファイルを編集してバイナリ更新ログを許可します。そのため、[mysqld] セクションの下のどこかに log-bin という行を追加します。次回サーバーが起動すると、ホストはバイナリ更新ログ (名前: -bin.) を生成します。バイナリ更新ログを有効にするには、MySQL サービス プログラムをシャットダウンし、ホスト上のすべてのデータベース ディレクトリを別のディレクトリに移動して、mysqld を再起動します。
すべてのデータベースを取得していることを確認してください。取得していないと、コピー時にメイン マシンにテーブルが存在し、スタンバイ マシンにテーブルが存在しない場合、エラーで終了します。これで、データのスナップショットと、スナップショットの作成以降のデータベースへの変更を記録するバイナリ ログが作成されました。 MySQL データ ファイル (*.MYD、*.MYI、および *.frm) はファイル システムに依存するため、Solaris から Linux などにファイルを単純に転送することはできないことに注意してください。異種サーバー環境にいる場合は、mysqldump ユーティリティまたはその他のカスタム スクリプトを使用してデータのスナップショットを取得する必要があります。
ステップ 2: バックアップ マシンを構成する
続けましょう。スタンバイ マシンの MySQL サービス プログラムを停止し、メイン マシンからコピーしたデータベース ディレクトリをスタンバイ マシンのデータ ディレクトリに移動します。ディレクトリの所有者とグループを MySQL ユーザーの対応する値に必ず変更し、ファイル モードを 660 (所有者とグループのみ読み取りおよび書き込み可能) に変更し、ディレクトリ自体を 770 に変更してください。 (所有者とグループのみ) 読み取り、書き込み、実行可能)。
続く。バックアップ マシンで MySQL サービス プログラムを起動し、MySQL が適切に動作していることを確認します。いくつかの選択クエリを実行して (クエリの更新や挿入は行わないでください)、最初の手順で取得したデータ スナップショットが成功したかどうかを確認します。次に、テストが成功したら、MySQL サービス プログラムをシャットダウンします。
スタンバイ マシン上でアクセスする必要があるホストを構成し、ホストから変更を受信できるようにします。したがって、サーバー上の my.cnf ファイルを編集し、[mysqld] セクションに次の行を追加する必要があります。
マスターホスト=10.1.1.1
マスターユーザー=レプリケート
マスターパスワード=パスワード
スタンバイ サービス プログラムを開始すると、スタンバイ サービス プログラムは my.cnf ファイルで指定されたホストをチェックして変更があるかどうかを確認し、これらの変更を独自のデータベースにマージします。スタンバイ マシンは、ホストの master.info ファイルから受信したホストの更新レコードを保持します。スタンバイ スレッドのステータスは、SQL コマンド SHOW SLAVE-STATUS で確認できます。スタンバイ マシンでバイナリ ログを処理するときに
が発生したらどうなるでしょうか?エラーが発生すると、スタンバイ スレッドが終了し、*.err ログ ファイルにメッセージが生成されます。その後、SQL ステートメント SLAVE START を使用してエラーを修正し、スタンバイ スレッドを再起動できます。スレッドは、ホスト バイナリ ログ処理が中断されたところから処理を続行します。
この時点で、メイン マシンで発生したデータ変更はスタンバイ マシンにコピーされているはずです。これをテストするには、メイン マシンでレコードを挿入または更新し、スタンバイ マシンでこのレコードを選択します。
これで、マシン A からマシン B へのマスターとスレーブの関係が確立されたため、マシン A がクラッシュした場合、すべてのクエリをマシン B にリダイレクトできますが、マシン A が回復したときに変更を復元するメソッドがありません。マシンA。この問題を解決するには、マシン B からマシン A へのマスター/スレーブ関係を作成します。
ステップ3:相互主従関係を作る
まず、マシン B の my.cnf ファイルの [mysqld] セクションに log-bin を追加し、mysqld を再起動して、その上でレプリケーション機能を実行できるユーザー アカウントを作成します。次のコマンドを使用します。
パスワードで識別された @10.1.1.1 を複製するには *.* にファイルを許可します;
レプリケートされたユーザーを追加した後、マシン B で FLUSH PRIVILEGES コマンドを実行して新しい認証テーブルをロードし、マシン A に戻り、その my.cnf に次の行を追加します。
マスターホスト=10.1.1.2
マスターユーザー=レプリケート
マスターパスワード=パスワード
マシン A のサービス プログラムを再起動すると、マシン A とマシン B の間に相互主従関係が確立されます。どのサーバーでレコードが更新されたり、レコードが挿入されたりしても、レコードは他のサーバーにコピーされます。注: スタンバイ マシンがバイナリ ログの変更をマージできる速度がわからないため、この方法を使用して挿入ステートメントまたは更新ステートメントの負荷分散を行うのは得策ではない可能性があります。
ステップ 4: データベース接続プログラムを変更する
マシン A とマシン B の間に相互関係が確立されたので、このアプローチを活用するにはデータベース接続プログラムを変更する必要があります。次の関数は、最初にマシン A への接続を試みます。接続を確立できない場合は、マシン B に接続します。
/*************************************************** ****
関数 db_connect()
成功した場合はリンク識別子を返し、エラーの場合は false を返します
************************************************* ******/
関数 db_connect(){
$username = "replUser";
$password = "パスワード";
http://www.bkjia.com/PHPjc/630908.html