ふるさとチョイスのサーバー構成の変遷

トラストバンクの高橋と申します。 ふるさとチョイスのサービスが立ち上がってからもうすぐ10年。 最初は小さかったサービスが現在に至るまでのサーバー構成の変遷についてまとめてみます。 それほど革新的な内容のないごくごく平凡な構成ではありますが、 これからサービスを立ち上げる方成長途中のサービスを運用している方の参考に少しでもなれば幸いです!

なお、セキュリティ関連については、勿論、IDS/IPS、WAF、DBFWなど色々導入しておりますが、ここでは具体的な内容は伏せさせていただきます。

2012~2013年 サービス立ち上げ期

ふるさとチョイスのキャプチャー (2013年)
ふるさとチョイス (2013年)

サービス立ち上げから間もない時期のトップページです。当初は以下の様なシンプルな構成でした。

f:id:trustbank-developers:20220217235800p:plain
サーバー構成図 (2012年)

サーバーは格安のレンタルサーバー1台で、Cloudflare のフリープランのCDNを通していました。 当初はふるさとチョイス上で寄付を受け付けるという発想は無く、自治体様の寄付金の使い道やお礼の品を紹介するだけのサイトでしたので動的な要素はほぼ無く、WordPress で十分成り立っていました。

2013~2014年 寄付受付開始、絞り込み検索導入

ふるさとチョイスのキャプチャー (2014年)
ふるさとチョイス (2014年)

サービス立ち上げ2年後のトップページです。このときには既に多くの自治体様の寄付を受け付ける仕組みができあがっていました。 他、カテゴリーなどでの絞り込み機能が追加され、ログイン・マイページ機能もできあがりました。 GCF (ガバメントクラウドファンディング)も2013年から始まり、2014年末には長野県白馬村様で最初の災害支援受付が開始されました

このときは以下のようなサーバー構成でした。

f:id:trustbank-developers:20220218003857p:plain
サーバー構成図 (2014年)

さすがにレンタルサーバは厳しくなり、クラウド利用に移行しました。

WebサーバーとDBサーバーは分離されておらずに相乗りしており、各Webサーバーは読み込み時はローカルのDBを参照し、書き込み時はマスターサーバーのDBを参照していました。 ロードバランサーなどは特に用意せず、CloudflareのDNS機能を使って各サーバーに振り分け、Webサーバー間のファイルは lsyncd で同期していました。

大変シンプルな構成ではありますが、それ故にスケールアウト対応も単純。ひたすらWebサーバーをコピーして増やし、Cloudflareで紐付けるだけでした。 今でこそふるさと納税は一般に浸透していますが、当時はまだ知る人ぞ知る仕組み、という感があり、ふるさとチョイスがテレビなどで取り上げられるとアクセスが急増し、その際は何名かで手分けしてひたすらサーバーをコピーする作業をしていました。(オートスケーリングなどの仕組みはありませんでした)

とあるテレビ番組で取り上げられた際は約100台を一時的に並列に並べました。本来、100台も必要になるようなアクセス数ではありませんでしたが、当時はまだ WordPress 上でサービスを開発しており、これが大変重かったため1台で捌けるアクセス数がかなり少なかったです。このときに1台で捌ける量を増やすため、外部のエンジニア様のご支援により Apache から nginx に移行し、nginxのページキャッシュ機能を使うことで、捌ける量が大幅にアップしました。

当時はソース管理には Subversion を使っておりました。(後に 自前GitGitHub と変遷)

2015~2017年 円熟期

ふるさとチョイスのキャプチャー (2017年)
ふるさとチョイス (2017年)

2015年2月に累計寄付件数が100万件を突破してから一気にふるさと納税の利用が拡大し、競合他社様のサービスも次々に立ち上がっていきました。2015年12月には月間1億ページビュー数を超え、 翌2016年6月には、契約自治体数が1,000自治体を超えました (全国1,788自治体中)。

そんな最中でのサーバー構成です。

f:id:trustbank-developers:20220218022411p:plain
サーバー構成図 (2016年)

