ホームページ バックエンド開発 PHPチュートリアル データベースのマスター/スレーブ設定_PHP チュートリアル

データベースのマスター/スレーブ設定_PHP チュートリアル

Jul 13, 2016 pm 05:52 PM
による 分離 私たち データベース 方法 比較する 設定 ビュー 読み書き 行為 使用 プロジェクト

アクセス量が比較的多い一部のプロジェクトでは、ユーザーの操作を分散させ、負荷分散を実現するために、データベースのマスタースレーブ方式を使用して読み取りと書き込みを分離することがよくあります。そこで、ネット上で関連情報を調べてまとめてみました。以下の概念の一部は百科事典またはオンライン PPT から引用されており、最後のコードはこのプロジェクトからのものです。

まず第一に、これまでに同様の機能を実行したことがないため、概念的に理解する必要があります:

負荷分散
負荷分散: 負荷 (作業タスク) を複数のオペレーティングユニットに分散してバランスをとって実行し、作業タスクをまとめて完了します。大きく分けて2種類に分かれます
1. クラスタリング
単一の高負荷オペレーションを複数のノードデバイスに分散して並列処理し、各ノードデバイスの処理完了後に結果が要約されてユーザーに返されるため、システムの処理能力が大幅に向上します。
2. 気晴らし
大量の同時アクセスまたはデータ トラフィックを複数のノード デバイスで個別に処理することで共有し、ユーザーが応答を待つ時間を短縮します。これは主に Web サーバー、FTP サーバー、エンタープライズ キー アプリケーション サーバーなどのネットワーク アプリケーションを対象としています。マスター/スレーブ アーキテクチャは、このタイプの負荷分散です。

マスタースレーブアーキテクチャの利点
1. ロードバランシング(読み書きを分離し、データ処理効率を向上)
2. 高可用性とフェイルオーバー機能 (データ分散、安定性の向上。マスターサーバーに障害が発生した場合でも、スレーブサーバーを使用してサポートできます)
3. バックアップ (それ自体をバックアップすることはできませんが、データベースの災害復旧、バックアップ、リカバリ、その他の操作を容易にするバックアップ マシンを提供できます)
4. データの一貫性と競合の回避
5. Mysql のアップグレードをテストします

Mysqlコピー関数
1: 1 つのマスターと複数のスレーブのメカニズムをサポートします。データはマスター サーバーからスレーブ サーバーにコピーされます。
2: マルチレベル構造をサポートします。マスターとスレーブ、スレーブとスレーブ、マスターとスレーブ(相互にマスターとスレーブ)。
3: フィルタリング機能をサポートします (メインサーバー上のデータのすべてではなく、一部のみをコピーできます)。

コピーの種類
1. ステートメントベースのレプリケーション: SQL ステートメントがマスター サーバーで実行され、同じ SQL ステートメントがスレーブ サーバーで実行されます。 Mysql はデフォルトでステートメントベースのレプリケーションを使用します。これは比較的効率的です。
2. 行ベースのレプリケーション: スレーブ サーバーでコマンドを実行する代わりに、変更された内容をコピーします (mysql5.0 以降でサポート)。
3. 混合タイプのレプリケーション: デフォルトではステートメントベースのレプリケーションが採用されます。ステートメントベースのレプリケーションが正確ではないことが判明した場合は、行ベースのレプリケーションが使用されます
対応するバイナリ ログが 3 つあります:
1:ステートメント
2:ロウ
3: ミックス

サーバー構造の要件
1: マスター/スレーブ サーバー内のテーブルは、異なるテーブル タイプを使用できます。さらに、複数のスレーブ サーバーを同時に持つマスター サーバーはパフォーマンスに影響します。1 台のサーバーをスレーブ サーバー プロキシとして使用し、BLOCKHOLE テーブル タイプを使用できます。ログを記録するだけであり、パフォーマンスを向上させるために複数のサーバーを駆動します。
2: マスター/スレーブ サーバー内のテーブルは、異なるフィールド タイプを使用できます。
3: マスター/スレーブ サーバー内のテーブルは異なるインデックスを使用できます。マスター サーバーは主に書き込み操作に使用されるため、主キーや一意のインデックスなどのデータの関係を保証するインデックスを追加する必要はありません。スレーブ サーバーは通常、読み取り操作に使用されるため、インデックスを設定できます。クエリの特性。さらに、異なるスレーブ サーバーは、異なるクエリに対して異なるインデックスを設定できます。

