この記事は、Deploy WordPress on OCI with MySQL Database Service using Read Replicas の翻訳版です。

 

MySQL HeatWave Database Serviceの読み取りレプリカ(Read Replica)がリリース。

読み取りレプリカは、同じOCIリージョンに作成可能なMySQL DBシステムの読み取り専用のコピーです。読み取りレプリカを追加すると、読み取り処理が自動的に可用性ティドメイン(AD)やフォルトドメイン(FD)に分散されます。

各MySQL DBインスタンスは最大18個の読み取りレプリカを持つことができます。

読み取りレプリカは、MySQL非同期レプリケーションとパラレルワーカーを使用します。また、最初の読み取りレプリカを作成する際に、読み取りレプリカのロードバランサが作成され、読み取りレプリカ間で読み取りトラフィックを分散させます。

すべてのシェイプが読み取りレプリカと互換性があるわけではなく、読み取りレプリカを作るには最低4つのOCPUが必要です。
 

Read Replicas Prerequisites

現在のところ、読み取りレプリカのシェイプも変更不可です。例えば、HeatWave Clusterを有効にしたインスタンス(HeatWaveのセカンダリエンジンを使用したインスタンス)を用意したい場合は、レプリケーションチャネルを手動で設定する必要があります。

 

アーキテクチャ

ここでは、オープンソースのコンテンツ管理システムとして人気の高いWordPressをOracle Cloud Infrastructureに導入し、読み取りトラフィックを読み取りレプリカに分散させる方法を紹介します。
具体的には、WordPressをコンピュートインスタンスに展開、ネットワークを設定、MySQLインスタンスをOCIに展開するために、OCI Resource Manager Stackを使用します。

以下のような構成のデプロイがワンクリックで可能です。
 

Resource Manager Stack - Architecture

 

デプロイ後、新しい読み取りレプリカを簡単に作成する方法を説明します。最終的には以下のようなアーキテクチャが作成できます。

Final Architecture with Read Replicas and Read Replicas Load Balancer

 

デプロイメント

必要なOCIリソースをデプロイするために、まずは以下のボタンをクリックします。これにより、OCI Resource Manager (Terraform) を使って全てがデプロイされます。

Deploy to Oracle Cloud

OCIコンソールに接続されている場合は、クリックするとこの画面になります。

Create Stack - Acceptance of Oracle Terms of Use
Resource Manager Stack Creation (スタック作成画面)

 

Oracleの利用規約を確認し同意すると、Terraformのコードが読み込まれます。

Create Stack - Information
Stack Information: OCIのMySQL HeatWave Dadabase Serviceを利用した WordPress

 

ウィザードに従って必須の変数を入力します。

Create Stack - Required Variables
Stack Creation : 入力必須の変数

 

Shapesセクションで、少なくとも4つのOCPUを持つMySQL シェイプにして下さい。OCI APIはスタック内のMySQL DBインスタンスシェイプを自動的には表示しないので、ここではシェイプの正確な名前を入力して下さい。

Create Stack - Shape Selection
Shapes セクション

 

訳注:原文では説明されていなかった内容を加筆しています。
MySQL DBインスタンスシェイプの正確な名前を確認するには、まずOCIコンソールのメニューから「データベース」→「MySQL」を選択してMySQLのデータベースシステム作成画面に行きます。

OCIコンソール画面

 

MySQLのデータベースシステム作成画面で中央までスクロールすると「DBシステムの作成」ボタンがあるので、これを押下します。今回はシェイプの名前を確認するだけなので、コンパートメントなどはどこでも構いません。

DBシステムの作成画面

 

画面が変わったら下の方までスクロールして、「シェイプの変更」を選択します。

シェイプの変更

 

MySQL DBインスタンスとして有効なシェイプが全て参照できます。この手順では「MySQL.VM.Standard.E4.4.64GB」を使用します。
この画面からはDBインスタンスを作成しないので「取り消し」を繰り返し押してDBインスタンスの作成を終了し、スタック作成画面に戻って確認したMySQLのシェイプを記入します。

MySQL DBシステムシェイプ一覧
 

 

スタック作成画面で「次」をクリックすると、作成後に適用されるスタック情報が確認できます。

Create Stack - Stack Details
スタックの作成

 

