Google Compute Engine (GCE)からCloud SQLを使ってみる

[Google Compute Engine (GCE)上でTiny Tiny RSSを動かしてみる](http://qiita.com/z80/items/0e81655e08a469ee8567)の続きです。前回はCompute EngineのVMインスタンス上でLighttpdとMySQLを動かしましたが、今回はMySQLの代わりに[Cloud SQL](https://cloud.google.com/sql/)を使ってみます。基本的に自分用の備忘録です。

# Cloud SQLとは

要はMySQLを[Google Cloud Platform](https://cloud.google.com/)用に超カスタマイズしたVMインスタンスということのようです。

# Cloud SQLインスタンスを起動

2016年1月の時点では[Cloud SQL Second Generation (beta)](https://cloud.google.com/sql/docs/introduction#v2)がお勧めのようです。まだベータ版ですが、SLA(Service Level Agreement)も必要ないし、値段もこちらの方が安いようなので、こちらを使ってみます。

Machine typeはとりあえず`db-f1-micro`を選択。Enable daily backupsをチェックして時間を適当に設定。Advanced optionsの[MySQL flags](https://cloud.google.com/sql/docs/mysql-flags)で`character_set_server`を`utf8mb4`に、`default_time_zone`を`-08:00`(`America/Los_Angeles`の冬時間の場合)にセットして起動します。

起動直後の初期状態で、Storage usageが約1GB、CPU usageがほぼ0、Memory usageが約550MBでした。`db-f1-micro`のメモリが614.4MBなので、結構ぎりぎりな感じです。

# Cloud SQLの設定

まずはWebからAccess ControlのUserのところで`'root'@'%'`ユーザのパスワードを設定します。

それから、Access ControlのAuthorizationのところでTiny Tiny RSS用に起動したVMインスタンスのIPアドレスからのアクセスを許可します。IPアドレスはVMインスタンスのExternal IPを使えばいいようです。
試しにVMインスタンスから`mysql`コマンドで接続してみます。

```bash
$ mysql -h (Cloud SQLインスタンスのIPアドレス) -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
...
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2016-01-22 20:20:20 |
+---------------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

```
現在時刻をチェックしてタイムゾーンの設定ができているか確認しておきます。

[Creating Databases](https://cloud.google.com/sql/docs/create-database)や[Creating Users](https://cloud.google.com/sql/docs/create-user)を見るとWebからデータベースやユーザを作れそうですが、どうやらSecond Generation (beta)ではまだサポートされていないようです。ということで、`mysql`コマンドからデータベースとユーザを作成します。

```bash
mysql> CREATE DATABASE ttrss_db CHARACTER SET utf8mb4;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER 'ttrss_user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON ttrss_db.* TO 'ttrss_user'@'%';
Query OK, 0 rows affected (0.00 sec)

```

# データの移行

[Importing and Exporting Data](https://cloud.google.com/sql/docs/import-export)を参考に、VMインスタンスの`ttrss_db`データベースのデータをダンプしてインポートします。

```bash
$ sudo service tt-rss stop
$ mysqldump --databases ttrss_db -u ttrss_user -p --hex-blob --default-character-set=ut
f8 > ttrss_db.sql
Enter password: 
$ ls -l
total 504
-rw-rw-r-- 1 z80 z80 513801 Jan 22 22:22 ttrss_db.sql
$ gcloud auth login
...
$ gsutil cp ttrss_db.sql gs://mybucket
Copying file://ttrss_db.sql [Content-Type=application/x-sql]...
Uploading   gs://mybucket/ttrss_db.sql:                              501.76 KiB/501.76 KiB    
$ gsutil ls -l gs://mybucket
    513801  2016-01-22T22:22:22Z  gs://mybucket/ttrss_db.sql
TOTAL: 1 objects, 513801 bytes (501.76 KiB)
$ gcloud sql instances import ttrss-db gs://mybucket/ttrss_db.sql
Importing Cloud SQL instance...-ERROR: (gcloud.sql.instances.import) UNKNOWN
```
むむ、UNKNOWNな理由でエラーになってしまいました。試しにFirst GenerationのCloud SQLインスタンスを起動してインポートしてみたら問題なくインポートできたので、Second Generation (beta)ではまだサポートされていないのでしょう。
普通に`mysql`コマンドからリストアします。

```bash
$ mysql -h (Cloud SQLインスタンスのIPアドレス) -u root -p < ttrss_db.sql 
Enter password: 
```

問題なくリストアできました。

# Tiny Tiny RSSの設定

Tiny Tiny RSSの設定を変更します。

```bash
$ sudo service tt-rss stop
$ sudo service mysql stop
$ cd /var/www/tt-rss
$ sudo mv config.php config.php.backup
```

ブラウザで http://(IPアドレス)/tt-rss/install/ にアクセスしてインストールします。

```bash
$ diff -u config.php.backup config.php
...
$ sudo vi config.php
# DAEMON_SLEEP_INTERVALの設定を追加
$ sudo service tt-rss start
```

ブラウザで http://(IPアドレス)/tt-rss/にアクセスます。

# バックアップとリストア

一日経ったら、バックアップがとれているか確認します。試しにリストアしてみると、データは元に戻ってTiny Tiny RSSも普通に動いています。

# まとめ

Tiny Tiny RSSのデータベースを、Compute EngineのVMインスタンス上のMySQLからCloud SQLに移行して、問題なく動くことが確認できました。Cloud SQLのSecond Generation (beta)は、MySQL本体は問題なく動いているようですが、Webからの設定や`gcloud`コマンドからの操作はもうちょっとのようです。2016年1月の時点では、Cloud SQLの機能を活用するならFirst Generationの方がお手軽そうです。

# ToDo

MySQLのcharacter setについて調べていたら、`utf8`と[`utf8mb4`](https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html)というのがあるようです。[`schema/ttrss_schema_mysql.sql`](https://tt-rss.org/gitlab/fox/tt-rss/blob/master/schema/ttrss_schema_mysql.sql)では`DEFAULT CHARSET=UTF8`としていますが、[絵文字などを扱うには`utf8mb4`にする必要がある](https://tt-rss.org/forum/viewtopic.php?t=2716#p15953)ようです。
追記: [Google Compute Engine (GCE)上でTiny Tiny RSSを動かしてみる](http://qiita.com/z80/items/0e81655e08a469ee8567)を更新しました。

# 参考

- [Configuring MySQL Flags](https://cloud.google.com/sql/docs/mysql-flags)
- [Re: Errors updating Reddit/Apple feed](https://tt-rss.org/forum/viewtopic.php?t=2716#p15953)
- [How do I see what character set a MySQL database / table / column is?](http://stackoverflow.com/questions/1049728)
- [MySQL 5.6 Reference Manual / Globalization / MySQL Server Time Zone Support](https://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html)
- [How to set time zone of mysql?](http://stackoverflow.com/questions/930900/how-to-set-time-zone-of-mysql)