[Oracle Cloud] MySQL Database Service でモニタリング監視をしてみた

# はじめに

[前回の記事](https://qiita.com/sugimount/items/cbe9a15c169fe597894e)で、MySQL Database Service の Getting Started をやってみました。今回の記事では、Oracle Cloud Infrastructure(以下OCI) に標準的に備わっている Monitoring で、基本的なモニタリング監視を行う手順を紹介します。



次の2種類の方法を紹介します

- CPU 使用率が 80% を超えたことを検知して、メール送信

- 死活監視してメール送信 (厳密には異なる)


死活監視の部分は、「CPU 使用率のメトリックが無い状態」を検知してアラートを行います。「CPU使用率のメトリックが無い状態」は、MySQL インスタンス側で通常では考えにくい何らかの障害が発生していると考えられます。
厳密に、MySQL Server として稼働していることを確認したい場合は、実際に MySQL Client で 3306 Port に対して接続して Select クエリーを実行するといった、別の方法で死活監視するのがよいでしょう。



# MySQL Database Service Metrics

MySQL Database Service で取得可能なメトリクスは、次の Document で一覧化されています。

https://docs.cloud.oracle.com/en-us/iaas/mysql-database/doc/mysql-database-metrics.html

- CurrentConnections : Total Connection 数
- ActiveConnections : Active Connection 数
- Statements : Statement の実行された回数
- StatementLatency : 実行された全 Statement のレイテンシー
- CPUUtilization : CPU使用率
- MemoryUtilization : メモリ使用率
- DbVolumeReadOperations : DB Volume に対する、読み込みオペレーションの回数
- DbVolumeWriteOperations : DB Volume に対する、書き込みオペレーションの回数



色々便利そうなメトリクスがありますね。特に便利そうなのが、`StatementLatency` です。本番稼働中の標準的な `StatementLatency` がわかれば、そこから閾値を計算して、レイテンシーがあまりにも遅すぎる状態のアラートが出来そうですね。



Metric を実際に見てみましょう。MySQL Database Service から、対象のインスタンスを選択します。

![1601094955757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/751310f9-7662-da82-37b0-e79c88daec4f.png)



インスタンスの詳細画面で、Metric が見えます

![1601095038945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/09472393-f4f0-4f9d-131c-5b7567f773f0.png)



# メール送付設定

Notifications という名前のサービスで、メールの宛先を設定します。

![1601095551027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/2a86f041-27e3-e654-c89d-3744a6ee782d.png)



Create Topic

![1601095589569.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a4e5b88c-7a61-17de-cfe4-7a3a255ef087.png)



適当に名前を入れて、Create を押します。

![1601095615712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/2dd7d3f2-098d-9790-49dd-110eb9be5bbe.png)



名前を選択します

![1601095657330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/40a09b4f-7b7c-4d40-de38-c36215a57fdd.png)



Create Subscription

![1601095691677.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/4f67c911-ebf2-4c59-4cdd-853ec43dd2ef.png)



メール通知したいメールアドレスを指定して、Create を押します

![1601095732525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/f2e0e2b5-d1c5-304f-8d0b-ce28898e1e60.png)





Pending となります。

![1601095762126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/f735f3f9-00ed-d330-1c31-f426dbcb2b31.png)



設定したメールアドレスに確認メールが送付されます。Confirm をクリックすると確認完了です。

![1601095870698.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/39000061-4e00-a015-7e75-ed7393f3706d.png)



オレンジ色で Pending だったものが、Active に切り替わります。これで、Notifications の設定はおわりです。

![1601095924626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/47482803-db53-3c6d-f750-6e1e438847d2.png)





# CPU 使用率でアラーム設定

それでは、MySQL Database Service の CPU 使用率の設定をしていきます。
CPU Utilication の Metric のところで、Create an Alarm on this Query を選びます。

![1601095221950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/66686088-9837-4091-2829-c0b829c83c04.png)



各種パラメータを入れて、Save Alarm を押します。

Alarm Name がメールアドレスのタイトルとなります。
Alarm Body が、メール本文に書かれます。

![1601096321403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/63095a0e-0b01-e290-335a-2ac7a9e1e133.png)



設定完了です

![1601096347160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/64c43715-5c78-8fbf-5418-0be064871369.png)



# 動作確認 : CPU 使用率のアラーム

mysqlslap は、MySQL サーバーのクライアント負荷をエミュレートし、各段階のタイミングをレポートする診断プログラムです。複数のクライアントがサーバーにアクセスしているかのように作動します。今回は、mysqlslap を使って、MySQL Database Service に負荷を掛けてみます。

https://dev.mysql.com/doc/refman/8.0/en/mysqlslap.html

200台のクライアントがクエリーを実行し、それぞれ400 のクエリーを発行する負荷を掛けてみます。
※sqlslap で頑張っても、80% を超すのは難しかったので、実際の検証ではアラームの閾値を下げました

```
mysqlslap --delimiter=";" \
  --auto-generate-sql \
  --auto-generate-sql-add-autoincrement \
  --auto-generate-sql-load-type=mixed \
  --auto-generate-sql-write-number=250 \
  --number-of-queries=1000 \
  --concurrency=200 \
  --iterations=400 \
  --create-schema=test \
  --host="sugimysql.publicsubnet01.testuser001.oraclevcn.com" \
  --user="admin" \
  --password="your password"
```



Alarm の詳細画面を見ると、設定した閾値を超えていることがわかります

![1601098182335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c57a7573-9fde-6f10-d7d4-a4f5d31d081e.png)



自動的にメールが送られてきます。メール文面は、Notifications で送付しているため、メタデータが多く含まれています。

![1601098311267.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1539c10c-ac47-c78c-e9c7-26ad462fa105.png)



メール文面をキレイにしたい場合は、Notifications ではなく、Oracle Functions と Email Delivery を使うことで出来るはずです。



# 死活監視

厳密な意味とは異なりますが、MySQL Database Service の死活監視設定を行います。死活監視の部分は、「CPU 使用率のメトリックが無い状態」を検知してアラートを行います。「CPU使用率のメトリックが無い状態」は、MySQL インスタンス側で、通常では考えにくい何らかの障害が発生していると考えられます。

CPU 使用率と同様に、CPU Utilization からアラーム設定をします。

![1601099141971.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c3d350bc-6565-dc36-a459-9f598a0db982.png)



各種パラメータの設定をします。大事なポイントは、OPERATOR を `absent` を指定するところです。これは、データが存在しない状態を判断するための指定です。

![1601099317649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/abed06a7-583e-132f-a418-35eb1a794c83.png)



# 動作確認 : 死活監視

死活監視の動作確認をします。インスタンスの障害を疑似的に起こすために、停止をします。

![1601099469394.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c64c49d3-d783-00e5-9f81-72e9f32869d6.png)



停止方法が聞かれますが、Fast のまま Stop します (検証環境で、何も負荷が無い状態だったら、Immidiate の方が良いかも)

![1601099496255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a806966e-8c5b-9c65-94a0-4ba73e957d10.png)



インスタンスを停止することで、Metric 上では、データが無くなります。この状態だと、MySQL がなんらかの問題が発生していると想定できます。

![1601099844247.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1c38dbb6-bee5-eaca-6b70-db521fb3b06e.png)



インスタンス停止してから数分後、次のメールが届きます。無事に死活監視が出来ていますね。

![1601099958185.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/25959932-07d8-356e-38e6-52a43be43b98.png)