Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

はてなのサービスの開発環境

835 views

Published on

2015/02/07 Hatena Enginner Seminar #4

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

はてなのサービスの開発環境

  1. 1. はてなのサービスの開発環境 2014/02/07 Hatena Engineer Seminar #4 id:astj
  2. 2. アジェンダ • 自己紹介 • 開発環境の整備 • はてなブックマーク - vagrant • はてなブログ - plackup • Conclusion
  3. 3. id:astj github: astj /Twitter: @ast_j
  4. 4. はてなサマーインターン2013 はてな新卒エンジニア(2014/04入社) はてなブログ(とか)担当 ブックマーク => ガールズ => ブログ => …
  5. 5. and more… BrandSafeはてな
  6. 6. • Perl / Elasticsearch / JavaScript • ブックマーク 開発環境のメンテナンス(vagrant etc.) • B!KUMA メインエンジニア (~2015/01) • http://bkuma.hatena.ne.jp/
  7. 7. LET'STALK ! • はてなのエンジニア生活 • 1年目いろいろ 懇親会でぜひ
  8. 8. はてなのサービスの開発環境
  9. 9. Hatena Engineer Seminar #2 https://speakerdeck.com/aereal/vagrant-to-chef-detukuruhatenabutukumakufalsekai-fa-huan-jing
  10. 10. 開発環境
  11. 11. • サーバを起動し動作確認・開発 • デザイナーの手元にも整備 • テストコードの実行環境 • (調査スクリプトなどの動作環境) • (less, typescript などの自動コンパイル)
  12. 12. • 開発者のマシン上で直接実行 • plenv, carton... • 環境を仮想マシン内に構築 • Vagrant • 複雑/レガシーな環境への対応性 • パフォーマンスオーバーヘッド
  13. 13. • Vagrantによる複雑/レガシーな環境の仮想化 • はてなブックマーク • ホストマシン上で直接動作する環境 • はてなブログ
  14. 14. はてなブックマーク
  15. 15. Hatena Engineer Seminar #2 https://speakerdeck.com/aereal/vagrant-to-chef-detukuruhatenabutukumakufalsekai-fa-huan-jing
  16. 16. はてなブックマーク • サービス開始(2005/02) • リニューアル(2008/11)
  17. 17. 関連サービス BrandSafeはてな
  18. 18. 関連サービス BrandSafe一部のコードがブックマーク内に共存
  19. 19. はてなブックマーク • perl 5.8.8 • Ridge(自社製WAF) • MoCo(自社製ORM) • apache mod_perl2
  20. 20. はてなブックマーク • TypeScript (部分的) • less (部分的) gulp ...=>grunt=>gulp
  21. 21. はてなブックマーク • apache + nginx • MySQL • memcached • Elasticsearch (2014/06~) • (内製サブシステム)
  22. 22. 本番サーバ構成 • CentOS • chef • rpm • 社内でrpmをビルド・ホスティング • CPAN モジュール • etc...
  23. 23. PRODUCTION mod_perl MySQL memcached (misc subsystems)Elasticsearch worker 本番サーバ構成 nginx proxyapache proxy
  24. 24. 開発環境
  25. 25. • "コマンド一発で環境が立ち上がる" • gulp, アプリケーション, memcached, ... • 複数のプロセスをProcletで管理 • "foreman for perl"
  26. 26. my $proclet = Proclet->new(! color => $opts->{color},! );! ! $proclet->service(! tag => 'app',! code => sub {! Ridge::Daemon->run('Hatena::Bookmark', +{! root => $RootDir,! port => $opts->{port},! fast => $opts->{fast},! verbose => $opts->{verbose},! reboot_on_reload => $opts->{reboot},! });! },! );! ! $proclet->service(! tag => 'gulp',! code => sub {! exec qw(script/tools/node node_modules/.bin/gulp devel);! },! );! ! $proclet->run;
  27. 27. BUT...
  28. 28. • CPAN モジュールの複雑な依存関係 • cpanm --installdepsだけで わない • 古いCPANモジュールを使い続ける必要性 • 多様な手元環境 • OS X,Windows, Linux(Debian)...
  29. 29. cpanm trouble!! • cpanm --installdepsではうまく依存管理できない • テストが落ちることが分かっているモジュール • 厳密にバージョンロックできない • Carton導入? • もうCPANにない古いモジュール • 本番では使わない
  30. 30. 仮想マシン化・プログラマブルなセットアップ
  31. 31. • VM(など)による仮想環境の構築 • VirtualBox (,VMWare, Docker...) • Chef でプログラマブルなセットアップ • "秘伝のVMイメージ"の回避へ
  32. 32. Vagrant box Ubuntu cloud images http://cloud-images.ubuntu.com ! • Vagrant ready・信頼性 • 必然的にaptベースの構成管理
  33. 33. Chef cookbook ミドルウェアの導入 perlのビルド cpanモジュールの導入
  34. 34. cpanm trouble!! • cpanm --installdepsではうまく依存管理できない • テストが落ちることが分かっているモジュール • 厳密にバージョンロックできない • Carton導入? • もうCPANにない古いモジュール • 本番では使わない 再掲
  35. 35. cpanm Workaround backpanにしかないモジュールを先に入れる cpanm --installdepsで大まかに える 厳密にバージョンロックするモジュールは後から
  36. 36. cpanm Workaround backpanにしかないモジュールを先に入れる cpanm --installdepsで大まかに える 厳密にバージョンロックするモジュールは後から
  37. 37. セットアップ&起動 $ git clone git://HOGE/dev-Hatena-Bookmark.box $ ./bin/server $ vagrant up $ vagrant ssh script/bookmark.up
  38. 38. セットアップ&起動 $ git clone git://HOGE/dev-Hatena-Bookmark.box $ ./bin/server $ vagrant up $ vagrant ssh script/bookmark.up less/ts コンパイル (gulp) nginx proxy (一部/後述) アプリケーションプロセス
  39. 39. セットアップ&起動 $ git clone git://HOGE/dev-Hatena-Bookmark.box $ ./bin/server $ vagrant up $ vagrant ssh script/bookmark.up less/ts コンパイル (gulp) nginx proxy (一部/後述) アプリケーションプロセス Proclet
  40. 40. app MySQLmemcached (misc subsystems) Elasticsearch (worker) ローカル環境 nginx proxy Ubuntu 開発用サーバ
  41. 41. app MySQL memcached (misc subsystems)Elasticsearch (worker) nginx proxy PRODUCTION MySQL memcached (misc subsystems)Elasticsearch worker nginx proxy 開発用サーバ LOCAL app apache proxy
  42. 42. app MySQL Elasticsearch (worker) テストの実行 Ubuntu
  43. 43. Vagrant導入その後
  44. 44. "放っておくと壊れる"
  45. 45. • 古いUbuntu向けのaptリポジトリ提供終了 • "apt-getできずミドルウェアが入らない" • Ubuntu base boxのバージョンを上げる • CPANモジュールの非互換変更 • バージョン固定リストに追加
  46. 46. 本番と別個に構成管理するコスト
  47. 47. PRODUCTION LOCAL Distribution CentOS Ubuntu Provisioning chef (by op.) chef (by dev.) Package sys. yum apt CPAN module rpm (by op.) (direct)
  48. 48. PRODUCTION LOCAL Distribution CentOS CentOS ? Provisioning chef (by op.) chef (by dev.) Package sys. yum yum CPAN module rpm (by op.) rpm (by op.)
  49. 49. • chef official な CentOS base box の利用 • https://github.com/chef/bento • 社内 rpm サーバの利用 • cookbook の部分共用 • まずはコピペから
  50. 50. 他アプリケーションで試験導入
  51. 51. その後停滞中...
  52. 52. nginx proxy http://b.hatena.ne.jp/XXX http://bkuma.hatena.ne.jp/YYY PRODUCTION apache proxy application /-/HOGE/YYY/XXXX
  53. 53. http://local.hatena.ne.jp:3000/XXX http://local.hatena.ne.jp:3000/-/HOGE/YYY LOCAL (before) /-/HOGE/YYY/XXXX application
  54. 54. http://local.hatena.ne.jp:3000/-/HOGE/YYY
  55. 55. ローカルだとどのURL? URLこれでいいのかわからん 共用エンドポイントうまく動かない LOCAL (before)
  56. 56. nginx proxy http://local.hatena.ne.jp:3000/XXX http://local.hatena.ne.jp:3200/YYY /-/HOGE/YYY/XXXX LOCAL (after) application
  57. 57. LOCAL (after) :smile:
  58. 58. • 手元マシンを選ばない環境構築の実現 • 本番の環境に近づける • 継続的なメンテナンスの必要性 • 本番環境との一部構成共通化に期待 • あるいはアーキテクチャ自体の刷新...
  59. 59. • 招待ベータリリース(2011/11) • オープンベータ(2011/12) • 正式リリース(2013/01)
  60. 60. http://hatenablog.com/ http://blog.hatena.ne.jp/ http://YOU.hatenablog.com/ マルチドメイン
  61. 61. • perl 5.14.2 • ぼくのかんがえたさいこうのフレームワーク • plack (Starlet + Start::Server) • Carton • less (grunt)
  62. 62. • nginx (+ aws ELB) • MySQL 5.5 • Solr • memcached • redis
  63. 63. PRODUCTION nginx proxy plack app MySQL memcached redis solr worker DNS
  64. 64. nginx proxy plack app MySQL memcached redis solr worker PRODUCTION plack app MySQL memcached redis (no solr) worker LOCAL DNS nginx proxy DNS NO VM
  65. 65. $ brew install mysql55 redis nginx phantomjs casperjs… $ script/setup セットアップ $ carton install $ mysql < db/schema.sql ...
  66. 66. $ carton exec -- script/epicup Proclet plackup, nginx, dns, worker, redis, grunt...
  67. 67. http://hatenablog.com/ http://blog.hatena.ne.jp/ http://YOU.hatenablog.com/ http://e.local.hatena.com/ http://local.hatena.ne.jp/ http://YOU.e.local.hatena.com/
  68. 68. • "/etc/hosts にこれ書いて"でよいのか? • 動的に複数のドメインの展開 • Net::DNS::Nameserver • /etc/resolver/
  69. 69. plack app MySQL memcached redis (no solr) worker nginx proxy (no DNS) Module Module Module Module Module Module JavaScript 必要なコンポーネントを用いてテスト $ carton exec -- prove -lvr t/
  70. 70. • 今のところうまくいっている • 導入するミドルウェアのバージョン?
  71. 71. Conclusion • VMに依存しない環境志向 • 複雑度によってはVMによる手間の削減 • 複雑度の完全な封じ込みは未達成
  72. 72. Thanx!

×