目次
はじめに
みなさん、こんにちは。
Oracle Cloud Infrastructure 検証チームです。
今回は、OCIの入門編チュートリアルにもある クラウドでMySQL Databaseを高可用性構成で使うを実際に検証し、構築してみましたのでご紹介したいと思います。
以前にもチュートリアルにあるクラウドでMySQL Databaseを使うとMySQLで高速分析を体験するを検証した記事も投稿してますので、まだ見ていないという方は先にそちらもご覧ください。
高可用性構成 とは
高可用性構成とは、
ITシステムがサービス停止することなく、継続して稼働することを目指す設計・運用の手法のひとつです。
今回、構築検証する高可用性構成の構成図は以下のようになります。
特徴としては複数のFault DomainにMDSを構築し、
プライマリとして使用しているMDSに障害が起きた場合、セカンダリをプライマリにすることでサービスの継続を続けることが可能です。
高可用性構成には以下のような特徴があります。
- システムを止めることなく継続して稼働することができる。
- 複数台のサーバーで処理を分散させることで、アクセスの増加や高負荷による影響でのサーバーダウンを防ぐことができる。
作成してみた
前提として、今回使用するVCNとインスタンスは、すでに作成してあります。
今回の検証の流れは以下の通りです。
- MDSの作成
MDSとはOracle MySQL Database Serviceの略です。
OCI内にデプロイされた完全に管理されたデータベース・サービスで、セキュアなクラウドネイティブ・アプリケーションを迅速にデプロイしようとするオペレータおよび開発者をサポートします。 - セキュリティリストの修正(イングレス・ルールの追加)
- MySQLクライアント、MySQL Shellのインストール
- 高可用性の確認
MDSの作成
- OCIコンソール画面の左上のメニューを展開し「データベース」>「DBシステム」を選択します。
- 「DBシステムの作成」を選択します。
- 立ち上がった MySQL DBシステムの作成 ウィンドウで以下の項目を入力します。
- デフォルトの設定・・・
今回は検証ですので、「開発またはテスト」を選択します。 - コンパ―トメントに作成・・・
作成するコンパ―トメントを指定します。 - 名前・・・
任意の名前を入力します。ここでは「HeatWave」と入力しています。 - 説明・・・
このMDSの説明を入力します。ここでは「ハンズオン用」と入力しています。(入力は任意です)
- DBシステム・・・
「スタンドアロン」、「高可用性」の2種類から選択できます。
今回のテーマである「高可用性」を選択しています。 - MySQL HeatWaveの構成・・・
チェックはしません。HeatWaveに関しては前回の記事をご参照ください。
- ユーザー名・・・
MySQL Databaseの管理者ユーザーのユーザー名を指定します。ここでは「root」と入力しています。 - パスワード・・・JU
MySQL Databaseの管理者ユーザーのパスワードを指定します。パスワードは8文字から32文字までの長さで、大文字、小文字、数字および特殊文字をそれぞれ1つ以上含める必要があります。 - パスワードの確認・・・
パスワードを再入力します。
- 仮想クラウド・ネットワーク・・・
事前作成済みのVCNを選択します。(画像はTutorialVCN) - サブネット・・・
事前作成済みのVCNを選択します。(画像はTutorialVCN(リージョナル))
- シェイプの選択・・・
「シェイプの変更」をクリックして、より高スペックなシェイプを選択できます。 - データ・ストレージ・サイズ(GB)・・・
ストレージサイズを変更できます。(画像は50GB)
- 自動バックアップの有効化・・・
選択することで、自動バックアップを有効化します。 - バックアップ保持期間・・・
バックアップを格納する長さを指定できます(日単位)。自動バックアップの保存期間を定義した後は、編集することはできません。 - ポイント・イン・タイム・リストアを有効にします・・・
選択することで、特定の時点でDBシステムを新しいDBシステムにリストアできるようにするオプションを有効化します。 - バックアップ・ウィンドウの選択・・・
選択することで、「ウィンドウの開始時間」を指定することができます。選択しない場合は、自動で定義されます。
- 削除保護・・・
DBシステムを削除操作から保護します。DBシステムを削除できるようにするには、このオプションを無効にします。デフォルトでは、DBシステムは削除保護されていません。 - 自動バックアップの保持・・・
DBシステムを削除した後に自動バックアップを保持します。デフォルトでは、DBシステムを削除すると自動バックアップが削除されます。 - 最終バックアップが必要・・・
DBシステムを削除する前に最終バックアップを作成します。デフォルトでは、最終バックアップは作成されません。
- 構成の選択・・・
「構成の選択」をクリックすることで、事前に作成した構成を適用することが出来ます。事前に構成を作成することで、MDSで変更可能なパラメータを変更できます。
- ホスト名・・・
任意の名前を入力します。ここでは「TestHA」と入力しています。 - IPアドレス・・・
プライベートIPアドレスを定義して、DBシステムのエンドポイントに割り当てます。アドレスは、サブネットのCIDRで使用可能である必要があります。
アドレスを指定しない場合は、サブネットからプライベートIPアドレスが自動的に割り当てられます。 - MySQLポート・・・
サーバーがリスニングするポートを指定します。MySQLポートのデフォルト値は「3306」です。 - MySQL Xプロトコル・ポート・・・
MySQLシェルなどのクライアントでサポートされているポートを指定します。ポートのデフォルト値は「33060」です。
- クラッシュ・リカバリの有効化・・・
予期しないサーバー・イグジットが発生した場合にDBシステムをデータ損失から保護します。これを無効にすると、大規模なデータ・インポートのパフォーマンスが向上します。
※無効にした場合、自動バックアップも無効になります。
- メンテナンス・ウィンドウの開始時間・・・
オペレーティング・システムやMySQLインスタンスのアップグレードなどのメンテナンス・アクティビティをスケジュールする日時(UTCタイムゾーン)を指定します。
日時を指定しない場合は、Oracleによって選択されます。
- PARソースURL・・・
事前認証済リクエスト(PAR)を使用してオブジェクト・ストレージ・バケット内のMySQLシェル・ダンプからデータをインポートします。
- タグネームスペース・・・
タグ名を選択します。 - タグ・キー・・・
タグ・キーを選択します。 - タグ値・・・
タグの値を指定します。
- デフォルトの設定・・・
- MDSが作成中になるのでしばらく待ちます。(概ね15分)
MDSの作成が完了するとアイコンが緑色に変化し、作成中からアクティブへ変化します。
- ページ左下の リソース → エンドポイント をクリックして、ホスト名、IPアドレスを確認しておきます。
これでMDSの作成は完了です!
セキュリティリストの修正(イングレス・ルールの追加)
次は作成したMDSと通信するために、VCNのセキュリティリストにイングレス・ルールを追加していきます!
こちらの内容は前回の記事
OCIでMySQL Database Service(MDS)を作成してみました。
で詳細に説明しておりますので、そちらを参照ください。
今回は流れだけの記載とさせていただきます。
- OCIコンソール画面の左上のメニューを展開し「ネットワーキング」>「仮想クラウドネットワーク」を選択し、作成済みのVCNを選択します。
※今回はすでに「TutorialVCN」というVCNを作成しております。以降はVCNが「TutorialVCN」である前提で説明を記述していきます。
- プライベート・サブネット-TutorialVCNをクリックします。
- プライベート・サブネット-TutorialVCNのセキュリティ・リスト をクリックします。
- イングレス・ルールの追加 をクリックします。
- 先ほど指定したポートに対するイングレス・ルールが追加されたことを確認します。
これでMDSと通信する準備が整いました!
MySQLクライアント、MySQL Shellのインストール
次は作成したMDSに接続するために、コンピュート・インスタンスにMySQLクライアントをインストールしていきます!
- 事前に作成したコンピュート・インスタンスに接続し、以下のコマンドを実行します。
これにより、MySQLチームが提供しているyumの公式リポジトリがセットアップされます。
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm #実行結果 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (中略) Installed: mysql80-community-release-el8-4.noarch Complete!
- 以下のコマンドを実行し、デフォルトの MySQL モジュールの無効化を行ないます。
sudo yum module disable mysql #実行結果 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (中略) Is this ok [y/N]: y Complete!
- 以下のコマンドを実行し、MySQLクライアントをインストールします。
sudo yum install mysql-community-client #実行結果 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (中略) Installed: mysql-community-client-8.0.34-1.el8.x86_64 mysql-community-client-plugins-8.0.34-1.el8.x86_64 mysql-community-common-8.0.34-1.el8.x86_64 mysql-community-libs-8.0.34-1.el8.x86_64 Complete!
- 以下のコマンドを実行し、MySQL Shellをインストールします。
sudo yum install mysql-shell #実行結果 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (中略) Installed: mysql-shell-8.0.34-1.el8.x86_64 python39-3.9.16-1.module+el8.8.0+21116+ee8c18cf.1.x86_64 python39-libs-3.9.16-1.module+el8.8.0+21116+ee8c18cf.1.x86_64 python39-pip-20.2.4-7.module+el8.6.0+20625+ee813db2.noarch python39-pip-wheel-20.2.4-7.module+el8.6.0+20625+ee813db2.noarch python39-setuptools-50.3.2-4.module+el8.5.0+20364+c7fe1181.noarch python39-setuptools-wheel-50.3.2-4.module+el8.5.0+20364+c7fe1181.noarch Complete!
これでMySQLクライアントとMySQL Shellのインストールは完了です!
しっかりとインストールされているか確認してみましょう。
rpm -qa | grep -i mysql
#実行結果
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mysql-community-libs-8.0.34-1.el8.x86_64
mysql-shell-8.0.34-1.el8.x86_64
mysql80-community-release-el8-4.noarch
mysql-community-client-plugins-8.0.34-1.el8.x86_64
mysql-community-client-8.0.34-1.el8.x86_64
mysql-release-el8-1.0-3.el8.x86_64
mysql-community-common-8.0.34-1.el8.x86_64
「mysql-community-client」「mysql-shell」が問題なくインストールされていますね!
これでMDSに接続する準備が整いました!
高可用性の確認
無事、MDSの作成、HeatWaveノードの追加、VCNのセキュリティ・リストへイングレスルールの追加、インスタンスへMySQLクライアントのインストールが完了しました!
続いて、作成したMDSの状態を確認し、グループ・レプリケーションが構成されていることを確認します。
その後、データを更新しながらスイッチオーバーを発生させることで、短時間でプライマリサーバーが切り替わることを確認します。
- mysqlコマンドラインクライアントを使ってMDSへ接続します。
mysql -u root -p -h TestHA.sub09290718271.tutorialvcn.oraclevcn.com #ホスト名の部分は各自のホスト名に変更 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 53 Server version: 8.0.34-u3-cloud MySQL Enterprise - Cloud Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
- performance_schema.replication_group_membersテーブルをSELECTしてグループ・レプリケーションが構成されていることを確認します。
3台のMDSでグループ・レプリケーションが構成されているため、結果は3行出力されます。
その中で、MEMBER_ROLE列がPRIMARYになっているメンバーが、今プライマリになっているMDSです。
この後の確認のために、プライマリのMDSのMEMBER_HOSTをメモしておきます。(この例では’kwskfpqjdxtut8de’)mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE -> FROM performance_schema.replication_group_members; +--------------------------------------+------------------+--------------+-------------+ | MEMBER_ID | MEMBER_HOST | MEMBER_STATE | MEMBER_ROLE | +--------------------------------------+------------------+--------------+-------------+ | 81ff4bb6-5e9c-11ee-9004-02001703059c | kwskfpqjdxtut8de | ONLINE | PRIMARY | | e8d21e85-5e9c-11ee-a1f2-020017043708 | yff3kpj1lioyw5rn | ONLINE | SECONDARY | | f150c846-5e9c-11ee-aade-020017047a69 | wzkwrzkomirecghp | ONLINE | SECONDARY | +--------------------------------------+------------------+--------------+-------------+ 3 rows in set (0.00 sec)
- スイッチオーバー時の動作を確認するためのテストテーブルを作成します。
そのテーブルに、現在プライマリであるMEMBER_HOSTの情報と現在の時刻をINSERTし、INSERTしたデータをSELECTして確認します。mysql> CREATE DATABASE test; Query OK, 1 row affected (0.01 sec) mysql> CREATE TABLE test.test( -> id int AUTO_INCREMENT, -> PRI_MEMBER_HOST CHAR(20), -> INSERT_TIME time, -> PRIMARY KEY(id) -> ); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO test.test(PRI_MEMBER_HOST, INSERT_TIME) -> SELECT MEMBER_HOST, CURTIME() -> FROM performance_schema.replication_group_members -> WHERE MEMBER_ROLE='PRIMARY'; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM test.test; +----+------------------+-------------+ | id | PRI_MEMBER_HOST | INSERT_TIME | +----+------------------+-------------+ | 1 | kwskfpqjdxtut8de | 08:15:24 | +----+------------------+-------------+ 1 row in set (0.00 sec) mysql> exit Bye
- 以下のシェルスクリプトをtest.shという名前で作成し、test.shを実行します。
このスクリプトでは、1秒毎にテストテーブルにデータをINSERTする処理を無限ループで実行します。ユーザー名とパスワードはMDSの管理者ユーザー名/パスワードに、ホスト名は確認したホスト名に置き換えて下さい。なお、スクリプト実行時にパスワードをコマンドラインで指定していることに対する警告が発生しますが、ここでは無視して大丈夫です。(“-p”オプションでパスワードを指定しています。この例では、”Passw0rd!”というパスワードを指定しています)#!/bin/bash while true; do mysql -u root -pPassw0rd! -h TestHA.sub09290718271.tutorialvcn.oraclevcn.com -e "INSERT INTO test.test(PRI_MEMBER_HOST, INSERT_TIME) SELECT MEMBER_HOST, CURTIME() FROM performance_schema.replication_group_members WHERE MEMBER_ROLE='PRIMARY';" sleep 1 done
chmod 744 ./test.sh ./test.sh #実行結果 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. (以下略)
- コンソールからスイッチオーバーを発生させます。
他のアクション → スイッチオーバー をクリックし、その後表示されたウインドウで現在セカンダリになっているFD(もしくはAD)を選択し、スイッチオーバー をクリックします
- 表示されたウインドウで現在セカンダリになっているFD(もしくはAD)を選択し、スイッチオーバー をクリックします。
- スイッチオーバーを実行すると、コンソール上でステータスが数分間「更新中」になり、その後ステータスが「アクティブ」に戻ります。
ステータスがアクティブに戻った時には、「優先フォルト・ドメイン」(もしくは「優先可能性ドメイン」)部分が新しいプライマリに応じて更新されています。
- 「Ctrl+C」を押し、シェルスクリプトtest.shを停止します。その後、MDSに接続します。
mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. ^C mysql -u root -p -h TestHA.sub09290718271.tutorialvcn.oraclevcn.com #ホスト名の部分は各自のホスト名に変更 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 302 Server version: 8.0.34-u3-cloud MySQL Enterprise - Cloud Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
- 以下のSQLを実行し、スイッチオーバー時にMDSが使用できなかった時間を確認します。
”PRI_MEMBER_HOST=’kwskfpqjdxtut8de’“部分は、事前にメモした旧プライマリのMDSのMEMBER_HOSTの値に置き換えて実行して下さい。mysql> SELECT * -> FROM test.test -> WHERE id IN ( -> (SELECT MAX(id) FROM test.test WHERE PRI_MEMBER_HOST='kwskfpqjdxtut8de'), -> (SELECT MAX(id) FROM test.test WHERE PRI_MEMBER_HOST='kwskfpqjdxtut8de')+1 -> ) -> ORDER BY 1 ASC; +----+------------------+-------------+ | id | PRI_MEMBER_HOST | INSERT_TIME | +----+------------------+-------------+ | 89 | kwskfpqjdxtut8de | 08:23:22 | | 90 | yff3kpj1lioyw5rn | 08:23:26 | +----+------------------+-------------+ 2 rows in set (0.00 sec)
この例の場合INSERT_TIMEの差分が4秒であるため、スイッチオーバー時にMDSが使用できなかった時間は約3秒であることが分かります。
障害発生時に発生するフェイルオーバーの方が、通常状態でプライマリサーバーを切り替えるスイッチオーバーよりも所要時間が長くなる可能性がありますが、
プライマリサーバーの切り替え自体はこのように短時間で実現可能です。
これにてMySQLの高可用性構成検証作業は終了です!
お疲れ様でした!
おわりに
今回は、OCIの入門編チュートリアルにある、クラウドでMySQL Databaseを高可用性構成で使う を実際に検証し、作成してみました。
いかかでしたでしょうか。
今回の検証ではスイッチオーバ―時のMDSが使用できなかった時間が約3秒ほどとなりました。
これをご覧の皆さまも是非検証して高可用性を実感いただきたいです!
最後までご覧いただきありがとうございました!
Oracle Cloudをご検討の際は当社までお気軽にお問い合わせください。