ストックホルムで開催されたErlang User Conference 2014に参加した。
大変有難いことにLeoFSのセッションの一部で、7分ほど登壇させていただいた。
私が話したのは主にLeoFSのユースケースで、
- 現時点で600TB程度のディスク総量でクラスタを組んでいる
- データセンター間のレプリケーション機能を使っていきたい
- 社内のファイル共有にownCloudをLeoFSと組み合わせて使っている
- 各国のグループ会社との動画の共有などに使われている
というようなことを紹介した。
私たちのセッションには30名ほどの方が聞きにきてくれていたかと思う。
Day1
初日は以下のセッションに参加した。
- Welcome to the Erlang User Conference!
- Keynote: Composing a Functional Community (Katie Miller)
- Scaling and High Performance Storage System: LeoFS (Yosuke Hara) => 発表
- The Last REST Client You Will Ever Need (Loïc Hoguin)
- Concuerror: Into Real Code (Stavros Aronis)
- Building a Distributed Data Ingestion System with RabbitMQ (Alvaro Videla)
- Building a Cloud with Erlang and SmartOS - How Hard Could it Possibly Be? (Heinz Gies)
- Locks - Erlang-style Scalable Distributed Locking (Ulf Wiger)
Composing a Functional Community
初日のキーノートはLambda Ladiesという関数型言語の女性コミュニティから、Katieさんによる発表。
FP(Functional Programming)コミュニティの発展には以下が必要というお話でした。
- Education ビギナー向けの教育
- Safe space ハラスメント対策とか
- Mentoring 励ます メンティーはメンターになっていく
今のテックスペースやコミュニティはデフォルトで男性向けである話や、実際に女性達が感じていることが紹介されていて、ほとんど男性で埋まっていた会場に対してパンチの効いた発表。
Haskellによる6つのソートアルゴリズムがプリントされたギークドレスも印象的でした。
- 発表者プロフィール: http://www.erlang-factory.com/euc2014/katie-miller
- スライド: http://community.codemiller.com/#/
The Last REST Client You Will Ever Need
webサーバのcowboyの開発者であるLoicさんによる発表。
REST APIに使うMedia TypeにJSON、Msgpack、HTML、XMLに代わってBEDというのを考えてるよ、という話。
Media Typeは独自の定義が使えるので、以下のようなタイプを提唱していた。
- application/x-bed
- application/x-bed-stream
バイト数は短く、圧縮もなしで、relationも定義できて・・というようなものを目指しているよう。
現時点では構想の段階でレポジトリはないが、プロジェクトは作成されている。
https://github.com/bed-project
ヘルプ絶賛募集中とのことなので、BEDが気になった方はLoicさんにコンタクトをとるといいと思う。
- 発表者プロフィール: http://www.erlang-factory.com/euc2014/loc-hoguin
- スライド: http://ninenines.eu/talks/bed/bed.html
Building a Distributed Data Ingestion System with RabbitMQ
“RabbitMQ in Action"の著者のAlvaroさんによるRabbitMQのデザインパターン紹介。
複数のDC間でのログ集めにRabbitMQを使ってるらしい。
スケールしていくにはFederation Pluginを使うといいよという内容。
性能が必要だが、メッセージのロスが許されるような場合はno-ackモードという選択肢もあるとのこと。
以下のデモページでメッセージが分配される様子を紹介しながらの発表だった。
各workerにメッセージが分散される様子を見れるデモページは、ついついポチポチ押したくなってしまう。
正規表現を使ってのメッセージの内容に応じたルーティングもできる模様。
Fedarationを使った分散の例は以下のリンクでもJavaのコードを交えて紹介されているようだ。 http://jaxenter.com/distributed-log-aggregation-with-rabbitmq-federation-49154.html
- 発表者プロフィール: http://www.erlang-factory.com/euc2014/alvaro-videla
- スライド: http://www.erlang-factory.com/static/upload/media/1402395255933144rabbitmq_data_ingestion_euc.pdf
Day2
二日目に参加したセッションはこちら。
- Welcome to the 2nd Day of the EUC!
- Keynote: Erlang, Open Networking, and the Future of Computing (Stuart Bailey)
- Powering your Web and Mobile Applications (Jordan Wilberding)
- Monitoring Erlang Systems with WombatOAM (Richard Jonas)
- Scaling Erlang on 10K or More Cores: An Overview of the RELEASE Project (Simon Thompson)
- Real-Time Performance at Massive Scale (Francois Orsini)
- Where Shall I Parallelize? (Tamás Kozsik)
- Elixir Tooling: Exploring Beyond the Language (Eric Meadows-Jönsson)
- Latest News from the OTP Team - Kenneth Lundin
- Announcement of the Erlang User of the Year & the Most Influential Talk of 1999
Elixir Tooling: Exploring Beyond the Language
ElixirコミッターのEricさんによる発表。
はじめにElixirの今年のニュースとして以下の3つを挙げていた。
- version1.0がリリース予定
- ElixirConfが開催予定
- パッケージマネージャのHexがリリースされた
Mix
Mixというのはプロジェクト作成、コンパイル、テスト、などなどをサポートしてくれるツール。 ErlangのrebarやRubyでのrakeやbundleに似たことをしてくれる模様。
以下のツールを入れると、Mixのコマンドが拡張されるようだ。
ectoはDBのラッパーや管理を提供し、exrmはリリースをサポートしてくれる模様。
Hex
Elixirのパッケージマネージャで最近リリースされたばかりのようだ。
パッケージはS3でホスティングされてるとのこと。
IEx
Erlangでいうところのerl, Rubyでいうところのirbにあたる、Elixirの実行ターミナル。
IEx.pryを書いておくと実行中のコードの途中でiexに入ってデバッグできるらしい。pryにインスパイアされたものだそうだ。
iexシェルの中ではh Enum.map/2
とかするとヘルプも見えるとのこと。
ExUnit
tagsやfilter機能を使うと環境毎にテストを分けたり、特定ケースだけ実行することができるようだ。
またElixirではdoctestも提供されているとのこと。この形式で書かれたコメントは、後でドキュメントとして生成されるだけでなく、書かれているコードはテストとしての実行もしてくれる。
Standard library
-
- 再帰的にファイルの各行に処理するコードが、eachにブロック渡すだけのコードにできる。
- 遅延評価されるので必要になったときだけ実際にファイルをオープンしてる。
-
- OTPを抽象化してくれるライブラリ
-
- 非同期に処理をするために使うライブラリ
- Task.asyncでタスクを作って、Task.awaitで待つ、というような使い方。
-
発表者プロフィール: http://www.erlang-factory.com/euc2014/eric-meadowsjnsson
-
スライド: http://www.erlang-factory.com/static/upload/media/1402598794815412elixirtooling.pdf
Latest News from the OTP Team
OTPチームからの17系以降の変更点の紹介。
- 新しいデータ型のMaps
- binary周りで発生していた、スレッドにおけるブロックが減る
- ライセンスがEPL(Erlang Public License)からApache License Version 2.0に代わる
ライセンスに関しては以前、Mozilla Public Licenseへの移行も検討されていたようだ。 ライセンス変更にあたり、コミッターの方々にはメールで同意を求めるので"Yes"という準備しておいてね!というようなことを言っていた。
Day3
最終日は以下のチュートリアルに参加した。
- Introduction to Load Testing with Tsung (Radosław Szymczyszyn)
- Erlang in Production - Tricks and Tools for Running Erlang Production Systems (Jesper Louis Andersen)
- Load Testing Made Easy (Diana Corbacho)
- Deploying and Monitoring Erlang Nodes in the Cloud (Csaba Hoch)
WombatOAMやMegaloadといったErlang監視ツール、ロードテストサポートツールにも実際に触れることができたがこちらはOSSではないようだ。
Introduction to Load Testing with Tsung
ロードテストツールであるTsungの紹介。こちら、Erlang製のJMeterのようなもの。
チュートリアルは以下の資料に従い、Vagrantで構築された複数VMを使って行われた。Tsungの資料はあまりないと思われるので貴重だ。
Tsungに関するメモ。
-
指定されたユーザ数でランダムなアクセスをシミュレーションできる
- XMPP、TCP、HTTPなどのロードテストができる
- ログインパスワード指定できる
- ユーザによってはログインしかしないとかシミュレーションできる
- パスにIDとかいれてリクエスト生成してくれる
-
今回のサンプルでdurationが14400 minutesなのは十分に大きくするため
-
ディレクトリ構成やログインユーザ、elrangのcookieなど環境揃っている必要があるが、複数のノードからtsungの実行もできるらしい
-
テストの結果はtsplotとかでグラフにできるらしい
-
テスト時に、
ulimit -n
の上限に引っかかる可能性あるので注意しておく -
クラスタでやるときはtsung-controllerというのもあるらしいが、使用には注意らしい(SPOF?)
-
dumptrafficというオプションをオンにすると、大量のログがでるので注意
-
JMeterと違ってErlangなので、テスト時にはerlangのメソッドを直接呼ぶようなテストもできるらしい
-
発表者プロフィール: http://www.erlang-factory.com/euc2014/radosaw-szymczyszyn
Erlang in Production
運用者が朝まで寝ていられるシステムをつくるにはどうすればいいかという話。
まず、システムはいつ壊れるのかという話を"How Complex Systems Fail"というRichard Cookさんの資料を引用しつつ紹介。 たぶん元の資料はこちら。
紹介されていたライブラリの一部。
- https://github.com/feuerlabs/exometer
- https://github.com/klarna/circuit_breaker
- https://github.com/basho/sidejob
- https://github.com/uwiger/jobs
- https://github.com/massemanet/eper
上記のライブラリは、Erlangプロセスの情報を収集したり、ジョブスケジューリングをしてくれるもののようだ。
以降は、使ってるライブラリや設定の話。
sys.configについて
erl -man config
でも確認できるがconfigは、他のファイルも読めるので環境ごとのファイルを置いておくようにするといいらしい。
Lager
https://github.com/basho/lager
logライブラリにはlagerを使って、どこかに集めている。 folsomのデータ飛ばしてるらしい。
alarm_handler
SASLの一部。アラートは自分で定義できて、Nagiosサーバにもデータ飛ばすこともできる。 アラームがオフになる時(?)にlagerに流し込むとかもできる。
Nagiosと組み合わせる際は、ファイル書き出されたステータスをNagiosが定期的に確認するようにしていたらしい。
os_mon
http://erlang.org/doc/man/os_mon_app.html
cpu usageみたりもできる。mem_supでメモリ使い過ぎ検知もできる。
fuse
https://github.com/jlouis/fuse
マウントに使うfuseとは別のErlangライブラリ。
たとえばmysql落ちた時にほかのノードの処理をキックするのに使う。
Folsom
https://github.com/boundary/folsom
メトリクスのライブラリ。
データ転送にはUDP使ってる、リモートが落ちてたり遅いことに影響されないように。
counters, gauges, spirals, histogramsなどのグラフが用意されている。
グラフを見るに当たっての注意点としては、平均を見るのは危険。低い方と高い方に値が固まっているかもしれないので。なので、95th、99thパーセンタイルの情報をみるべき。
なにを集計する?
取れるものすべてを集計してる。
- query times
- internal heavy weight processing
- API endpoints
- every cascading subsystem
- cache hit/miss, あとDBたたいた時にどうだったのか
Tracing / Recon
reconは各pidが何を実行しているかわかるようにしてくれるらしい。 recon_traceでオンラインtracingもできるらしい。
会場の写真
カンファレンス会場に使われた建物。
カンファレンス会場では何故かファミコンが置かれていて、グラディウスやボンバーマンをプレイされていた。コナミコマンドは使っていないようだ。
カンファレンス会場でのランチの様子。
チュートリアルで使われたEricssonの一室。
Ericssonでのランチ。スウェーデンではサンドイッチの出る場面が多い。
おわりに
EUCに参加するのは二度目で、前回は2012年のEUCに参加していた。
以前は日に何度かあるコーヒブレイクの45分が非常に長く感じられたのだが、今回は会場で知り合った方と話せたこともあってか、あっという間に感じられた。
英語への敷居が前よりも下がったのかもしれない。コーヒーを取るタイミングで、目が合ったら"hi"と言ってみたりもした。
わずかだがJoe Armstrongさんとも話せて嬉しい限りだ。
また、あまり前回は意識していなかったが、発表者はみんな英語が母国語とは限らない。
よく聞いていると、言いたいことが出てこなかったり、発音を気にして言い直したりしている。
ヨーロッパの各地から来ている人がいるので、イントネーションも様々だった。
英語での発表には、多少の不自由を感じながらもみんなやっているのかもしれない。
最後に、今回の発表・参加にあたってレビューや調整をしてくれた皆様に感謝します。