最新の高可用性アーキテクチャでは、データベース災害復旧(フェイルオーバー)は、システムの高い信頼性を確保するための重要な手段です。特に、分散データベースまたはマスタースレーブアーキテクチャでは、マスターデータベースが失敗した場合、サービスを提供するためにスタンバイデータベースに切り替える必要があります。これを達成するために、MySQLはプロパティMySQLI :: $ ERRNOを提供して、開発者がデータベース操作にエラーがあるかどうかを判断し、エラーコードを介して災害復旧スイッチをトリガーします。
この記事では、データベースがmysqli :: $ errnoを介して災害復旧を必要とするかどうかを判断し、災害復旧の切り替えの例を簡単に実装する方法を紹介します。
mysqli :: $ errnoは、 MySQLIクラスのプロパティであり、以前のMySQLクエリ操作のエラーコードを表します。クエリが成功した場合、プロパティの値は0です。エラーが発生した場合、プロパティは対応するMySQLエラーコードを返します。このプロパティを使用して、エラーが発生したかどうかを判断し、対応するエラー処理を行うことができます。
一般的なエラーコードは次のとおりです。
2002 :接続が拒否され、データベースを接続できません。
1040 :接続が多すぎると、データベース接続の数が上限に達します。
1213 :デッドロック、デッドロックエラー。
MySQLマスタースレーブアーキテクチャを使用していると仮定すると、マスターライブラリが故障した場合、代替スレーブライブラリに自動的に切り替える必要があります。 mysqli :: $ errnoを使用してエラーコードを決定して、災害復旧の切り替えが必要かどうかを判断できます。
これは、簡素化された災害復旧の切り替えの実装の例です。
<?php
// データベース接続構成
$primary_db_config = [
'host' => 'primary.m66.net',
'user' => 'root',
'password' => 'password',
'database' => 'test_db'
];
$secondary_db_config = [
'host' => 'secondary.m66.net',
'user' => 'root',
'password' => 'password',
'database' => 'test_db'
];
// データベース接続を作成します
function connectDatabase($db_config) {
$mysqli = new mysqli($db_config['host'], $db_config['user'], $db_config['password'], $db_config['database']);
if ($mysqli->connect_error) {
echo "接続に失敗しました: " . $mysqli->connect_error . "\n";
return null;
}
return $mysqli;
}
// メインライブラリに接続してみてください
$mysqli = connectDatabase($primary_db_config);
if ($mysqli === null) {
// 如果主库接続に失敗しました,バックアップライブラリに切り替えます
echo "主数据库接続に失敗しました,スタンバイデータベースに切り替えます...\n";
$mysqli = connectDatabase($secondary_db_config);
}
// クエリ操作を実行します
if ($mysqli) {
$query = "SELECT * FROM some_table";
if ($mysqli->query($query) === FALSE) {
// エラーコードに基づいて災害復旧の切り替えが必要かどうかを判断する
echo "クエリに失敗しました: " . $mysqli->errno . " - " . $mysqli->error . "\n";
if ($mysqli->errno == 2002 || $mysqli->errno == 1040) {
// データベース接続が間違っている場合、または接続の数がいっぱいの場合,データベースを切り替えてみてください
echo "データベースを切り替えてみてください...\n";
$mysqli = connectDatabase($secondary_db_config);
}
} else {
echo "クエリが成功しました\n";
}
}
データベース構成:マスターおよびスレーブライブラリのデータベース接続情報を構成しました。メインライブラリの接続構成は$ primary_db_config変数に保存され、スレーブライブラリの構成は$ secondary_db_configに保存されます。
データベース接続: ConnectDataBase()関数は、データベース接続を確立するために使用されます。データベース構成情報を受信し、 MySQLIオブジェクトを返し、接続が失敗した場合はnullを返します。
メインライブラリ接続が失敗したときにスレーブに切り替えます:メインライブラリ接続が失敗した場合、スレーブに接続して$ mysqli変数を新しい接続に向けようとします。
クエリ操作: $ mysqli-> query()を介してデータベースクエリを実行します。クエリが失敗した場合、 $ mysqli-> errnoを介してエラーコードを取得して、災害復旧の切り替えが必要かどうかを判断します。たとえば、 errno == 2002は、データベース接続が失敗したことを意味し、 errno == 1040はデータベース接続番号がいっぱいであることを意味します。どちらの場合も、スタンバイデータベースに切り替えようとします。
MySQLI :: $ errnoを使用すると、データベース操作のエラーを判断し、エラーコードを介して災害復旧の切り替えが必要かどうかを判断することができます。この簡単な例を使用して、マスタースレーブデータベーススキーマで災害復旧スイッチングを実行する方法を示します。実際の開発では、特定のエラーコードとシステム要件に基づいて災害復旧スイッチングロジックをカスタマイズして、システムの使いやすさと安定性をさらに向上させることができます。