BPStudy#81(HHVM Hack/CoreOS)に参加してきた #bpstudy

BPStudy#81(HHVM Hack/CoreOS)に参加してきた #bpstudy

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
BPStudy、初参加してきました! 株式会社 Abbyのお二人のとんがったお話を聞いてきました。
メモ書き残しておきます。

HHVM Hack @yone098さん


  • 自己紹介
  • 社員募集中!
  • アジェンダ
    • Hackについて、HHVMについて
    • ツールの紹介
    • Webアプリのハマりどころ
    • パフォーマンス
    • HHVMのエクステンション 既存C++資産の流用
    • PHPからの移行
  • HackとはFB開発のPHP互換言語
    • FBはPHP→Hackに移行済み
  • HHVMとは
    • C++で実装されたJITコンパイラによるPHP実行環境
    • 3.xが3月にリリースされた
      • FCGIでnginx/Apacheと組み合わせ
      • 2.xは組み込みのWebサーバーだった。
  • Hackの特徴

    • 静的型付け
      public int i = 10;
      とか書ける
    • Nullable
      NULLの許容/拒否が選択できる
    • Generics
      Map Collectionなんかに使う。C++まんま。
    • Type Alias
      既存の型に別名をつける。シノニム?
      関数の引数を型強制できる。
      例 : type user_id = int;
    • 可変長引数 ...と明示。
  • 勉強会的には、Tools紹介を推したい!かしこいツールばかりでお奨め
    • デバッガ優秀。デモ…ダメぽ。

      • hhvm -m debug <ファイル名>
      • breakpoint
      • ステップ実行
      • 変数参照
      • gdbライク
      • デバッガはCLI実行だけじゃない!variable(Web application)で$_*も表示できる!
    • 実行時エラーは辛い…
      • hh_clientで構文チェック!
      • アプリのルートでtouch .hhconfigすると配下のPHPがチェック対象に。
      • .hhconfigがないとエラーに。
      • 例えば、戻り値がintなのにreturn <string>;とかやってるとチェックしてくれる!
    • fastcgi
      • nginx/apache向けコンフィグ生成を自動でやってくれる!(2個くらい前のバージョンから)install_fastcgi.sh
  • HackでWebApplicationを作ってみた
    • HHVMで動作しているかチェック!→ phpinfoの画面にはHipHopとだけ表示される

      • fastcgiとかダメだと503になりやす。
    • 2系から3系で設定の書き方がガラリと変わった(以前はJSON、今後はini形式のみに一本化)
      • include_pathがどうやっても効かなかった…
      • 今はini_setで毎回指定している。
    • HTML埋め込みの<?php 〜 ?>は、<?hh 〜 ?>に代替できない。動かない。
    • パフォーマンス
      • 100万回のループ2回だと、hhvmはphpの10倍!
      • 体感で2〜3倍。本家にある20〜30倍は再現できず。
  • HHVM Extension
    • C++のライブラリをHHVMで動かす!
    • 本家サンプルは動かなかった… → プルリクが発行されて、修正中らしい。
    • 手順自体はわかればシンプル。
    • 速い!
  • PHPからのマイグレーション
    • Hackへの移行ではなく、PHPのコードはそのまま、HHVMに切り替えるだけでパフォーマンスアップ!
    • Hackに移行する場合は、出てきたチェックポイントでリファクタリング
    • <?php<?hh
    • 引数・戻り値の型付け
    • null許容の戻り値の関数には?をつける
    • Collectionを積極採用
    • hh_clientでがんばってチェック!
      • 規模があると大変そう。
      • 事例があると嬉しい。
  • まとめ
    • Hackは使わなくてもいい。
    • HHVMはお奨め。FBで実績があるし、速さというメリットを享受できる。
    • 3年後にはPHPが無くなり、HHVMに移るのでは。Apache→nginxへの移り変わりに似ている。
  • 一句

