ちわす。11月にサーバサイドエンジニアとしてジョインした佐野です。前職ではウェブサービスやソーシャルゲームのサーバ管理、DBA、運用ツール開発など主にインフラ面を担当していました。入社一ヶ月のペーペーでございます。
「ブログ書けやー」とのお達しが出たのですが、ノリがイマイチわからんので、軽い記事(恵比寿のメシと酒)と真面目な記事(トレタのシステム)を両方書きます。真面目な話の合間にメシの話でもしながら...。真面目な記事はエンジニア職向けの内容になります。 ではよろしくお願いします。
トレタのシステムアーキテクチャ
現時点でのシステム構成は次のようになっています。 画像の画質がアレなのでクリックして拡大していただけると...。
トレタのシステムは種々のクラウドサービスで成り立っています。この一ヶ月で僕がシステムに手を加えた部分としては、監視周りの整備(Pingdom, PagerDuty導入, 監視用hubotを書く)、ログ解析基盤の構築(fluentd -> BigQuery連携)、ちょっとした負荷分散(リバースプロキシを少々)をやったのですが、安定稼働のためには、さらに継続的に改善をしていく必要があります。
以下、それぞれの構成要素について簡単に解説します。
kintan(焼肉)
http://www.ebisu-yakiniku-kintan.com/
kintanさんはトレタを導入していただいているお客様でもあります。肉がうまいのでご飯何杯でもイケる。サラダもおかわりOK。デザートもついてくる。昼メシしか食ったことないんだけど、夜も行ってみたいっす。
EngineYard
サーバサイドの機能はEngineYardで稼働しています。構成は至って簡単で、ウェブアプリケーション、DB、非同期に動作するワーカーが存在していて、これらがクライアント(PC, iPad)からのリクエストを受付、メール/FAX/SMS配信のために各種外部サービスと連携しています。
デプロイやプロビジョニング(chef)にはEngineYardに搭載されている機能を使っていて、EngineYard提供のeyコマンド、EngineYardコンソールなどから行っています。
たとえばプロビジョニングは、
bundle exec ey recipes upload
bundle exec ey recipes apply
でできます。EngineYardはトレタに入社して初めて使ったのですが、中の人のサポートも手厚く、インスタンスの複製、プロビジョニング、デプロイが比較的簡単にできます。他にもDBのバックアップやインスタンスのスナップショットを作成する機能も付いています。また、後述しますが、NewRelicなど有用なアドオンが提供されており、我々の環境ではインスタンスを構築すると自動でNewRelicにインスタンスが登録されてモニタリングができるようになっています。この規模のウェブサービスではかなり有用なんじゃないかという所感です。
エビス新東記(シンガポール料理)
http://tabelog.com/tokyo/A1303/A130302/13020059/
恵比寿はうまそうなメシ屋(どこもちょっと値段は高め)が多く目移りしてしまう。この一ヶ月で確実にデブった。ここも昼に行った。海南鶏飯(チキンライス)がうまかったです。大盛りにしたら結構な量がきたw
AWS(Amazon Web Services)
Route53、SES、S3を使っています。主に下記のような用途。
びるまの竪琴(ミャンマー料理)
http://tabelog.com/tokyo/A1303/A130302/13004459/
エスニックな食いもんが好きな同僚や友人達と行ってきた。ミャンマーのビール、シンハー(タイ)やサンミゲル(フィリピン)のビールもある。料理の味は濃いめなので薄味のビールと合うわー。食い散らかしたあとの画像しか残ってなかった...。
GCP(Google Cloud Platform)
fluentdからBigQueryへのログ転送を行っていて、ログ解析、ログ監視(hubotで監視。後述。)などの用途で使っています。ちょっとした工夫としては月別のログ格納用テーブルを作成し、月ごとにログを挿入するテーブルを分けています。巨大なテーブルへのスキャンはコストもかかるので。
ホルモン焼 婁熊東京(ホルモン焼肉)
http://tabelog.com/tokyo/A1303/A130302/13132685/
ホルモンの刺身の盛り合わせと日本酒がうまかった。酒飲みにはたまらない。また行きたい。
Monitoring
監視はNewRelic, Pingdom, PagerDuty、それと図には書いていませんが、EngineYardのアラートシステム(MySQLプロセスダウンやレプリケーション遅延などクリティカルなものをデフォルトでメール通知してくれる)を使っています。それぞれが重要度に応じて、メール、Slack、電話に通知を行います。Slackの通知部屋には営業さんも入っていただいて、緊急時には即座にお客様に対応できるような体制を敷いています。
NewRelicはリソース監視として使っています。EngineYardのアドオンとして提供されており全インスタンスに仕込まれています。
Pingdomはサービスのエンドポイントを監視しています。http, https, Route53, SES, FAX, SMS, Zendesk...と、自分たちのシステムに加えて連携先システムのエンドポイントの監視もしています。連携先がダウンしている場合、先方から連絡がくる手はずになってはいるのですが、システム化しておくといち早く異変に気づくことができます。
PagerDutyは電話、メール、slackなどへの連携が可能な通知サービス。今は電話用途のみで、緊急度の高いものはPagerDutyに飛ばして、電話で担当者(大抵俺)を叩き起こすようにしています。
余談その1、通知系は全部PagerDutyに集める方がきれいかなー?と思ったり、また本当に電話通知必要かな?とも思ったりしている。監視周りはババッと使えるものを使って一気に構築してしまったのでちゃんと整理していこうと思っています。
余談その2、多数のサービスを活用すると、ちょっとサービスとそのアカウントの管理が煩雑になってくるなーと感じています。なので、上述したように本当に必要なのか?を吟味して、減らせるものは減らしてシステムをシンプルに保ちたいですね。あとは、https://www.onelogin.com/ みたいなシングルサインオンサービスもあるのでアカウント管理をそこに集約するのもありかもしれない。oneloginはいずれ試すつもりです。
タイーム(イスラエル料理)
http://www.ta-imebisu.com/
ここは行ったことないんだが、是非行きたい。前職の有給消化を使ってイスラエルとヨルダンに行ってきたんだけど、そんときはシュワルマ(ケバブに近い。ファーストフードですね。)ばっか食ってたので本格的なイスラエル料理にありつけなかった。ていうか今度行く。
最後に
各職種ともに人手が足りない...!募集してます。
エンジニア(iOS、サーバサイド、フロントエンド)
EngineYard
サーバサイドの機能はEngineYardで稼働しています。構成は至って簡単で、ウェブアプリケーション、DB、非同期に動作するワーカーが存在していて、これらがクライアント(PC, iPad)からのリクエストを受付、メール/FAX/SMS配信のために各種外部サービスと連携しています。
デプロイやプロビジョニング(chef)にはEngineYardに搭載されている機能を使っていて、EngineYard提供のeyコマンド、EngineYardコンソールなどから行っています。
たとえばプロビジョニングは、
bundle exec ey recipes upload
bundle exec ey recipes apply
でできます。EngineYardはトレタに入社して初めて使ったのですが、中の人のサポートも手厚く、インスタンスの複製、プロビジョニング、デプロイが比較的簡単にできます。他にもDBのバックアップやインスタンスのスナップショットを作成する機能も付いています。また、後述しますが、NewRelicなど有用なアドオンが提供されており、我々の環境ではインスタンスを構築すると自動でNewRelicにインスタンスが登録されてモニタリングができるようになっています。この規模のウェブサービスではかなり有用なんじゃないかという所感です。
エビス新東記(シンガポール料理)
http://tabelog.com/tokyo/A1303/A130302/13020059/
恵比寿はうまそうなメシ屋(どこもちょっと値段は高め)が多く目移りしてしまう。この一ヶ月で確実にデブった。ここも昼に行った。海南鶏飯(チキンライス)がうまかったです。大盛りにしたら結構な量がきたw
AWS(Amazon Web Services)
Route53、SES、S3を使っています。主に下記のような用途。
- Route53: DNSとして(当たり前ですがw)
- SES: workerからのメール送信に利用しています。
- S3: クライアントの音声、画像、開発環境用vagrantbox、ログ(Glacierにアーカイブ)など種々のデータの格納に使っています。 EngineYardがやってくれるDBのバックアップ(正体はmysqldump)もS3にアップロードされています。
http://tabelog.com/tokyo/A1303/A130302/13004459/
エスニックな食いもんが好きな同僚や友人達と行ってきた。ミャンマーのビール、シンハー(タイ)やサンミゲル(フィリピン)のビールもある。料理の味は濃いめなので薄味のビールと合うわー。食い散らかしたあとの画像しか残ってなかった...。
GCP(Google Cloud Platform)
fluentdからBigQueryへのログ転送を行っていて、ログ解析、ログ監視(hubotで監視。後述。)などの用途で使っています。ちょっとした工夫としては月別のログ格納用テーブルを作成し、月ごとにログを挿入するテーブルを分けています。巨大なテーブルへのスキャンはコストもかかるので。
ソウルドレッシング(鉄板焼き)
http://souldressing.jp/
オフィスから比較的近場にある鉄板焼きやさんで、昼はハンバーガーが食える。写真はアボカドバーガー。うまい。俺、実は日本で1000円を超えるハンバーガー食ったのはここが初めて。他にもブラッカウズってハンバーガー屋さんもあるんですが、写真を撮ったこっちを紹介させていただきます...。
Heroku
日報など一部の社内システムや、開発用のダミーサーバー、hubotを動かしています。slack上にbotはいくつかいるのですが、僕が書いたものとしてはログ監視、レスポンスタイム監視をするものがいます。
定期的にBigQueryのログ格納用テーブルをスキャンして、一定時間内にHTTP 500などエラーを示すものが閾値を超えているとslackに通知するようにしています。レスポンスタイム監視は、HubotからNewRelicのAPI経由でレスポンスタイムを抜いて、閾値を超えると同じくslackに通知するようにしています(pingdomのAPI経由でもいいのですが、pingdomの拠点が日本にないので閾値がうまく決められない。)。
オフィスから比較的近場にある鉄板焼きやさんで、昼はハンバーガーが食える。写真はアボカドバーガー。うまい。俺、実は日本で1000円を超えるハンバーガー食ったのはここが初めて。他にもブラッカウズってハンバーガー屋さんもあるんですが、写真を撮ったこっちを紹介させていただきます...。
Heroku
日報など一部の社内システムや、開発用のダミーサーバー、hubotを動かしています。slack上にbotはいくつかいるのですが、僕が書いたものとしてはログ監視、レスポンスタイム監視をするものがいます。
定期的にBigQueryのログ格納用テーブルをスキャンして、一定時間内にHTTP 500などエラーを示すものが閾値を超えているとslackに通知するようにしています。レスポンスタイム監視は、HubotからNewRelicのAPI経由でレスポンスタイムを抜いて、閾値を超えると同じくslackに通知するようにしています(pingdomのAPI経由でもいいのですが、pingdomの拠点が日本にないので閾値がうまく決められない。)。
ホルモン焼 婁熊東京(ホルモン焼肉)
http://tabelog.com/tokyo/A1303/A130302/13132685/
ホルモンの刺身の盛り合わせと日本酒がうまかった。酒飲みにはたまらない。また行きたい。
Monitoring
監視はNewRelic, Pingdom, PagerDuty、それと図には書いていませんが、EngineYardのアラートシステム(MySQLプロセスダウンやレプリケーション遅延などクリティカルなものをデフォルトでメール通知してくれる)を使っています。それぞれが重要度に応じて、メール、Slack、電話に通知を行います。Slackの通知部屋には営業さんも入っていただいて、緊急時には即座にお客様に対応できるような体制を敷いています。
NewRelicはリソース監視として使っています。EngineYardのアドオンとして提供されており全インスタンスに仕込まれています。
Pingdomはサービスのエンドポイントを監視しています。http, https, Route53, SES, FAX, SMS, Zendesk...と、自分たちのシステムに加えて連携先システムのエンドポイントの監視もしています。連携先がダウンしている場合、先方から連絡がくる手はずになってはいるのですが、システム化しておくといち早く異変に気づくことができます。
PagerDutyは電話、メール、slackなどへの連携が可能な通知サービス。今は電話用途のみで、緊急度の高いものはPagerDutyに飛ばして、電話で担当者(大抵俺)を叩き起こすようにしています。
余談その1、通知系は全部PagerDutyに集める方がきれいかなー?と思ったり、また本当に電話通知必要かな?とも思ったりしている。監視周りはババッと使えるものを使って一気に構築してしまったのでちゃんと整理していこうと思っています。
余談その2、多数のサービスを活用すると、ちょっとサービスとそのアカウントの管理が煩雑になってくるなーと感じています。なので、上述したように本当に必要なのか?を吟味して、減らせるものは減らしてシステムをシンプルに保ちたいですね。あとは、https://www.onelogin.com/ みたいなシングルサインオンサービスもあるのでアカウント管理をそこに集約するのもありかもしれない。oneloginはいずれ試すつもりです。
タイーム(イスラエル料理)
http://www.ta-imebisu.com/
ここは行ったことないんだが、是非行きたい。前職の有給消化を使ってイスラエルとヨルダンに行ってきたんだけど、そんときはシュワルマ(ケバブに近い。ファーストフードですね。)ばっか食ってたので本格的なイスラエル料理にありつけなかった。ていうか今度行く。
最後に
各職種ともに人手が足りない...!募集してます。
エンジニア(iOS、サーバサイド、フロントエンド)
コメント