こんにちは。k.otsukaです。今日はエイプリルフールですね。
早いものでテレワーク生活も1年経過してしまいました。
毎日会社に行ってた日々が懐かしいなと思う今日この頃。毎日満員電車に揺られながら会社に行きたいですね。
さて、Oracle CloudにMySQLのPaaSことMDSが登場してから半年ほど経ちました。
登場してから今日までシングル構成のみ構築できる状態で、障害発生を考えるとなかなかグヌヌ状態でしたが、
なんとついに、HA構成で構築できるようになりました!
今回もいち早く触ってみましたので、使ってみた感想や注意点など含め紹介します。
詳細情報については公式ドキュメントを確認ください。
https://docs.oracle.com/en-us/iaas/mysql-database/doc/business-continuity.html#MYAAS-GUID-2CD8BFB9-30B2-4ED5-BE27-E526DD3F6E0A
MDSの概要や作り方については、過去の記事をご覧ください。
https://cloudii.jp/news/blog/oracle-cloud/mysqlaas/
HA構成の概要
今回リリースされたHA構成について、簡単に紹介します。
- MDSのHAは、グループレプリケーション構成で構築されます。
※DBCSのDataGuardのようなマスタースレーブ構成ではありません。
※共有ディスク型でもありません。 - プライマリDBと、待機用に2つのセカンダリDBの、合計3つのDBで構成されます。
※グループレプリケーション構成ですが、セカンダリDBに接続することはできません。 - HA構成は、現在は新規でMDSを構築するときのみ選択することができます。
※既に運用しているMDSをHA構成に変更することはできません。
※MDSのバックアップから構築することもできません。 - プライマリDBに障害が発生した場合は、自動的にフェイルオーバーされます。フェイルオーバーも同一IPアドレスを使用することができます。
注意事項と制約がまだまだ多い印象を受けるかと思いますが、
噂によると今後期待できる実装があるとかないとか…(既存MDSからHA?シェイプ変更いつでも可能?)
HA構成MDSの構築
それではHA構成のMDSを構築してみます。
今回紹介するHA構成の設定方法以外の設定については先にお知らせしたブログを参考にしてください。
- HA構成のMDSを構築するときは、まず「高可用性」を選択します。
- 次に、最下部にある拡張オプション→「Configuration」タブから「構成」を選択します。
- HA用の構成を選択します。
今回は、デフォルトで用意されている「MySQL.VM.Standard.E3.1.8GB.HA」を選択しました。
- 作成ボタンを押すと、約15分程度で構築が完了します。
詳細画面を見てみると、高可用性が「有効」と表示されていたり、DBシステム構成に「3台分」の情報が表示されていたりと、HA構成のMDSが構築できていることが確認できます。
下記クエリを実行すると、MySQLClientからもHA構成で構築されていることが確認できます。
SELECT * FROM performance_schema.replication_group_members;
ちなみに、シングル構成の場合は下記のような表示がされます。
検証してみた
準備
「プライマリDBを切り替えることができるのか」「切り替えた先のDBでも、同じテーブルを参照することができるのか」等を確認するために、下記のような簡単な環境を作ってみました。
この環境はセキュリティ・リスト及びネットワーク・セキュリティ・グループのイングレス・エグレスルールをALL-PASSで構成し、Linux内のファイアウォールも無効化してます。
さらに、MDSにMySQLClientで接続しデータベースとテーブルを作成し
簡易アプリケーションとしてDB接続できるようなサンプルコードも用意してみました。
- DB環境設計
### データベース作成
create database hadb;
###テーブル作成
create table test_table (id int primary key, name varchar(20));
- サンプルコード
<?php
// 変数設定
$db_host='MDSのIPアドレス';
$db_user='MDSへの接続ユーザ';
$db_pass='パスワード';
$db_name='データベース名';
// 接続設定
$link = mysqli_connect($db_host,$db_user,$db_pass,$db_name);
// 接続状況をチェック
if (mysqli_connect_errno()) {
die("データベースに接続できません:".mysqli_connect_error()."\n");
} else {
echo "データベースの接続に成功しました。\n";
}
// SELECT文指定
$query = 'select * from test_table';
// SELECT文実行
$result = mysqli_query($link,$query);
// 取得した内容を表示
while ($row = mysqli_fetch_assoc($result)){
printf("'%s'@'%s'\n",$row['id'],$row['name']);
}
// クローズ
mysqli_close($link);
スイッチオーバー検証
準備ができたので、MDSのスイッチオーバーを実施してみます。
現在は、AD-1のMDSがプライマリの状態です。
MDS詳細画面の「他のアクション」→「スイッチオーバー」を選択します。
MySQLClientから確認したように「AD-1」が現在のプライマリDBに設定されているので、「AD-3」のデータベースにスイッチオーバーしてみます。
スイッチオーバー中はステータスは「更新中」と表示されました。「更新中」の状態でMySQLClientから確認してみると、既にスイッチオーバーは完了していました。しっかり計測したわけではないですが、30秒程度でスイッチオーバーは実施されるようです。
「スイッチオーバー」ボタンを押してから5分程度で「更新中」から「アクティブ」に切り替わりました。画面上からもスイッチオーバーが完了していることが確認できました。
レプリケーション検証
スイッチオーバーは確認できたので、テーブルの内容がレプリケーションされているのか確認してみます。
サンプルコードを実行してみると、「同一IPアドレス」と「同一ID/PW」で接続可能で、同じデータが出力されたことを確認できました。
補足検証
スイッチオーバー中にSQLを実行してみた
データベースni書込み続けている最中に、スイッチオーバーするとどうなるかを確認してみます。書き込んだ時間がわかるようにテーブルを更新し
毎秒データをインサートするような繰り返し文をサンプルコードに追加しました。
// テーブル構成
create table test_table (id int primary key, name varchar(20)),date varchar(20);
// 繰り返しINSERT
for ($i = 1; $i <= 300; $i++) {
$date = date("H:i:s");
sleep(1);
$insert_query = "insert into test_table values ('".$i."','test".$i."','".$date."');";
mysqli_query($link,$insert_query);
PHP実行中にスイッチオーバーを実行し、5分程度待ってからデータベースを確認してみます。
300レコード作られる想定でしたが、30レコード分のみ実行されたことが確認できました。スイッチオーバーのタイミングでレコードの作成が中断されたようです。
最後に、スロークエリ実行中にスイッチオーバーした場合どうなるか検証してみました。
上の結果が、スロークエリ実行中にスイッチオーバーをしなかった場合で
下の結果が、スロークエリ実行中にスイッチオーバーを実行した結果です。スロークエリ実行中にスイッチオーバーをすると、SQLの結果が返ってこなくなりました。
※「Ctrl」+「C」を入力しても中断することが出来ませんでした。
今回やってみたエラーの回避については
「トランザクションを整備する」「切り替わりを検知し再接続を実施する」等の仕組みをアプリケーションに組み込むことで回避できると思います。簡易的に作ったサンプルコードでは上手くいかないことがわかりましたね。。
終わりに
可用性の点から考えると、MDSはDBCSのDataGuard構成に比べてしっかりとちゃんと「PaaS」なので、かなり扱いやすい印象を受けました。
DBCSのDataGuard構成は、SSH接続ができてしまう且つユーザ側でメンテナンスが必要なので、MDSと比べると少し厄介に感じてしまいます。
その点MDSはユーザ側のメンテナンスが必要無いのに加え、スイッチオーバーの時間も5分とかなり早く完了するので、素晴らしいと思います!
構築後に「構成」の変更ができないので、今のところそこだけは意識する必要がありそうです。
シェイプと構成を自由に変更できるようになれば、もっと使い勝手の良いサービスになるのではないかと思ってますので、今後に期待したいと思います!!