Create ボタンを押すとスタック作成が開始され、約15分で完了します。適用タスクが完了したら、実行ページの下部にあるログセクションに、新しく作られたWordPressに接続するための情報が表示されます。

Stack Apply Job Logs
スタック適用ログ

 

ブラウザからパブリックIPでWordPressにアクセスして、データベース接続のための詳細としてログの最後に表示されたIPアドレスやデータベースのユーザ名、パスワードを入力することでWordPressのインストールを終了させることができます。データベースホストはmds_instance_ipで返されたIP(この例では10.0.1.249)です。

WordPress - Home Page
WordPress の表示例

 

読み取りレプリカ

訳注:2023年2月現在のOCIのコンソールの日本語表示ではRead Replicaは「読み取りレプリカ」と表示されています。以降の説明では本文は「読み取りレプリカ」、英語表示のスクリーンショットでは「Read Replica」となっている点をご了承ください。

読み取りレプリカの利用開始には、作成したデータベースのインスタンスを選択し、左下のリソース(Resources)セクションで読み取りレプリカを選択し、読み取りレプリカの作成をクリックしてください。読み取りレプリカ一つあたりに必要な作成時間は、約15分です。

Create read replica
読み取りレプリカ作成

 

読み取りレプリカを作成すると、読み取りレプリカ用の新しいエンドポイントと、読み取りレプリカのロードバランサー用のエンドポイントも追加されます。

Endpoints
エンドポイント

 

下の例では、読み取りレプリカをもう一つ作成し、2つのインスタンスで読み取り処理をすることにします。

Endpoints
2つの読み取りレプリカ

 

LudicrousDB

読み取りレプリカによって、読み取り処理と書き込み処理でMySQLクエリを分けるために、ここではWordPressプラグインのひとつであるLudicrousDBを使用します。

以前はHyperDBも使えましたが、最新のWordPress(6.1.1)には対応しておらず、またMySQL 8.0のsql_modeと問題が発生することがあるからです。

LudicrouDBのインストールと設定を行うために、WordPressがインストールされているコンピュートインスタンスにsshで接続してください。
コンピュートインスタンスに接続するためには、Stack適用の際に、生成されたsshの秘密鍵を取得している必要があります。
 

Cloud Shell Stack Jobs Output
OCI リソースマネジャージョブアウトプット

 

コンピュートインスタンスに接続するためには、Stack適用の際に、生成されたsshの秘密鍵を取得している必要があります。今回の手順では下記に示すとおり、ジョブ詳細→ジョブリソース(apply stack用)から最後のエントリを確認することで、sshキーを確認することができます。

Stack Job Details
ジョブ詳細 -ジョブリソース
Job Resources - tls keys
ジョブリソース -TLSキー

 

private_key_openssh をコピーできます。

private key for openssh

 

パソコン上のファイルやクラウドシェルに該当するキーをコピーします。コピーされたテキストの最初と最後の二重引用符(“)を削除し、\nを全て改行に置き換えてください。

パーミッションを600に変更します(自分のユーザーだけが読み取り/書き込み可)。

これでOpenSSHを使って、コンピュートインスタンスのパブリックIPと先ほどコピーしたキーによって、ユーザopcで接続することができるようになります(コマンドラインまたはPuttyから)。
 

ssh connection to the compute instance
コンピュートインスタンスにsshで接続

 

LudicrousDBプラグインをWordPressにインストールします。


[opc@wordpressserver1 ~]$ cd /var/www/html/wp-content/plugins
[opc@wordpressserver1 ~]$ sudo wget https://github.com/stuttter/ludicrousdb/archive/refs/heads/master.zip
[opc@wordpressserver1 plugins]$ sudo unzip master.zip
[opc@wordpressserver1 plugins]$ sudo mv ludicrousdb-master ludicrousdb
[opc@wordpressserver1 plugins]$ sudo rm master.zip
[opc@wordpressserver1 plugins]$ sudo chown -R apache. ludicrousdb
[opc@wordpressserver1 plugins]$ sudo cp ludicrousdb/ludicrousdb/drop-ins/db.php ../db.php
[opc@wordpressserver1 plugins]$ sudo cp ludicrousdb/ludicrousdb/drop-ins/db-config.php ../../


