ニフティクラウドRDBを構築してみる

# はじめに
RDBの構築手順を備忘録的にまとめてみました。

# 前提条件
特になし。強いて言うなら@niftyアカウント登録済みであること。

# 手順
- FW作成
- RDB作成
- ログ出力設定
- Timezone変更
- フェールオーバー

# 詳細
### FW作成
- コントロールパネルより[RDB] -> 左ペイン[DBファイアウォール] -> [DBファイアウォールグループ作成]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/d0e10c26-449c-c5f1-402f-332ae819b036.png)

- FW名、ゾーン、メモ（任意）入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/1176c5c4-06c6-4b3f-6744-4fcf9aea45b0.png)
- 接続元CIDRを入力し追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/c76da727-4266-6e4c-7fc4-ca3973564e83.png)  
インスタンス（WEBサーバー、APサーバー等）との通信が発生する場合は、プライベートIPを接続元として指定する方がセキュリティ的に良いかも。  
- 作成完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/3e5fdd92-eb30-7df5-4280-7009735e75e0.png)

### RDB作成
- 続いて左ペイン[DBサーバー] -> [DBサーバー作成]  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/d3e85581-5f60-ecdb-1a8a-c71c1d1f7a59.png)
- エンジンを選択  
今回はMySQL5.6系を選択しているが、適宜好みに合わせる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/e90e13f5-cb48-8691-0d44-0202e6f6ea59.png)
- サーバー名、ゾーン、タイプ、ディスク等を入力  
冗長化については[こちら](http://blog.cloud.nifty.com/2950/)を参照
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/2f994d06-3abb-5b7f-dc83-84d28955152e.png)
- DB名、マスタユーザー/パスワードを入力  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/e11d086d-2d76-e2f3-adda-afb534abc22a.png)
- バックアップ、メンテナンス時間を設定  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/87a552dc-c339-1e51-90fb-8b75b609de13.png)
- 最後、設定内容を確認し作成  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/38c4b379-1d59-2073-b279-501c1f57af0b.png)
- 作成開始  
完了するのに数分要する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/3163cf5b-d801-5462-2da9-f2d404c93756.png)
- 作成完了  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/42faaf70-e485-9a1f-56a6-1dfc32018d18.png)

### ログ出力設定
コントロールパネルからログを閲覧できるようにするため、パラメータを変更する。

- 左ペイン[DBパラメーター]から[DBパラメーターグループ作成]をクリック  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/311b7de9-47c5-ad06-ba66-ed38030df2bf.png)
- パラメーター名、エンジンを入力  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/6a7d5789-57f8-7fb8-cac0-1d37695c374d.png)
- 検索窓から「log_output」を入力し設定値を確認  
「FILE」になっていれば、閲覧可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/652e6999-23ac-e6ee-641f-a0e2a0e6d806.png)
- 次に検索窓から「slow_query_log」を入力し検索  
プルダウンから「1」を選択。スロークエリの設定はトラブルシューティング時に役立つので極力やった方がいいかも。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/9b1e432f-e40b-108e-f489-8dbda5bd14d9.png)
- 次に検索窓から「general_log」を入力し検索  
プルダウンから「1」を選択。こちらは任意です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/74d7f2ad-e704-ef41-0097-dd5cbaa950d6.png)  
完了後、[保存する]をクリックし、パラメーターを作成  
- 保存後、それぞれ確認。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/02a76015-93cd-479b-b08d-b4c66a0c3036.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/2c449334-971b-10d4-667e-6a0594770e17.png)

### 設定反映  
先程作成したパラメーターグループを反映する。

- 左ペイン[DBサーバー]から対象サーバーを選択し、[選択したDBサーバーの操作]からプルダウンで設定変更を選択  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/9c50fa3b-b8aa-f1e4-2def-646ed28eb88b.png)
- DBパラメーターグループのプルダウンから先程作成したパラメーターグループを選択し、設定変更  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/b46c203b-a943-02ae-3dce-4bfd59c03024.png)
- 設定後確認  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/9006b76c-9133-c1b9-f675-7a4ec4394186.png)

### Timezone変更
TimezoneをUTCから変更する。これによりタイムスタンプが日本時間に合わせられる。  

- 現在のTimezoneを確認  
mysqlコマンドでログインする。※MySQLクライアント（Webサーバーなど）で操作  

```:mysql
mysql -h [RDB IPアドレス] -u [ユーザー名] -p
Enter password:
~
show variables like '%time_zone';

+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
```
- ストアドプロシージャの作成  
ニフティクラウド側が作成したrdbadmin以外のユーザについては、Asia/Tokyoを適用させる。

```:MySQL
mysql> CREATE DATABASE shared;
Query OK, 1 row affected (0.00 sec)

mysql> DELIMITER |
mysql> CREATE PROCEDURE shared.`store_time_zone`()
    -> IF NOT (POSITION('rdbadmin@' IN CURRENT_USER()) = 1) THEN
    -> SET SESSION time_zone = 'Asia/Tokyo';
    -> END IF |
Query OK, 0 rows affected (0.29 sec)

mysql> DELIMITER ;
```
マスターユーザー以外の新規に追加したユーザーでストアドプロシージャを作成するにはマスターユーザーでログインし下記のような権限付与を行う必要がある。

```:MySQL
GRANT ALL ON shared.* to ユーザー名@'%' identified by 'パスワード';
```

- パラメータを修正

![スクリーンショット 2017-08-30 12.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/23761/b522ca5e-a02e-7ec1-03b9-9464517ec25c.png)

- 検索窓で「init_connect」を検索し、以下入力

```:init_connect
CALL shared.store_time_zone
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/0d839ca3-6414-a9ab-ac39-203d117ee590.png)

- 保存後、DBサーバーを再起動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/aca32668-e36d-742f-309c-c0a2ce6a6112.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/b1603ef8-726a-93ca-dd25-cf030071176b.png)

- 再起動後反映されているか確認

```:MySQL
mysql> show variables like '%time_zone';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
```

### フェールオーバー
余力があれば追記

# 最後に
1から冗長構成のDBを作成するよりだいぶラクです。
もうちょっとこうした方がいいなどご意見ありましたらコメントお願いします。

# 参考
[MySQLエンジンでタイムゾーンをUTCから他のものに変更することは可能ですか？](http://cloud.nifty.com/cs/catalog/cloud_faq/catalog_140519001737_1.htm)
[コントロールパネルからDBログを閲覧できるようにしたいのですが、どのようにすればいいでしょうか？]()
[DBパラメータグループ](http://cloud.nifty.com/spec/rdb/parameter_group.htm)
[DBログ](http://cloud.nifty.com/spec/rdb/server_log.htm)