8月下旬、 Google Cloud SQL 2nd Generation がGAとなりました。すでに検証はしていますが、今回は Cloud SQL Proxy を中心に書きます。

GAEのために出来た、という歴史的な背景からもあまりGCEから使うこともなかった Cloud SQL (1st generation)ですが、昨年 2nd generation がベータとなりました。パフォーマンスの高さについてはアナウンスされていますが、この記事はFailOverを中心に、2nd generati...

iga-ninja.hatenablog.com

Cloud SQL Proxy とは?

前回の記事でも記載しましたが、Cloud SQL への接続は全てグローバルIPアドレス となります。これに嫌悪するひとは多いと思いますが、この点はどうすることも出来ません。で、GCEのVMからアクセスする場合、は2つの方法どちらかをとることになります。

  1. 特定IPアドレスからのみアクセスを受け付ける(グローバルIPのみローカルIPは意味ない)
  2. Cloud SQL Proxy を使う

1を採用したでも、GCEの特定VMからのみだときまっていたり、スケールアウトは考える必要がなく、固定台数でのみサービスする場合は、あまり問題はありませんが、スケールアウトするならば新規VM追加の度にIPアドレスを追加していく必要があります。他の方法としては、NATやHAProxy, MaxScale などで、どこかのIPアドレスに束ねてしまう方法ですが、新たなspofを産んでしまうので、あまりよい手とは言えません。

そこで、2の Cloud SQL Proxyです ちなみに、 MySQL Proxy とは全く関係ありません

動作について

Cloud SQL Proxy のやることは、Cloud SQLへの接続(or 認証だけ?)を、一般的な IPアドレス(TCP)経由ではなく、Cloud SQL APIベースで行うものだと推測しています。
だから、IPアドレスにより許可は要らない。
では、プログラム側からどのように参照するかですが、これは UNIX Socket となります。後で手順を書きますが、
Proxy の役目は Cloud SQL への接続を API ベースから UNIX Socket に変換する と言って良いはずです。

構成

上記 Cloud SQL Proxy の役割を理解すると、自ずと構成は Cloud SQL へアクセスする全VMインスタンスで Cloud SQL Proxyを動かす となります。どのみち UNIX Socket なんで、必然的にこうなりますよね。また Docker用の Cloud SQL Proxy もあるようです。これはDockerイメージかな?多分他のコンテナは、 Proxy コンテナへリンクをはって、Proxyコンテナ経由で接続するではなかろうかと

また、各VMインスタンスには、Cloud SQL のスコープ(AWSでいうEC2ロール)を付けておくことを激しく推奨します。スコープ無しでも出来ると思いますが、面倒だと思います。

手順

簡単です。GCSからダウンロードして実行するだけです。多分 Go製かな?
https://cloud.google.com/sql/docs/compute-engine-access

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy
chmod +x cloud_sql_proxy
sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
sudo ./cloud_sql_proxy -dir=/cloudsql &

この実行により、 /cloudsql/ ディレクトリの下に、各Cloud SQL への接続用 Unix Socketができ、 mysqlでアクセスするなら

mysql -uroot -p -S /cloudsql/[INSTANCE_CONNECTION_NAME]

で接続できます。 [INSTANCE_CONNECTION_NAME] ってなんじゃい?知いますが、大して難しい話ではなくて、-S で指しているのは UNIX Socket の場所です。 Cloud SQL Proxyが INSTAANCE_CONNECTION_NAME(Cloud SQLのね!) で UNIX Socketを作るってだけの話です。

自動起動

ただのアプリーケションなので、自動起動設定が必要です。勝手にデーモン化はするみたいですが。
systemd が使えるなら systemdで
ないなら upstart で設定すればよろし。

HAProxyで RR負荷分散

backend の指定は UNIX Socket でも出来るらしいです。(> 1.5)
動くことは確認出来ました。レプリラグがひどいものを排除する場合は、xinetd などで httpから確認になると思います。

5 時過ぎに目が覚めて眠れなくなったので気になっていたことを考えてみた。 はじめに RDS のリードレプリカを HAProxy で振り分ける方法については... HAProxyを用いたRead Replica(RDS)の振り分けblog.cloudpack.jp 上記の記事を参考にしつつ... RDS のリードレプリ...

inokara.hateblo.jp

まとめ

Cloud SQL 2nd gen 使うなら Cloud SQL Proxy 一択

メリットが圧倒的に多いので、上記のみとなります。

元記事はこちら

Google Cloud SQL 2nd Generation Proxy接続する