mysql
MySQL の組み込みレプリケーション機能を使用して可用性を最適化する (2)
ステップ 3: 相互マスター/スレーブ関係を作成する
まず、マシン B の my.cnf ファイルで、[mysqld] セクションに 'log を追加します-bin' を実行し、mysqld を再起動して、その上でレプリケーション機能を実行できるユーザー アカウントを作成します。次のコマンドを使用します。レプリケーション ユーザーを追加した後、「FLUSH PRIVILEGES」コマンドを使用して新しい認可テーブルをロードし、マシン A に戻り、その「my.cnf」に次の行を追加します。
master-host=10.1.1.2
master-user =replicate
master-password=password
マシン A のサービス プログラムを再起動すると、マシン A とマシン B の間に相互のマスターとスレーブの関係が確立されます。どのサーバーでレコードが更新されたり、レコードが挿入されたりしても、レコードは他のサーバーにコピーされます。注: スタンバイ マシンがバイナリ ログの変更をどれくらい早くマージできるかわからないため、この方法を使用して挿入または更新ステートメントの負荷分散を行うのは得策ではない可能性があります。
ステップ 4: データベース接続プログラムを変更する
マシン A とマシン B の間に相互関係を確立したため、このアプローチの利点を活用するにはデータベース接続プログラムを変更する必要があります。次の関数は、まずマシン A への接続を試行し、接続を確立できない場合はマシン B に接続します。
/*************************************************** ****
関数 db_connect()
成功した場合はリンク識別子を返し、エラーの場合は false を返します
**************************** *****************************/
function db_connect(){
$username = "replUser";
$primary = "10.1.1.1";バックアップ = "10.1.1.2";
# プライマリへの接続を試行
if(!$link_id = @mysql_connect($primary, $username, $password))
# セカンダリへの接続を試行
$link_id = @mysql_connect($secondary , $username, $password)
return $link_id;
?>
1 つは、メインの MySQL サービス プログラムが閉じている場合です。サーバーはまだ実行中です。もう 1 つの状況は、メイン サーバーがシャットダウンしていることです。 mysqld のみがシャットダウンされている場合、接続はすぐにバックアップ マシンに転送されますが、サーバー全体がシャットダウンされている場合は、PHP が原因で無限に待機することになります (2 分後に追跡を諦めましたが、注意が必要な時間は非常に短いです)。存在しないサーバーを探しています。残念ながら、fsockopen 関数とは異なり、mysql_connect 関数にはタイムアウト パラメーターがありませんが、fsockopen を使用してタイムアウトをシミュレートできます。
ステップ 5: 改良されたデータベース接続プログラム
/*************************************************** ****
関数 db_connect_plus()
成功した場合はリンク識別子を返し、エラーの場合は false を返します
**************************** *****************************/
function db_connect_plus(){
$username = "ユーザー名"
$primary = "10.1.1.1";
$backup = "10.1.1.2";
$timeout = 15; // 秒単位のタイムアウト
if($primary, 3306, &$errno, &$ errstr, $timeout)){
fclose($fp);
return $link = mysql_connect($primary, $username, $password);
}
if($fp = fsockopen($secondary, 3306, &$errno, &$) errstr, $timeout)){
fclose($fp);
return $link = mysql_connect($secondary, $username, $password);
return
}
これ改良された関数により、調整可能なタイムアウト機能が提供されますが、これは mysql_connect 関数にはないものです。接続がすぐに失敗した場合 (マシンは「生きている」が mysqld が「ダウン」している場合など)、関数はすぐに 2 番目のサーバーに移動します。上記の関数は非常に堅牢です。接続を試行する前にテストして、サービス プログラムが指定されたポートでリッスンしているかどうかを確認します。これにより、エラー状態を適切に処理できるようになります。デフォルトのポート 3306 を変更する場合は、必ずポート番号を変更してください。
結論とコメント
まず、完全なデータのスナップショットがあることを確認してください。テーブルやデータベースのコピーを忘れると、待機系プログラムが停止してしまいます。スナップショットが生成される時間は重要です。データ ファイルをコピーする前に、バイナリ ログ機能が無効になっていることを確認する必要があります。スナップショットを取得する前にバイナリ ログ機能が有効になっている場合、スレッドが重要なレコードをインポートしようとすると、主キーの重複により停止する可能性があるため、スタンバイ スレッドが停止する可能性があります。最善の方法は、パート 2 で説明した解決策に従うことです。クローズ、コピー、バイナリ ログ機能の再起動を許可します。
元の方法でレプリケーション プロセスを構成し、スタンバイ マシンがマスター マシンと同期していることを確認するために、適切なタイミングでスタンバイ マシンに注意を払うことをお勧めします。
レプリケーション機能を使用するシステムの負荷分散パフォーマンスをテストしたことはありませんが、このようなシステムを柔軟に使用して、挿入と更新のバランスをとります。たとえば、2 つのサーバー上の 2 つのレコードが同じ auto_increment 値を指定した場合、スタンバイ スレッドはどのレコードで停止しますか?このような問題では、ロード バランシングが読み取り専用として処理され、1 つのサーバーがすべての挿入と更新を処理し、一方、一連のスタンバイ (マスターとは別に複数のスタンバイを使用できます) がすべての選択を処理します。
MySQLには既にレプリケーションシステムの機能がいくつか備わっており、構成も非常にシンプルなのでとても嬉しいです。これを使用すると、制御不能なイベントに対する追加のセキュリティの提供を開始できます。ここでは、私がテストして使用したレプリケーション機能についてのみ触れましたが、MySQL オンライン ドキュメントのパート 11 で詳しく説明されています。
---------------------------------------------- --- ----------------------------------
訳者の言葉:
元々使っていたバージョンなので3.22 MySQL なので、テストするには最新のプログラム バージョン 3.23.24 をダウンロードする必要がありました。マシンが 1 台しかないので、バイナリ ログの設定を増やしました。ただし、この記事に記載されているように、ファイルは実際に生成されます。興味のある方はぜひご自身で試してみてください。また、最新の MySQL ユーザーマニュアルでは、このレプリケーション機能はバージョン 3.23.15 以降でのみ利用可能であることがわかりました。ご自身の MySQL バージョンを確認してください。同時に記事内のバイナリログの設定をmy.cnfに設定します。私が使用しているバージョン 3.23.24 では、マニュアルにはパラメータ設定用のファイルが 3 つあると記載されています。Windows ディレクトリ内の my.ini ファイル、c:my.cnf、c:mysqldatamy.cnf です。 「log-bin」を設定するとき (最初にログパラメータを設定する必要はありません)、mysql に付属する
WinMySQLadmin ソフトウェアを使用して設定し、my.ini に設定したものとは異なります。記事を自分でテストしてください。
原著者: Michael
出典: PHPBuilder.com