LudicrousDBが読み取りレプリカのロードバランサを使えるように設定します。


[opc@wordpressserver1 ~]$ cd /var/www/html/
[opc@wordpressserver1 html]$ sudo vim db-config.php 


そしてdb-config.phpファイルを修正します。


$wpdb->add_database( array(
	'host'     => DB_HOST,     // ポート番号が3306以外の場合、ホストアドレス:ポート番号と追記
	'user'     => DB_USER,
	'password' => DB_PASSWORD,
	'name'     => DB_NAME,
	'write'    => 1,
	'read'     => 0,
) );

/**
 * This adds the same server again, only this time it is configured as a slave.
 * The last three parameters are set to the defaults but are shown for clarity.
 */
$wpdb->add_database( array(
	'host'     => "10.0.1.152",     // ポート番号が3306以外の場合、ホストアドレス:ポート番号と追記
	'user'     => DB_USER,
	'password' => DB_PASSWORD,
	'name'     => DB_NAME,
	'write'    => 0,
	'read'     => 1,
	'dataset'  => 'global',
	'timeout'  => 0.2,
) );

 

訳注:下記に赤字で示した部分を修正して下さい。

 

$wpdb->add_database( array(
  ‘host’     => DB_HOST,     // ポート番号が3306以外の場合、ホストアドレス:ポート番号と追記
  ‘user’     => DB_USER,
  ‘password’ => DB_PASSWORD,
  ‘name’     => DB_NAME,
  ‘write’    => 1,
  ‘read’     => 0,

) );

/**
 * This adds the same server again, only this time it is configured as a slave.
 * The last three parameters are set to the defaults but are shown for clarity.
 */
$wpdb->add_database( array(
  ‘host’     => “10.0.1.152“,     // ポート番号が3306以外の場合、ホストアドレス:ポート番号と追記
  ‘user’     => DB_USER,
  ‘password’ => DB_PASSWORD,
  ‘name’     => DB_NAME,
  ‘write’    => 0,
  ‘read’     => 1,
  ‘dataset’  => ‘global’,
  ‘timeout’  => 0.2,
) );
 

 


読み取りレプリカロードバランサのIP(10.0.1.152)を追加して完了です。

 

訳注:原文では説明されていなかった内容を加筆しています。
接続先の読み取りDBがアクセスごとに切り替わっていることを確認するために、接続先のホスト名を表示させる方法は下記のとおりです。

1. WordPressのコンソールで Insert PHP Code Snippets をインストールしアクティベート
    左側のメニューで新規追加→プラグインの検索で『Insert PHP Code Snippets』を検索してインストール後、有効化してください
  (この際、類似名称のプラグインもありますので注意が必要です)
2. コンソール左の XYZ PHP Code から Add New PHP Code Snippetで↓このコードを追加(原文のコードとは一部異なります) 

<?php
$result = $wpdb->get_results("select @@hostname as host");
echo "<strong>host:</strong> " . $result[0]->host;
?>

3. Backボタンで戻り画面右のプレビューボタンを押すとホスト名が表示される

Read Replica Host
Read Replica Host

 

ここに表示されているホスト名は、MySQLに表示される読み取りレプリカのインスタンスの実際のホスト名です。

Read Replica Hosts in MySQL
レプリカのMySQL DBインスタンスでホスト名の確認

 

また、Oracle Cloud Infrastructure コンソールのMetricsセクションで、二つの読み取りレプリカの接続を確認することができます。

Metrics - Current Connections
Metrics - Current Connections

 

まとめ

Oracle Cloud Infrastructure (OCI) 上の MySQL HeatWave Dadabase Service で、新しく発表された読み取りレプリカを使用すると、WordPress をとても簡単に作成でき、また多くの利点を享受することができます。具体的には、読み取りレプリカによって、WordPressサイトやMySQLを使用する他のアプリケーションのパフォーマンスと拡張性を向上させることができます。

本記事では、OCI 上の MySQL HeatWave Database Service で読み取りレプリカを使用して、WordPress を展開するのに必要な知識と詳細な手順をご紹介しました。

この新機能は、ワンクリックでオンデマンドにMySQLインスタンスを追加または削除できるため、読み取りトラフィックに応じた柔軟な拡張性を実現します。