序章

このチュートリアルでは、マスタースレーブデータベースレプリケーションとWordPress用のHyperDBプラグインを使用して、WordPressMySQLデータベースサーバーのセットアップをスケールアップする方法を説明します。 この方法でデータベースサーバーを環境に追加すると、WordPressアプリケーションが複数のデータベースサーバーから読み取ることができ、読み取りパフォーマンスが向上します。

MySQLレプリケーションは、ほとんどのWordPressインストールのように、頻繁な読み取りとまれな書き込みを処理するシステムで最大のパフォーマンス上の利点を享受します。 複数のスレーブを設定した単一のマスターを使用することで、ネットワーク帯域幅が不足するか、マスターが更新の負荷を処理できなくなるまで、システムを拡張するためにスレーブを追加できます。 必要に応じて、このチュートリアルのレプリケーションセクションの「スレーブ」部分を繰り返すことで、複数のスレーブを追加できます。

セットアップには、別個のMySQLデータベースサーバーに接続する2つの負荷分散されたWordPressアプリケーションサーバーが含まれていると想定しています(セットアップ方法のチュートリアルについては、前提条件を参照してください)。 このチュートリアルに従うために負荷分散されたアプリケーションサーバーを用意する必要は厳密にはありませんが、MySQLデータベースサーバーはアプリケーションサーバーから分離する必要があります。

前提条件

このチュートリアルを続行する前に、2つのチュートリアルを完了するか、同様の環境を用意しておく必要があります。

これらのチュートリアルに従った後、2つの負荷分散されたWebアプリケーションサーバーと個別のデータベースサーバーを使用してWordPressをセットアップするには、4つのVPSが必要です。 いくつかのVPSを扱うため、参照用に、既存の4つのVPSを次のように呼びます。

  • haproxy-www :WordPressWebアプリケーションサーバーのレイヤー4負荷分散用のHAProxyサーバー。 これはあなたのウェブサイトへの入り口です
  • wordpress-1 :最初のWordPressWebアプリケーションサーバー
  • wordpress-2 :2番目のWordPressWebアプリケーションサーバー
  • mysql-1 :WordPress用のMySQLサーバー

つまり、環境は次のようになります。

現在の環境に加えて、このチュートリアルでは追加のVPSが1つ必要になります。 私たちはそれを呼びます:

  • mysql-2 :スレーブMySQLデータベースサーバー

私たちの目標

このチュートリアルが終了すると、2台のデータベースサーバーがマスタースレーブ構成で複製されます。 WordPressサーバーは、HyperDB WordPressプラグインを使用して、マスターに選択的に書き込み、マスターデータベースとスレーブデータベースの両方から読み取ります。 最終的な環境は次のようになります。

このチュートリアルに従うために負荷分散されたアプリケーションサーバー(wordpress-1 / wordpress-2)を用意する必要はなく、必要に応じてスレーブデータベースを追加できることを覚えておいてください。

MySQLマスタースレーブレプリケーションを設定する

複数のデータベースサーバーから読み取るようにWordPressアプリケーションを構成する前に、MySQLレプリケーションを設定する必要があります。

MySQL Slave VPS、mysql-2を作成します

MySQLスレーブサーバーとして機能する新しいVPSを作成する必要があります。参照用に、このサーバーをmysql-2と呼びます。 スレーブは、WordPressデータベースを含むマスターMySQLサーバーのすべてのデータベースを複製するように構成されます。

mysql-2 で、MySQLソフトウェアをインストールします。

sudo apt-get update
sudo apt-get install mysql-server

MySQLインストールのrootパスワードを入力します。 次に、MySQLマスターサーバーで構成します。

既存のMySQLサーバーをマスターとして構成する

最初のステップは、既存のMySQLデータベースサーバーmysql-1をレプリケーションマスター構成でセットアップすることです。

mysql-1 で、MySQL構成ファイルを編集します。

sudo vi /etc/mysql/my.cnf

次の3行を検索します。

bind-address = mysql_1_private_IP #server-id = 1 #log_bin = /var/log/mysql/mysql-bin.log
  • bind-address :MySQLがリッスンするIPアドレス。 これは、元の設定からmysql-1のプライベートIPアドレスにすでに設定されている必要があります
  • server-id :一意のサーバーID。 これはマスターサーバーであるため、値を「1」のままにして、この行のコメントを解除します。
  • log_bin :バイナリログファイルの場所。 バイナリログは、レプリケーションのためにマスターからスレーブにデータ変更を送信するために使用されます。 この行のコメントを解除します

3行は次のようになります(強調表示されたものをデータベースサーバーのプライベートIPアドレスに置き換えてください)。

bind-address = mysql_1_private_IP server-id = 1 log_bin = /var/log/mysql/mysql-bin.log

