GCP Cloud SQLでフェイルオーバーを試してみた
GCPの無料トライアル期間が終わりそうなので、クーポンが残ってるうちにいろいろ試してみようと思い立ち、ずっと気になっていたクラウドサービスのRDB (Relational Database)を使ってみた。
特にサーバで障害が発生した際のサーバ切替(フェイルオーバー)がどんな感じで使えるか試してみた。
ちなみにデータベースはPosgtreSQLを使用。
以下の流れで実験してみた
- Cloud SQLインスタンスを作成
- SQLインスタンスのPostgreSQLユーザとデータベースを作成
- Compute Engineインスタンスを作成
- Compute Engineにデータベースを使った簡単なWebアプリケーションをデプロイ
- フェイルオーバーを実施
Cloud SQLインスタンスを作成 Link to heading
GCPのコンソールから「SQL」->「インスタンスを作成」でDBサーバのインスタンスを作成する。
今回はPostgreSQLを選択。

設定内容は以下の図を参照。
特筆する点は、1. 「接続の設定」で「プライベートIP」を追加、2. 「自動バックアップと高可用性の有効化」で「高可用性」をチェックすること。



作成が完了するとSQLインスタンス一覧に表示される。

VMと繋ぐためのIPアドレス情報はインスタンス名をクリックし、「インスタンスの詳細」ページで確認できる。

SQLインスタンスのPostgreSQLユーザとデータベースを作成 Link to heading
ユーザ作成 Link to heading
「インスタンスの詳細」->「ユーザ」->「ユーザアカウントを作成」でPostgreSQLユーザを新たに作成する。

「ユーザ名」と「パスワード」を設定する。
(今回はユーザ名:django、パスワード:djangoでやってます)

今作成したユーザが表示される。

データベース作成 Link to heading
「インスタンスの詳細」->「データベース」->「データベースを作成」でデータベースを新たに作成する。

「データベース名」を設定する。

今作成したデータベースが表示される。

Compute Engineインスタンスを作成 Link to heading
GCPのコンソールから「Compute Engine」->「VMインスタンス」->「VMインスタンスを作成」でインスタンスを作成する。
設定内容は以下の図を参照。

作成が完了するとVMインスタンス一覧に表示される。

Compute Engineにデータベースを使った簡単なWebアプリケーションをデプロイ Link to heading
VMインスタンスのほうにログインして、必要な設定をする。最低限Git, Docker, Docker Composeはインストールすること。
Webアプリケーションをインストール Link to heading
今回はテスト用に自作したシンプルアプリケーションを利用する。
git clone https://github.com/tetsis/nginx-gunicorn-django-postgres.git
cd nginx-gunicorn-django-postgres/
docker-compose-without-postgres.ymlを編集し、接続先データベースのIPアドレスをさっき作ったSQLインスタンスのものに変更する。
version: '3'
services:
nginx:
image: nginx:1.12.2-alpine
ports:
- "80:80"
- "443:443"
depends_on:
- django
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/certs:/etc/pki/nginx/certs
- ./src/static:/var/www/static
django:
build: ./django
env_file: ./django/.django_env
environment:
DATABASE_HOST: "10.122.0.2" # ここをSQLインスタンスのプライベートIPアドレスに変更する
volumes:
- ./src:/usr/src/django
command: gunicorn app.wsgi -b 0.0.0.0:8080
Webアプリケーションの実行と動作確認 Link to heading
Docker Composeでアプリケーション実行する。
docker-compose -f docker-compose-without-postgres.yml up -d
docker-compose psコマンドで正常起動しているか確認
# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------------------
nginx-gunicorn-django-postgres_django_1 gunicorn app.wsgi -b 0.0.0 ... Up
nginx-gunicorn-django-postgres_nginx_1 nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
データベース初期化 Link to heading
以下のコマンドでデータベースを初期化する。
自作スクリプトだけど中身はdjangoのmigrateしてるだけ。
docker exec nginx-gunicorn-django-postgres_django_1 ./init.sh
アプリケーションにアクセス Link to heading
ブラウザで「https://(Compute Engineの外部IPアドレス)/」にアクセスする。
すると以下のような画面が表示される。

「Save」をクリックすると、その時間をDBに保存して画面に表示するだけのシンプルなもの。
フェイルオーバーを実施 Link to heading
今回メインテーマのフェイルオーバー。 本来はメインのサーバ(マスター)が障害等でシャットダウンした際に発生するものだが、Cloud SQLには手動でフェイルオーバーする機能がついているので、今回はその機能を使ってサービス断時間を計ってみる。
「インスタンスの詳細」画面の右上にある「フェイルオーバー」から手動でフェイルオーバーを実行する。

Webアプリケーションの時間記録の機能を使って、サービス断時間を計ってみた。

正確なDBサービス断時間ではないがアプリケーションからみた断時間は38秒間だった。
結構いい感じ。