このサイトのサーバーをGoogle Compute Engine(GCE)に引っ越ししました。
今回はGCEと、このサイトの実構成をざっくり説明して、次回以降細かいやり方など書いていこうかと思います。
目次
嵐は突然に
先日、一括で買ったSurface 3がソフトバンクに残債ありで登録してしまっているという記事を書きました。
反響はすさまじく、3日ほどではてなブックマーク460ぐらい、リツイートも1,200件、Facebookも750件ほどシェアされました。一日中SNSの通知が鳴りっぱなしで、本当にSNSの拡散力には驚かされました。
その結果、サイトのアクセスもものすごいことになり、10月9日はこの記事だけで1日に1万8千回もアクセスされました。とんでもねぇ…。
サイトの負荷も相当なもので、10月9日はほぼ終日、ページが表示されない状態が続きました。
使っているサーバーはお名前.comのレンタルサーバーでメモリが2GBで、1接続に60MBぐらいメモリ消費するので、Apache(Webサーバーのアプリ)に使える分のメモリを計算すると、同時に30接続ぐらいしか処理できず、それを超えた分は待たされてしまうという感じでした。30接続以上制限してなかったらメモリ食いつぶしてサーバー全体が死んでしまっていたでしょうね。
Apacheの接続をすぐに解放して次の処理に回せるようにKeepAliveをオフにしたり、それなりに対策しましたが、焼け石に水でしたね。黙って嵐が過ぎるのを待つしかないという感じでした(笑)。
Google Compute Engineとは?
そこでちょうど連休中でしたので、かねてより気になっていたGoogle Compute Engine(GCE)を試してみようかと思って、いけそうだったので思い切ってA-tak.comをGCEに移行してしまいました。
GCEはクラウド上に仮想のサーバーを借りられるサービスです。Googleが自社のいろんなサービスに使っている最先端の技術を、個人でもリーズナブルに借りて使えるとんでもないサービスです。
面白いのが利用料金が細かい従量課金になっていて、たとえばこのサイトで採用した f1-micro というメモリ0.6GBのサーバーだと1時間$0.008、1$を100円で計算すると0.8円で借りられます。月にすると600円ぐらいですね。実際はディスクの容量とか、通信料によって課金されるので、もっと高くなります。
たとえば通信料はだいたいGCEから外に出て行くのが1GBあたり$0.12とか、ディスクは1GBあたり一ヶ月$0.04とかですね。ディスクは40GB借りても160円ぐらいだから安いもんですね。通信料はちょっとわからないので実際に一ヶ月使って実績でみてみようかと思ってます。50GB通信あったとしても600円だから、大丈夫だとは思うんですが。
[2015-10-18 追記]
一ページのサイズ測ったら、だいたい1.5MBぐらいですね。もしこの前のような負荷が毎日続いたとしたら、1.5MB x 1万8千 * 30日 = 810GBですね。うちのサイトではこんな負荷が毎日続くことはありえないですが、これだと9,720円(実際は少しディスカウントが入る)。でも、普段でもこれの1/10ぐらいはアクセスあるからこれだけで1,000円近くか?
私の理解が間違ってるかもしれないので詳しくはこちらでご確認ください。
GCEは最初に無料枠があって、$300もしくは60日間は無料で使えるので、気になる方は試してみるといいですよ。請求先アカウントというところを見ると、実際どれぐらい費用がかかるか見れるので、コストが心配な方も実際に使ってみるといいと思います。私も10月10日に始めたばかりなので無料期間中ですが、普通にこうやってサーバー立てて移行まで、がっつり試せてます。
GCEはGoogle Cloud PlatformというGoogleが提供するクラウドサービスの一つで、Google Cloud Platformの中には流行のビッグデータを扱うサービスもあったります。TB級のデータをあいまい検索して数秒で結果が返ってくるの見ると、DB技術者の方は感動すると思いますよ。しかも、インデックスとかなしで毎回フルスキャンですからね。意味がわかんないです。
Google Compute Engineなら突然の負荷にも柔軟に対応できる
コスト面でメリットがあるような感じで書いちゃいましたが、個人のブログ程度だったら正直費用的なところは積み上げていくと、私が前使っていたお名前.comの方が月1,300円ぐらいなので安くなるし、マッチすると思います。
それでもGCEを試してみたいなと思ったのは、最先端のクラウド技術を体験したかったのと、突然の負荷にも対応できる懐の広さです。
GCEはさっきも書いたように時間単位(正確には最低10分間、その後は1分単位)での課金になります。なので、普段は少ない台数のサーバーを借りて、アクセスが多くなったら追加でサーバーを借りるという柔軟な対応ができます。
さらにいうとGCEには「オートスケール」という機能があり、負荷が上がってきたら自動でサーバーの数を増やして分散処理して、負荷が収まったら自動でサーバー減らす仕組みがあります。いつ来るかわからない負荷のためにサーバーを前もってたくさん常駐させて無駄にお金を払う必要がないのです。
通常、複数のサーバーに処理を分散するにはロードバランサー(LB)という仕組みが必要ですが、GCEにはLBも用意されています。ハードウェアで買うと50万から数百万もしますが、GCEのLBは月々1,800円程度。しかも、性能もかなり良いらしく、アジアのデータセンターで障害が起きてもヨーロッパのサーバーでサービス継続したりもできるという化け物。
インフラエンジニアではないので、国をまたいだ負荷分散の仕組みを独自に作るとどれだけ費用がかかるか想像もできませんが、さすがに月々数千円ではGoogle以外に提供できるところはないでしょうね。
WordPress + Nginx + オートスケール構成
いろいろ試して紆余曲折はありましたが、こんな構成で落ち着きました。
フロントにはロードバランサ(LB)。後ろにはウェブサーバーがオートスケール構成で負荷に応じて1台から7台(無料期間の制限で8CPUまでのため)まで自動で増減します。
WordPressのデータベースは1台のDBサーバーに持たせていて、フロントの各ウェブサーバーから通信を受け付ける構成にしています。GCEにはDNSが設置されていて、インスタンス名で各サーバーが通信できるので、接続設定とか接続許可設定がやりやすくていいですね。
DBはMariaDB(MySQL)。仕事だと1台サーバーが壊れても大丈夫なようにマスタースレーブ構成とかにするんですが、そもそも個人のブログなのでそこまではやらなくていいかなと(笑)。この前の負荷の状況見るとDBがボトルネックになっていなさそうだったから、DB負荷についてもあまり気にしてません。
WordPressで参照する画像をどこに置くか迷いましたが、DBサーバーにNFSサーバー(ファイルサーバー)機能を持たせて、そこに置くことにしました。最初はGoogle Cloud Storageに置こうと思いましたが、WordPressの改造を派手にやらないといけないみたいなのでその案は断念しました。
次に各Webサーバーに画像をおいてみたのですが、もし一台動かなくなっても他のWebサーバーで独立して動くので、それはそれでいいのですが、画像をアップロードしたときに、すべてのウェブサーバーに同じようにファイルを置かないといけないので、同期の仕組みとか考えるのが面倒。結局、一つのNFSサーバーに置くことにしました。
そうそう、ZenCacheというキャッシュプラグインもネックでした。こいつはページの更新があればキャッシュをクリアして再作成してくれるんですが、キャッシュを各ウェブサーバーに置いてしまうと、それぞれのサーバーでどうにかしてZenCacheのキャッシュをクリアして廻らないといけないんですよね。
あとWordPressのPHPファイル自体もNFS上においてます。NFSが死んだら全滅です(笑)。WordPressの自動更新が複数のWebサーバーで同時に動いたりして問題起きないかな? というのがやや心配。
WebサーバーアプリもApacheからNginx(エンジンエックス)に変えました。Apacheはアクセスの度にプロセスなりスレッドなりを起動するので、それこそ1接続で60MBもメモリ消費したりするのですが、Nginxは1プロセスで複数リクエストを処理するので、接続が増えるほどにメモリを食うということがないとのことです。
PHPなどの動的にページを表示を変える仕組みについてはNginxでは対応してないので、別途PHP-FPMなどのようにPHPを動かす仕組みが必要になります。うちもphp-fpm入れてます。
次回から実際の構築について説明
前置きだけで長くなってしまったので、実際の構築については次回以降書いていきます。
続き↓