オプションで、レプリケーションを wordpress データベースに制限する場合は、具体的には、構成に次の行を追加します(強調表示されたものを目的のデータベース名に置き換えます)。

binlog_do_db = wordpress

保存して終了します。 これらの変更を有効にするには、次のコマンドでmysqlを再起動します。

sudo service mysql restart

次のコマンドを使用してMySQLコンソールに接続し、プロンプトが表示されたらパスワードを入力します。

mysql -u root -p

レプリケーションの目的でスレーブMySQLサーバーによって使用されるユーザーを作成します。 このユーザーをreplと呼びます。 必ず交換してください repl_password 独自の強力なパスワードを使用します。 The % このユーザーのソースIPは何でもかまいませんが、 % スレーブMySQLサーバーのプライベートIPアドレスmysql-2を使用して、このユーザーとの接続をその特定のサーバーに制限します。

 CREATE USER'repl' @'  ' IDENTIFIED BY'repl_password ';  GRANT REPLICATION SLAVE ON  TO'repl' @'%';

まだMySQLコンソールを終了しないでください!

MySQLマスターのバックアップをエクスポートする

次に、MySQLマスターデータベースのバックアップをエクスポートしてスレーブデータベースにインポートし、レプリケーションを開始する前に同じになるようにします。 データダンプを実行できるように、データベースをロックする必要があります。 mysql-1 のMySQLコンソールで、次を実行します。

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

次に、コマンドシェルから次のコマンドを実行して、マスターMySQLサーバー上のデータベースのバックアップを次のファイルにエクスポートします。 masterdump.sql:

mysqldump --lock-all-tables -u root -p --all-databases > masterdump.sql

scpを使用して、masterdump.sqlファイルをスレーブサーバーmysql-2にコピーします。

scp masterdump.sql user @ mysql_2_private_IP :/ tmp

mysql-1のMySQLコンソールをもう一度入力します。

mysql -u root -p

MySQLプロンプトで、データベースのロックを解除します。

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

次に、次のステートメントを実行して、MySQLスレーブを構成するために必要な情報を出力します。

マスターステータスを表示します。
 出力:±-----------------±---------±-------------±----- ------------ + | ファイル| 位置|  Binlog_Do_DB |  Binlog_Ignore_DB |  ±-----------------±---------±-------------±------- ---------- + |  mysql-bin.000001 |  408 |  |  |  ±-----------------±---------±-------------±------- ---------- +セット内の1行(0.00秒)

FilePositionの値は、スレーブサーバーを構成するときに必要になるため、メモしておいてください。 それでは、mysql-2に切り替えましょう。

MySQLスレーブを構成する

次に、マスターデータベースをスレーブにインポートして、レプリケーションの準備としてそれらを同期します。

mysql-2 で、このコマンドを実行して、 masterdump.sql ファイル:

mysql -u root -p < /tmp/masterdump.sql

次に、mysql-2をレプリケーションスレーブとして設定します。 mysql-2 で、MySQL構成ファイルを編集します。

sudo vi /etc/mysql/my.cnf

次の2行を検索します。

 bind-address = 127.0.0.1#server-id = 1 
  • bind-address :MySQLがリッスンするIPアドレス。 mysql-2のプライベートIPアドレスに設定
  • server-id :一意のサーバーID。 これはマスターサーバーであるため、この値を次のように変更します。 2 この行のコメントを解除します

2行は次のようになります(強調表示されたものをデータベースサーバーのプライベートIPアドレスに置き換えてください)。

bind-address = mysql_2_private_IP server-id = 2

保存して終了します。 MySQLを再起動して、変更を有効にします。

sudo service mysql restart

MySQLコンソールに入ります:

mysql -u root -p

次に、スレーブをマスターに接続します。 次の5つの値が必要です。

  • MASTER_HOST :mysql-1のプライベートIPに設定
  • MASTER_USER :マスターで作成したレプリケーションユーザーreplに設定します
  • MASTER_PASSWORD replのパスワードに設定します。これは自分のパスワードに置き換える必要があります
  • MASTER_LOG_FILE :実行時にリストされた「ファイル」に設定 SHOW MASTER STATUS; マスターMySQLサーバー上
  • MASTER_LOG_POS :実行時にリストされた「位置」に設定 SHOW MASTER STATUS; マスターMySQLサーバー上

次のステートメントは、スレーブをマスターサーバーに接続し、強調表示されたすべてのフィールドを適切な値に置き換える必要があります。

MASTERをMASTER_HOST=' mysql_1_private_IP '、MASTER_USER ='repl'、MASTER_PASSWORD =' repl_password '、MASTER_LOG_FILE =' mysql-bin.000001 '、MASTER_LOG_POS= 408に変更します。

そのステートメントが正しく実行された場合は、次のコマンドを実行してスレーブ接続を開始します。

START SLAVE;

