メルカリに入社して1年経った
昨年の秋にメルカリに入社してから1年経った。今となってはこういう時ぐらいしかブログ書かないだろうし、 せっかくなので入社後1年間でやってきたことをざっくばらんにまとめてみる。
Ansibleのplaybookを書き続ける日々
メルカリで一番書いた量が多いのはYAML・・・もといAnsibleのplaybookだ。二番目がnginx.conf、三番目がtd-agent.confだ・・・多分。以下はplaybookのコミットグラフ。
nginx
メルカリではnginxを多用している。以下その例。
- ZabbixやRedmine、APIのためのリバースプロキシ
- APIエンドポイントのためのTLSターミネーションおよびSPDYゲートウェイ
- L7ロードバランサー(API、検索、プッシュ)
- コンテンツキャッシュ(CSS、JS、検索レスポンス)
- ログ分析基盤用フロントエンド(OpenResty)
- ngx_dynamic_upstreamによるゼロダウンタイムデプロイ
なお、入社した日にはnginxのサーバはまだ1台もなくてちょうど隣の席のエンジニアが APIサーバ群のためのL7ロードバランサーとしてnginxを投入しようとしているところだった。 現在は至る所でnginxが稼働している。
Go
メルカリの主要言語は今でもPHPだが、インフラチームではGoやNode.js、Perlも利用している。 Goは主に自分が書いていて最近書く人が一人増えた。この1年でメルカリのプロダクションに投入したGoプログラムでOSSのものを列挙してみる。
- nginx-build〜nginxのビルドツール〜
- cachectl〜OSのページキャッシュ制御デーモン〜
- slackboard〜Slackプロキシ〜
- gaurun〜プッシュ通知プロキシ〜
エンジニアブログで実際の活用事例について書いている。
tech.mercari.com tech.mercari.com tech.mercari.com tech.mercari.com
あと、最近だとPHPのジョブワーカーの一部をGoで書き直すプロジェクトが進行している。
ゼロダウンタイムデプロイの実現
よく知られているようにダウンタイムなしでWebアプリケーションをデプロイするのは意外と面倒で難しい。 メルカリのデプロイはただのrsyncだが、各サーバへのrsyncの前後でngx_dynamic_upstreamを利用して rsync対象のサーバをロードバランサーから動的に取り外しおよび復帰させることでダウンタイムなしでデプロイできるようにした。
ちなみに実際の仕組みの導入自体はほぼ@kazeburoさんがやった。 そのうちMercari Engineering Blogで取り上げられるかもしれない。
ログ分析基盤
メルカリではログ転送にFluentdを利用していてこのあたりも今は自分がメインでやってる。
メルカリに入社する以前は本格的にFluentdを利用したことがなかったので結構苦労したけど、大分慣れてきて今は自分でプラグインを書いたりもしている。
先月は社内用のOutputプラグインをFilterプラグインで書き換えて遊んでいたチューニングしていた。
また、社内でPascalと呼ばれているログ分析基盤の構築と運用もやってる。
フロントエンドはngx_luaで開発している。
PHP5.3から5.6への移行
メルカリのAPIサーバはPHPで書かれている。長らく5.3を使っていたが今年になってようやく5.6に移行した。 某イラストSNSのインフラチームにいた頃にPHP5.2 -> 5.3 -> 5.5と2回大きなアップデートをメインで担当したので実務でのPHPの大型アップデートはこれで3回目になる。
PHP5.3 -> PHP5.6(左:メモリ、右:レスポンスタイム) pic.twitter.com/y9jPLW9kvx
— bokko (@cubicdaiya) July 31, 2015
来年は多分PHP7の作業が待っている。
会社の技術広報活動
メルカリではエンジニアを絶賛募集中なので宣伝も兼ねて各所でスピーカーとして登壇した。
- 1000万ダウンロードアプリ『メルカリ』を支える技術
- High Performance Backend For Mercari
- 実践nginx〜メルカリの場合〜
- Gaurun / A general push notification server in Go
- Practical nginx module development〜C and Lua〜
- etc...
まとめ
昨年は色々とあって辛い時期もあったけど、今は元気です。あと重要なことなのでもう一度言うとメルカリではエンジニアを絶賛募集中です。