CoreOS入門 @mopemopeさん


  • 自己紹介
  • 宣伝 Docker本 : 興味あればどうぞ!
  • 今日はCoreOS!
    • Alex Polvi(元Rackspace Inc)/CoreOS Incが開発
    • Googleなどを参考に。
    • カーネルコミッターのGreg KHさんも参加!
    • オフィスはガレージ!半年くらい前の話(WIREDで話題に。)
    • 開発はOSXらしい。
  • Core OS
    • コンテナ+クラスタ!!あとはQiita見てください!
    • バージョンは、日数らしい。324.2.0→324が日付
    • デフォルトで、ブートするとコンソールログイン不可、SSHのみ。
    • パッケージマネージャなし。root partition書き込み不可なので、ソフトウェア追加も無理。
      • /etc、/mediaはOK
    • update_engine
      • alpha/betaの2チャンネル。あとtest, productionの4つを予定
      • アップデートはroot partitionの載せ替え
      • /dev/vda9/dev/vda4で交互に。
    • Docker
      • アプリはぜーんぶDockerコンテナで。
      • ホストOSとの分離、ポータビリティ
      • オーケストレーション(コンテナ間通信)にetcd
        • 低レイヤーなので、もうちょっと高レイヤーのツールを使うことになる?confdあたりを最近よく聞く。
    • etcd
      • Raft
    • fleet = etcd + systemd + job scheduling
      • 障害を検知して、他の健全なホストにコンテナをフェイルオーバー
      • ログはjournald。
  • 構成要素
    • coreos-cloudinit
    • etcd
    • fleet
    • locksmith
    • 全部Go。サイズちっさいし、1バイナリに入るのでライブラリ管理フリー。
  • CoreOS-CloudInit
    • コンフィグはここに突っ込むべし。

      • cloud-config.yml
    • 独自サービスの追加
    • 外部デバイス
      • config-drive
    • 設定できる項目
      • 例を紹介
      • private_ipv4 / public_ipv4 の使い分けMulti-AZやMulti Cloud(AWS-GCEとか)
      • write_filesには、ネットワーク設定などとか
  • Etcd
    • CASサポート : Atomicに操作。ロックなしになる方向
    • Clusterを簡単に構成する仕組み。Discovery
    • Raft : コンセンサスアルゴリズム
      • 民主的(Vote)
      • リーダーのElection
      • 説明サイトがあるので、スライド作るのを止めた。
      • ランダムなElection Timeoutが切れると立候補。
      • Term : 任期、代
      • 「俺リーダー、俺リーダー」
      • リーダーお亡くなりに。
      • 別の立候補で2代目総長に。
      • メンバーが増えると、同時期に複数の立候補が出たりする。
      • 基本ノード数は奇数が推奨。偶数だと投票同数で再投票になったりする
    • 現状
      • 大規模クラスタは向いていない 5 - 9ノード ConsulもRaftで5ノード推奨

        • 大規模になる場合はStandby Mode
      • Leader heartbeatのTimeoutが短い 50ms
    • Standby Modeとは
      • 最大アクティブノード数を規定(デフォルト9)
      • 10ノード目以降はStandby Modeに。
      • アクセスを全て302でLeaderノードにリダイレクト
      • Leaderの設定は5秒ごとに同期
      • Activeノードに空きが出れば、Followerに昇格!
      • まだBuggy
  • Fleet
    • コンテナを指定マシン(あるコンテナと同じマシン、metadataにマッチしたマシンなど)にデプロイ
    • Engine
      • Job Scheduling
    • Agent
      • 判断してJobを実行
      • D-Busで監視
    • フロー
      • レジストリにJobを登録、EngineがAgentにSubmit。
      • レジストリのストアがetcd。
    • SystemdのUnitとして定義
    • Fleet拡張 SystemdのUnit定義に拡張の記述
      • どのマシンに配置するかのルールX-ConditionMachine* / X-Conflicts など
      • 例 : Exec*のコマンド名の前に「-」がついているものは返り値を無視する
      • Fleet Agent Heartbeat Timeoutときどき起きる。これが出るとFleetは即死。agent_ttlで調整するべし。
      • Job Schedulingには優先度がない
      • Job登録には認証がない。
  • locksmith
    • クラスタ上のマシンのRebootを管理する

      • 自動更新時に全マシンが止まらないように管理
      • セマフォでロック
      • よくpanicを起こして死んでいるw
    • ここでデモ!
      • coreupでGCE上にCoreOSクラスタを立ち上げ!
  • 今後の課題
    • 安定性重視
    • クラスタサイズ、Standby Modeで何台まで?
    • 高レベルオーケストレーション
    • クラスタ設計
      • 実際にどれくらいのスペックが求められるのか
      • コンテナ何個?
      • ログなど管理ノードの配置
    • オーケストレーションツールの配布方法
    • 運用まわり
      • メトリクス
      • ログ収集
      • アラート
      • リードオンリーのOSなので辛い
    • Docker前提の設計
      • 外部ホスト連携 : confd
      • 永続化データの保存先 : 外部ストレージ
      • ディスクの制御
        • 帯域はblkioとかで
        • btrfsクオータなどで制限

ゆるーいトークと最先端の話題のコントラストが心地よい、そんな勉強会でした。主催のビープラウドさん、@yone098さん、@mopemopeさんありがとうございました!