この記事はモバイルファクトリー Advent Calendar 2018の22日目のものです。 このブログではお初にお目にかかります。インフラチームのid:masasuzです。
モバイルファクトリーでは現在AWSと物理データセンターを使用しています。 モバイルファクトリーではもともと物理データセンター使用しており、既存のサービスはその上で構築されております。 数年前からAWSを本格的に利用し始めて新規のサービスは基本的にAWSで構築します。 AWSで構築されたサービスは要件によって様々なアーキテクチャになっています。
今回はある程度共通化されている物理データセンターにあるサービスのインフラアーキテクチャについて述べていきます。
アーキテクチャ
- リバースプロキシ
- Nginx
- アプリケーションサーバ
- Plack/PSGIサーバ(Starlet, Gazelle) + Server::Starter
- 静的コンテンツサーバ
- Nginx + CDN
- Amazon S3
- ストレージサーバ
- MySQL(or Percona Server)
- Redis
- キャッシュサーバ
- Memcached
- Redis
- ジョブキューサーバ
- Gearman
- Qudo
- Resque
個々のミドルウェアは置いておいて、構成としては特別なものを使っていないと思います。 モバイルファクトリーとして特色のあるアプレケーションサーバに関して少しだけ詳しく述べたいと思います。
サーバ全般
サーバOSはLinuxを使っており、ディストリビューションとしてはUbuntu Serverを使用しています。かつてはDebianを使用していましたが、全て置き換えられています。 ミドルウェアは可能な限り標準のインストールで入るものを使用します。
標準でパッケージが用意されていない場合はdebパッケージを作成して、社内のaptサーバからインストールできるようにしています。 サーバ構築毎にビルドするということはしないようにしています。
つまり何かインストールするときは基本的にaptitude install
ないしapt-get install
ですむようになってます。
Perl
モバイルファクトリー で作られているプロダクトは最近は別として、ここ10年くらいはPerlで書かれています。
かつてはOS標準についてくるSystem Perlを利用していましたが、
- OSアップグレードのたびにバージョン変わるのはつらい
- 新しいバージョンのPerlを使いたい
などの理由で、独自にパッケージングしたperlを使うようにしています。
mf-perl5.xx
の名前でパッケージングしてプロジェクト側で使いたいバージョンのperlを選択できるようにしています。
Perlモジュール
Perlモジュールのバージョン管理に関しては、cpanfile.snapshotを元にcarton install --deployment
でインストールすることにより、
依存パッケージも含めて同じバージョンのPerlモジュールがインストールされるようになっています。
基本的には公開されているCPANのモジュールを使うようにしていますし、それが推奨されてますが、 社外に公開できないロジックが含まれていたりするものに関してはdarkpan(プライベートなCPANレポジトリ)を立ててそこからインストールするようにしています。
アプリケーションサーバ
かつてはApache + mod_perlで動いていましたが、公開されているサービスは全てPlack/PSGIに置き換えられています
アプリケーションサーバのデーモン管理にSystemdを利用しています。これもOS標準の起動方法に合わせるためです。 Start::Server経由でPlack/PSGIサーバを起動することにより、ホットデプロイできるようにしています。
アプリケーションサーバとしては主にStarletを使っていますが、新しめのプロジェクトではGazelleも使われています。
WebフレームワークとしてはSledge、Splite、Amon2が使われています。SpliteはPSGI対応したSledge風のフレームワークです。 社内独自フレームワークです。 SledgeやSpliteは長めに運営されているサービスで使われており、現在では新規でPerlのプロジェクトを作る場合は、Amon2が使われております。
結びに
モバイルファクトリーで主に使われているアーキテクチャについてざっくりと書いてきました。これは現在の姿で、課題があれば日々変化していっています。 一昔前であれば、デーモン管理はUpstartを使っていましたし、リバースプロキシはPerlbalを使っていました。 長年運営しているサービスもあるので、ドラスティックに変更はできませんが、少しずつよりよい形に改善していってます。
また、冒頭で述べたように新規のサービスではAWSで構築することが多く、AWSに合わせたアーキテクチャを構築しています。 これに関してはどこか別のところで述べられたらと思います。
また、今回はざっくりでしたが、掘り下げて知りたいこと等ありましたら、またどこかの機会で述べたいと思います。
明日は、id:yumlonne さんです。