コピープロセス
1: マスターサーバーは変更をバイナリログファイルに記録します。これらの記録はバイナリログイベント
と呼ばれます。 2: スレーブサーバーはマスターのバイナリログイベントをリレーログにコピーします
3: スレーブはリレー ログ内のイベントをやり直し、変更を自身のデータに反映します。

PHPコードの実装
1.サーバー接続設定ファイル
多態性のマスター/スレーブ サーバーがある場合は、数値を下方向に増やすだけです。

[php]
[データベース]
dbname = "vis_db"
文字セット = "utf8"
;主様
servers.0.master = true
servers.0.adapter = "MYSQLI"
servers.0.host = "vis_db"
servers.0.username = "vis"
servers.0.password = "vis"
;从
servers.1.master = false
servers.1.adapter = "MYSQLI"
servers.1.host = "vis_mmc"
servers.1.username = "vis"
servers.1.password = "vis"

2. データベース操作コード
ユーザー IP に基づいて余りを計算した後、サーバー上のどのデータベースに接続するかを決定します。
プロジェクトでは Zend Framework が使用されています。
[php]

/**
* データベースファクトリークラス
*
* @create 2012-05-29
* @note: このクラスは、さまざまな構成パラメーターの Zend_Db_Adapter インスタンスを作成するために使用されます
​*/
include_once 'lib/getRequestIP.php';
クラス Free_Db_Factory
{

/**
* * Zend_Db_Adapter インスタンス配列
*
* @var 配列
​​*/
保護された静的 $_dbs = array();
保護された関数 __construct($sName)
{
{
をお試しください $params = $this->getDbConfig($sName); self::$_dbs[$sName] = Zend_Db::factory($params['adapter'], $params); } catch (例外 $e) {
if (デバッグ) {
エコー $e->getMessage();                                                                        出る
}
}

/**
* Zend_Db_Adapter インスタンスを取得します
* @return Zend_Db_Adapter
​​*/
パブリック静的関数 getDb($sName)
{
If (emptyempty($sName)) {
出る
}

If (!isset(self::$_dbs[$sName])) {
新しい自分($sName)
}
自己を返す::$_dbs[$sName]
}

/**
* データベース構成を取得します
​​*/
プライベート関数 _getDbConfig($sName)
{
$configArr = 配列(); $dbConfig = Zend_Registry::get('db')->database->toArray(); $serverConfigs = $dbConfig['servers']; $masters = array(); $slaves = array(); foreach ($serverConfigs を $value) {
If (!isset($value['master'])) {
続く;                                                                        If (true == $value['master']) {
$masters[] = $value;                                                                        If (false == $value['master']) {
$slaves[] = $value;                                                                        }
$masterNum = count($masters); $slaveNum = count($slaves);
$requestIP = $this->_getRequestIP();
スイッチ ($sName) {
            ケース「マスター」:
                if ($masterNum > 1) {
                    $configArr = $masters[$requestIP % $masterNum]; 
                } その他 {
                    $configArr = $masters[0]; 
                }
                壊す; 
            ケース「スレーブ」:
                if ($slaveNum > 1) {
                    $configArr = $slaves[$requestIP % $slaveNum]; 
                } その他 {
                    $configArr = $slaves[0]; 
                }
                壊す; 
            デフォルト:
                壊す; 
        }
        if (emptyempty($configArr)) {
            戻り配列(); 
        }
 
        $configArr['dbname'] = $dbConfig['dbname']; 
        $configArr['charset'] = $dbConfig['charset']; 
        $configArr を返します。 
    }
 
    /**
* リクエストIPを取得します
​​*/
    プライベート関数 _getRequestIP()
    {
        $ip = getRequestIP(true); 
        return sprintf('%u', ip2long($ip)); 
    } www.2cto.com
 
    /**
* Zend_Db_Adapter エンティティを破棄します (一部のリクエストには時間がかかるため、この期間にデータベースがタイムアウトする可能性があります)
​​*/
    パブリック静的関数 destructDb($sName = null)
    {
        if (null === $sName) {
            self::$_dbs = null; 
        } その他 {
            unset(self::$_dbs[$sName]); 
        }
    }
 
}
暗号を使用して、マークを入力し、操作主がデータベースからであることを確認します:
[php]
$oSlaveDb = Free_Db_Factory::getDb('スレーブ'); 


作者:新生2011

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478116.html技術記事一部のアクセス量が比較的大きいものについては、ストリーミング ユーザーの操作により、データ ホストからの書き込み分離を頻繁に使用して、ネットワーク上で関連する情報を検出します。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

AIはフェルマーの最終定理を克服できるか?数学者は100ページの証明をコードに変えるために5年間のキャリアを放棄した AIはフェルマーの最終定理を克服できるか?数学者は100ページの証明をコードに変えるために5年間のキャリアを放棄した Apr 09, 2024 pm 03:20 PM

フェルマーの最終定理、AIに征服されようとしている?そして、全体の中で最も意味のある部分は、AI が解決しようとしているフェルマーの最終定理は、まさに AI が役に立たないことを証明するものであるということです。かつて、数学は純粋な人間の知性の領域に属していましたが、現在、この領域は高度なアルゴリズムによって解読され、踏みにじられています。画像 フェルマーの最終定理は、何世紀にもわたって数学者を悩ませてきた「悪名高い」パズルです。それは 1993 年に証明され、現在数学者たちはコンピュータを使って証明を再現するという大きな計画を立てています。彼らは、このバージョンの証明に含まれる論理的エラーがコンピュータによってチェックできることを望んでいます。プロジェクトアドレス: https://github.com/riccardobrasca/flt

iPhoneでサイレントモードが機能しない:修正 iPhoneでサイレントモードが機能しない:修正 Apr 24, 2024 pm 04:50 PM

おやすみモードで電話に応答することさえ、非常に煩わしい経験になる可能性があります。名前が示すように、おやすみモードでは、すべての着信通知と電子メール、メッセージなどからの警告がオフになります。これらのソリューション セットに従って問題を修正できます。解決策 1 – フォーカス モードを有効にする 携帯電話でフォーカス モードを有効にします。ステップ 1 – 上から下にスワイプしてコントロール センターにアクセスします。ステップ 2 – 次に、携​​帯電話の「フォーカスモード」を有効にします。フォーカス モードでは、電話機のサイレント モードが有効になります。携帯電話に着信通知が表示されることはありません。解決策 2 – フォーカス モード設定を変更する フォーカス モード設定に問題がある場合は、修正する必要があります。ステップ 1 – iPhone の設定ウィンドウを開きます。ステップ 2 – 次に、フォーカス モード設定をオンにします

Hibernate はポリモーフィック マッピングをどのように実装しますか? Hibernate はポリモーフィック マッピングをどのように実装しますか? Apr 17, 2024 pm 12:09 PM

Hibernate ポリモーフィック マッピングは、継承されたクラスをデータベースにマップでき、次のマッピング タイプを提供します。 join-subclass: 親クラスのすべての列を含む、サブクラス用の別個のテーブルを作成します。 table-per-class: サブクラス固有の列のみを含む、サブクラス用の別個のテーブルを作成します。 Union-subclass: join-subclass と似ていますが、親クラス テーブルがすべてのサブクラス列を結合します。

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

HTML がデータベースを読み取る方法の詳細な分析 HTML がデータベースを読み取る方法の詳細な分析 Apr 09, 2024 pm 12:36 PM

HTML はデータベースを直接読み取ることはできませんが、JavaScript と AJAX を通じて実現できます。この手順には、データベース接続の確立、クエリの送信、応答の処理、ページの更新が含まれます。この記事では、JavaScript、AJAX、および PHP を使用して MySQL データベースからデータを読み取る実践的な例を示し、クエリ結果を HTML ページに動的に表示する方法を示します。この例では、XMLHttpRequest を使用してデータベース接続を確立し、クエリを送信して応答を処理することで、ページ要素にデータを埋め込み、データベースを読み取る HTML の機能を実現します。

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

PHP でデータベース接続エラーを処理する方法 PHP でデータベース接続エラーを処理する方法 Jun 05, 2024 pm 02:16 PM

PHP でデータベース接続エラーを処理するには、次の手順を使用できます。 mysqli_connect_errno() を使用してエラー コードを取得します。 mysqli_connect_error() を使用してエラー メッセージを取得します。これらのエラー メッセージをキャプチャしてログに記録することで、データベース接続の問題を簡単に特定して解決でき、アプリケーションをスムーズに実行できるようになります。

Golangでデータベースコールバック関数を使用するにはどうすればよいですか? Golangでデータベースコールバック関数を使用するにはどうすればよいですか? Jun 03, 2024 pm 02:20 PM

Golang でデータベース コールバック関数を使用すると、次のことを実現できます。 指定されたデータベース操作が完了した後にカスタム コードを実行します。追加のコードを記述せずに、個別の関数を通じてカスタム動作を追加します。コールバック関数は、挿入、更新、削除、クエリ操作に使用できます。コールバック関数を使用するには、sql.Exec、sql.QueryRow、または sql.Query 関数を使用する必要があります。

See all articles