より堅牢性を高めるため、データベースサーバー用にクラウドとは別に専用サーバーを購入してリモートハウジングし、クラウドサーバー用のネットワークとブリッジ接続する構成を取りました。 また、2015年まではお礼の品のフリーワード検索ができませんでしたが、 Apache Solr を使って検索サーバーを立て、検索ができる仕組みを整えました。

お礼の品の数が大幅に増加し、画像の容量が逼迫してきたので、画像専用のサーバーを別途立てました。画像のアクセスはほとんどCDNが捌いてくれるので、月間1億ページビュー数の最中でも、Core数6のサーバー2台で余裕で捌くことができました。(それでもスカスカでした)

2015年の中頃より、Cloudflareのフリープランから一気にエンタープライズプランに切り替えました。恐らく、日本の企業の中ではかなり早いプラン導入事例だったと思われます。(当時は日本語の窓口も無くお打ち合わせも英語のみでした…)

そして相変わらず WordPress を導入していましたが、これが原因でパフォーマンス上のネックがあったり、開発効率にも大きな支障があったため、徐々に FuelPHPフレームワークを使った実装に置き換えていきました。 当時は PHP界隈において、ここまで Laravel 一強時代になることを予期することができず、今思うと選択を誤ったな…、と感じております。(ただ、フレームワークの根本の考え方はそれほど変わらないです)

また、当時は NoSQL の有用性を理解しきれておらず、Key-Valueストア の代わりとして、もっぱらPHPAPC を用いていました。 ( memcached など色々試してみたものの、満足するレベルではなく、たとえサーバーごとに個別にキャッシュを持つことになったとしてもAPCの方が圧倒的に速く感じた)

ふるさと納税サイトは年末に駆け込み需要があり、大幅にアクセス・寄付が伸びますが、クラウドサーバー上で相乗りによるティーが発生しないように、1台あたりモリー224GB確保するという荒業をとることもありました。(当時は224GB確保すると相乗りされることがなかった)

2018年 ふるさとチョイス全面リニューアル

ふるさとチョイスのキャプチャー (2018年)
ふるさとチョイス (2018年)

2018年3月にふるさとチョイスを全面的にリニューアルしました。 WordPress を完全にやめ、全て FuelPHP で書き直しました。 そして、サーバーインフラ専門の会社様と相談しながらサーバー構成も大幅に見直しております。

f:id:trustbank-developers:20220218032316p:plain
サーバー構成図 (2018年)

今まで、Webサーバー上にDBなど色々なものが相乗りしていましたが、 Webサーバー (nginx)APサーバー (PHP)DBサーバー (MySQL) の3層に分け、各層間はソフトウェアロードバランサーで繋ぎました。 これにより細かいスペック調整が可能になったのと、CPUやメモリーを効率良く使えるようになり、異常発生時の切り分けもしやすくなりました。反面サーバー構成が複雑になったために、異常発生時の緊急対応が知見のある者でないと行えなくなってしまいました。 3層に分けてみて分かったこととしては、Webサーバーはほとんどスペックや台数は必要ありませんでした。APサーバーやDBサーバーはボトルネックになることがかなり多いようです。

また、自治体様が LGWAN ネットワーク上からふるさとチョイスの管理が行えるよう、 J-LIS に申請して LGWANネットワークに参加しました。 DBはインターネットとLGWANの真ん中に配置し、LGWANネットワークからは LGWAN WebサーバーFirewallLGWAN APサーバーFirewall と、2つのFirewallを挟んでつながるようにしております。

2022年~ インフラ改革

ふるさとチョイスのキャプチャー (2022年)
ふるさとチョイス (2022年)

今までトラストバンクはインフラ専任エンジニアがおらず、開発と兼務していましたが、ようやく念願のインフラに特化したエンジニアが合流し、色々な改革に着手しています。 AWSを利用した動的なスケーリングマイクロサービス化デプロイの仕組みの見直しLaravelへの切り替え、その他大小様々な対応の検討が進んでおります。

おわりに

トラストバンクにご興味をお持ちいただけましたら、是非以下の募集ページをご覧ください。様々な職種で絶賛募集中です。

www.wantedly.com