これで、mysql-2サーバーがスレーブとして接続されます。 次のコマンドを実行して、レプリケーションが機能していることを確認します。

SHOW SLAVE STATUS\G

スレーブユーザーからの書き込み権限を取り消す

HyperDBプラグインはスレーブデータベースサーバーからのみ読み取るように構成できるため、これはオプションですが、スレーブデータベースの wordpressuser データベースユーザーからの書き込み権限を取り消すことができます(スレーブへの更新は行われないため)誤ってスレーブを更新した場合は、マスターに複製されます)。

mysql-2 で、MySQLコンソールから次のステートメントを実行してデータベースユーザーを一覧表示します。

 SELECT user、host FROM mysql.user;
 出力:±-----------------±--------------- + | ユーザー| ホスト|  ±-----------------±---------------+|  repl |  %|  |  wordpressuser |  wordpress_1_IP |  |  wordpressuser |  wordpress_2_IP |  …

上記のコードブロックと同様の出力が表示されるはずです。 次のコマンドを使用して、各ユーザーの特権を表示できます。

wordpressuser @ wordpress_1_IPの助成金を表示;

この例では、WordPressサーバーごとに1つの wordpressuser があるため、 insert update 、およびdelete特権をそれぞれ(「wordpress」はこの例ではデータベースの名前です):

 INSERT、UPDATE、 DELETEONwordpressを取り消します。*FROM'wordpressuser'@'wordpress_1_private_IP ' ;  INSERT、UPDATE、 DELETEONwordpressを取り消します。*FROM'wordpressuser'@'wordpress_2_private_IP ' ; フラッシュ特権;

これで、MySQLレプリケーションのセットアップが完了しました。 両方のデータベースサーバーを適切に使用するためのWordPressの設定に移りましょう。

HyperDBのインストールと構成

HyperDBを使用して、更新の送信先(マスターデータベース)と読み取り要求(マスターとスレーブ)を決定します。 WordPressプラグインディレクトリからホームディレクトリにダウンロードしましょう(zip / unzipをインストールしてアーカイブを解除します)。

cd ~; wget http://downloads.wordpress.org/plugin/hyperdb.zip
sudo apt-get install zip
unzip hyperdb.zip

ホームディレクトリの「hyperdb」というディレクトリにアーカイブ解除する必要があります。 サンプル構成ファイルをWordPressインストールにコピーし(強調表示されているものをWordPressインストールパスに置き換えます)、編集のために開きます。

cp〜/ hyperdb / db-config.php /var/www/example.com / vi /var/www/example.com /db-config.php

の2番目の出現を探します DB_HOST、これは、スレーブの設定を説明するいくつかのコメントの直後にある必要があり、次のようになります。

$ wpdb-> add_database(array('host' => DB_HOST 、//ポートが3306以外の場合は、host:portを使用します。 'user' => DB_USER、'password' => DB_PASSWORD、'name' => DB_NAME、'write' => 0、'read' => 1、'dataset' =>'global'、'timeout' => 0.2 、));

DB_HOSTの最初のオカレンスはマスターデータベースサーバーを定義し、2番目のオカレンスはスレーブデータベースサーバーを定義します( 'write' => 0,). 2番目のオカレンスを置き換えます DB_HOSTDB_SLAVE_1:

'host' => DB_SLAVE_1 、//ポートが3306以外の場合は、host:portを使用します。 

保存して終了。 次に、定義する必要があります DB_SLAVE_1 HyperDBがスレーブデータベースホストとして使用するwp-config.php内。 編集のためにwp-config.phpを開きます。

vi /var/www/example.com /wp-config.php

を定義する行を見つけます DB_HOST その下に次の行を追加して、スレーブのプライベートIPアドレス( mysql-2 )に置き換えます。

define('DB_SLAVE_1'、' mysql_2_private_IP ');

次に、保存して終了します。

をコピーしてHyperDBのインストールを完了します db.php ファイルに wp-content WordPressインストールのディレクトリを作成し、そのディレクトリへの書き込みアクセスを無効にします。

cp〜/ hyperdb / db.php /var/www/example.com / wp-content / sudo chmod aw /var/www/example.com /wp-content/db.php

次に、WordPressファイルの所有権を適切な値に更新します(このチュートリアルでは、 www-data ユーザー/グループの所有権の場合):

sudo chown -R www-data:www-data /var/www/example.com /

これで、WordPressの読み取り要求はマスターデータベースとスレーブデータベースの両方で処理され、更新はマスターに送信されます(その後、スレーブに複製されます)。

結論

MySQLレプリケーションとHyperDBのセットアップが完了したので、データベース環境は増加した読み取りトラフィックを処理できるようになります。 より多くの同時ユーザー! データベースのサービス容量をさらに拡張したい場合は、MySQLスレーブをさらに追加できることを忘れないでください。

ミッチェル・アニカス