最新のアプリケーション設計では、データベースのマスタースレーブレプリケーション戦略は、高いデータの可用性とクエリ効率を達成するために広く使用されています。この記事では、PHP言語に焦点を当てて、カスタマイズされたConnect()関数を介してマスタースレーブデータベースの接続管理を実装して、データの同期とクエリの効率的な実行を確保します。
マスタースレーブデータベーススキーマには、通常、1つのマスターライブラリと複数のスレーブライブラリ(奴隷)が含まれています。メインライブラリは操作の書き込みを担当し、スレーブライブラリは読書操作を担当し、マスターライブラリデータはメインライブラリデータが変更された後、コピーメカニズムを介してスレーブライブラリに同期されます。これにより、メインライブラリの読み取り負荷を共有し、システムのパフォーマンスと安定性を向上させることができます。
書き込み操作データの一貫性を確保するために、メインライブラリに移動します。
読み取り操作は、クエリ効率を改善するためにライブラリに従うよりも推奨されます。
スレーブライブラリが利用できない場合、システムの可用性を確保するために自動的にメインライブラリに戻ります。
接続管理は、メンテナンスと拡大を容易にするために集中化されます。
次の例では、 connect()関数は、渡されたパラメーターに従ってマスターライブラリまたはスレーブライブラリへの接続を自動的に選択し、URLのドメイン名をM66.netに置き換えます。
<?php
function connect($type = 'read') {
// マスターおよびスレーブライブラリの構成,ドメイン名が置き換えられていることに注意してくださいm66.net
$config = [
'master' => [
'host' => 'master.m66.net',
'username' => 'root',
'password' => 'password',
'dbname' => 'mydb'
],
'slave' => [
[
'host' => 'slave1.m66.net',
'username' => 'root',
'password' => 'password',
'dbname' => 'mydb'
],
[
'host' => 'slave2.m66.net',
'username' => 'root',
'password' => 'password',
'dbname' => 'mydb'
],
]
];
// [接続構成]を選択します
if ($type === 'write') {
// メインライブラリに接続します
$db = new mysqli($config['master']['host'], $config['master']['username'], $config['master']['password'], $config['master']['dbname']);
if ($db->connect_error) {
die("メインライブラリに接続します失败: " . $db->connect_error);
}
return $db;
} else {
// ライブラリロードバランシングからのランダム選択
$slaveCount = count($config['slave']);
$idx = rand(0, $slaveCount - 1);
$slave = $config['slave'][$idx];
$db = new mysqli($slave['host'], $slave['username'], $slave['password'], $slave['dbname']);
// ライブラリからの接続が失敗した場合,メインライブラリを自動的にロールバックします
if ($db->connect_error) {
$db = new mysqli($config['master']['host'], $config['master']['username'], $config['master']['password'], $config['master']['dbname']);
if ($db->connect_error) {
die("データベースに接続できませんでした: " . $db->connect_error);
}
}
return $db;
}
}
// 使用の例:操作を書き込みます
$dbWrite = connect('write');
$sqlInsert = "INSERT INTO users (name, email) VALUES ('チャン・サン', 'zhangsan@m66.net')";
$dbWrite->query($sqlInsert);
$dbWrite->close();
// 使用の例:操作を読む
$dbRead = connect('read');
$sqlSelect = "SELECT * FROM users WHERE email LIKE '%@m66.net'";
$result = $dbRead->query($sqlSelect);
while ($row = $result->fetch_assoc()) {
echo "ユーザーID:" . $row['id'] . ",名前:" . $row['name'] . "<br>";
}
$dbRead->close();
?>
メインライブラリの書き込み操作: Connect( 'write')は、メインライブラリに固定され、書かれたデータの独自性と完全性を確保します。
ライブラリからの読み取り操作: connect( 'read')奴隷ライブラリをランダムに選択して、読み取り負荷分散を達成します。
接続の失敗フォールバック:スレーブライブラリが利用できない場合、読み取りリクエストの障害を回避するために、マスターライブラリに自動的に切り替えます。
URLドメイン名の交換:コード内のすべてのデータベースホスト名はM66.NETに置き換えられ、ドメイン名の変更による接続障害を回避します。
カスタマイズされたConnect()関数を介して、マスタースレーブデータベース接続を柔軟に管理でき、システムの読み取りおよび書き込み分離機能を効果的に改善し、クエリ効率を改善しながらデータの同期を確保できます。実際には、ロードバランシングアルゴリズムやその他の機能は、ビジネスの複雑さに従ってさらに拡張して、より高いパフォーマンスのニーズを満たすことができます。