この記事は、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が必要です。
現在のところ、読み取りレプリカのシェイプも変更不可です。例えば、HeatWave Clusterを有効にしたインスタンス(HeatWaveのセカンダリエンジンを使用したインスタンス)を用意したい場合は、レプリケーションチャネルを手動で設定する必要があります。
アーキテクチャ
ここでは、オープンソースのコンテンツ管理システムとして人気の高いWordPressをOracle Cloud Infrastructureに導入し、読み取りトラフィックを読み取りレプリカに分散させる方法を紹介します。
具体的には、WordPressをコンピュートインスタンスに展開、ネットワークを設定、MySQLインスタンスをOCIに展開するために、OCI Resource Manager Stackを使用します。
以下のような構成のデプロイがワンクリックで可能です。
デプロイ後、新しい読み取りレプリカを簡単に作成する方法を説明します。最終的には以下のようなアーキテクチャが作成できます。
デプロイメント
必要なOCIリソースをデプロイするために、まずは以下のボタンをクリックします。これにより、OCI Resource Manager (Terraform) を使って全てがデプロイされます。
OCIコンソールに接続されている場合は、クリックするとこの画面になります。
Oracleの利用規約を確認し同意すると、Terraformのコードが読み込まれます。
ウィザードに従って必須の変数を入力します。
Shapesセクションで、少なくとも4つのOCPUを持つMySQL シェイプにして下さい。OCI APIはスタック内のMySQL DBインスタンスシェイプを自動的には表示しないので、ここではシェイプの正確な名前を入力して下さい。
訳注:原文では説明されていなかった内容を加筆しています。
MySQL DBインスタンスシェイプの正確な名前を確認するには、まずOCIコンソールのメニューから「データベース」→「MySQL」を選択してMySQLのデータベースシステム作成画面に行きます。

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

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

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

スタック作成画面で「次」をクリックすると、作成後に適用されるスタック情報が確認できます。
Create ボタンを押すとスタック作成が開始され、約15分で完了します。適用タスクが完了したら、実行ページの下部にあるログセクションに、新しく作られたWordPressに接続するための情報が表示されます。
ブラウザからパブリックIPでWordPressにアクセスして、データベース接続のための詳細としてログの最後に表示されたIPアドレスやデータベースのユーザ名、パスワードを入力することでWordPressのインストールを終了させることができます。データベースホストはmds_instance_ipで返されたIP(この例では10.0.1.249)です。
読み取りレプリカ
訳注:2023年2月現在のOCIのコンソールの日本語表示ではRead Replicaは「読み取りレプリカ」と表示されています。以降の説明では本文は「読み取りレプリカ」、英語表示のスクリーンショットでは「Read Replica」となっている点をご了承ください。
読み取りレプリカの利用開始には、作成したデータベースのインスタンスを選択し、左下のリソース(Resources)セクションで読み取りレプリカを選択し、読み取りレプリカの作成をクリックしてください。読み取りレプリカ一つあたりに必要な作成時間は、約15分です。
読み取りレプリカを作成すると、読み取りレプリカ用の新しいエンドポイントと、読み取りレプリカのロードバランサー用のエンドポイントも追加されます。
下の例では、読み取りレプリカをもう一つ作成し、2つのインスタンスで読み取り処理をすることにします。
LudicrousDB
読み取りレプリカによって、読み取り処理と書き込み処理でMySQLクエリを分けるために、ここではWordPressプラグインのひとつであるLudicrousDBを使用します。
以前はHyperDBも使えましたが、最新のWordPress(6.1.1)には対応しておらず、またMySQL 8.0のsql_modeと問題が発生することがあるからです。
LudicrouDBのインストールと設定を行うために、WordPressがインストールされているコンピュートインスタンスにsshで接続してください。
コンピュートインスタンスに接続するためには、Stack適用の際に、生成されたsshの秘密鍵を取得している必要があります。
コンピュートインスタンスに接続するためには、Stack適用の際に、生成されたsshの秘密鍵を取得している必要があります。今回の手順では下記に示すとおり、ジョブ詳細→ジョブリソース(apply stack用)から最後のエントリを確認することで、sshキーを確認することができます。
private_key_openssh をコピーできます。
パソコン上のファイルやクラウドシェルに該当するキーをコピーします。コピーされたテキストの最初と最後の二重引用符(“)を削除し、\nを全て改行に置き換えてください。
パーミッションを600に変更します(自分のユーザーだけが読み取り/書き込み可)。
これでOpenSSHを使って、コンピュートインスタンスのパブリックIPと先ほどコピーしたキーによって、ユーザopcで接続することができるようになります(コマンドラインまたはPuttyから)。
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( /** |
読み取りレプリカロードバランサの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ボタンで戻り画面右のプレビューボタンを押すとホスト名が表示される
ここに表示されているホスト名は、MySQLに表示される読み取りレプリカのインスタンスの実際のホスト名です。
また、Oracle Cloud Infrastructure コンソールのMetricsセクションで、二つの読み取りレプリカの接続を確認することができます。
まとめ
Oracle Cloud Infrastructure (OCI) 上の MySQL HeatWave Dadabase Service で、新しく発表された読み取りレプリカを使用すると、WordPress をとても簡単に作成でき、また多くの利点を享受することができます。具体的には、読み取りレプリカによって、WordPressサイトやMySQLを使用する他のアプリケーションのパフォーマンスと拡張性を向上させることができます。
本記事では、OCI 上の MySQL HeatWave Database Service で読み取りレプリカを使用して、WordPress を展開するのに必要な知識と詳細な手順をご紹介しました。
この新機能は、ワンクリックでオンデマンドにMySQLインスタンスを追加または削除できるため、読み取りトラフィックに応じた柔軟な拡張性を実現します。
