はてなで新しくWebサービスを作るときのインフラの作り方

この記事ははてなデベロッパーアドベントカレンダーを始めます - Hatena Developer Blogの17日目の記事です.昨日は id:yashigani_wPromiseを学ぶためにSwiftでPromiseを実装してみた話 - yashigani?.days でした.


こんにちは、はてなの id:wtatsuru です。はてなのインフラ全般をみています。
はてなでは、しばしば新サービスを構築する機会があります。正式サービスもあれば、はてラボ のような実験的サービス、内部の Microserviceの一部になっているものなど多種多様なものがあります。新規サービスのインフラを構築する際は、最小構成でありつつ後のスケールやメンテナンスを考えた仕組みを作っていくことになります。この記事では、2015年12月現在のはてなでの標準的な構成を紹介していきます。

新サービスの最小構成

f:id:wtatsuru:20151217185824p:plain
こちらが新サービスを出したいというときの基本形です。論理的には、リバースプロキシ・アプリケーションサーバ・データベースの典型的な三層構造をとっています。以下、それぞれのサーバと使用している技術についてみていきます。

リバースプロキシ

正面でコネクションを受けるリバースプロキシには、nginx を使用します。クライアントとの接続を受け持つ、静的ファイルの配信、コンテンツ圧縮、SSL終端などの役割を持ちます。前段にはロードバランサとして、オンプレ環境の場合 LVS、AWSの場合は ELB を TCP Mode で置き、nginx は HTTP もしくは SPDY でリクエストを受けます。もうしばらくすると HTTP/2 の使用も広がるでしょう。
かつては静的ファイル配信用のドメインは分けることが多かったのですが、最近では SPDY や HTTP/2 の登場によりドメイン分割の必要性は薄れてきています。海外展開も考慮する場合はレイテンシ軽減のために静的ファイル配信用ドメインを分け、CDNを通す場合もあります。

アプリケーションサーバ

はてなでは主にPerlで書かれているアプリケーションサーバです。最近では一部 Scala も使われ始めています。
小規模なうちは、アプリケーションサーバにリバースプロキシも同居させます。これらの間はローカル通信ですが、tcpdump が簡単にできるなどの理由から、パフォーマンスが問題になるまでは unix domain socket ではなく TCP を用いて通信します。サービス規模が大きくなってくるとリバースプロキシとは分離して独立でスケールさせていくことになりますが、まずは最小構成である2-3台で始めます。

データベースサーバ

はてなでは主に MySQL を使用しています。社内にはバージョン4.0から各種存在しますが、新サービスではMySQLのバージョン5.6を採用しています。オンプレミス環境の場合はレプリケーションによる冗長化、AWSの場合はRDSを使用することが増えています。
アクセス用のIPアドレス (VIP, Virtual IP Address) は1つ、ある程度の規模にならない限り slave は使用しません。アプリケーションからの接続は read/write の2つ持っておき、後で分散できる状態にしておきます。

ログ分析・監視

nginx のアクセスログや、アプリケーションから吐かれた行動ログなどは、fluentd を通して Kibana, Mackerel, MongoDB などの社内ログ基盤に流し込まれます。そこからKibana でのリアルタイム分析や、Mackerelでレイテンシなどの可視化を行っています。Mackerel での可視化に関してはこちらの記事 に詳しいです。
監視やメトリックは Mackerel 上に整備していきます。使用するプラグインは mackerel-agent-plugins へもフィードバックしています。ご活用ください。

まとめ

はてなの新サービスにおける最小構成をご紹介しました。この構成に加え、必要な場合はKVSやキャッシュなどを導入していきます。
特にはてなのWebサービスは、ソーシャルゲーム等に比べてバーストの幅が小さいものの、サービスの数が多く、それぞれの息が長いという特徴があります。最新の技術を取り入れつつ、小規模なうちから将来にわたるスケーラビリティと保守性をある程度確保した状態で素早く提供できるよう心がけています。
大規模サービスの構成と考え方については id:y_uuki が詳細に書いてくれていますのでこちらもご参照ください。
はてなで大規模サービスのインフラを学んだ - ゆううきブログ

はてなでは新規サービスをどんどん作っていきたいエンジニアを募集しています。

明日は id:t_kyt さんです。