2013/08/21


etcd って何と聞かれた場合、一言で言ってしまえば zookeeper なんだけど
Documentation · CoreOS

etcd etcd is a highly-available key value store for shared configuration and service discovery.

http://coreos.com/docs/etcd/
coreos/etcd - GitHub
https://github.com/coreos/etcd
etcd の良い所は
  • curl で使える様な簡単な API
  • SSL Cert 認証もオプションとして使える
  • ベンチマークで 1000s of writes/s per instance を出せるくらい速い
  • Raft を使って正確に、確実に分散する
という感じらしい。作ってるのは CoreOS。
etcd はキーをパス形式で指定し、値を入出力出来るのだけど、例えば
  • /app/foo に test1
  • /app/bar に test2
この様に設定して /app を参照すると foobar の両方が参照出来る。
curl からも簡単に実行出来るので、ちょっと値を更新といった場合にもいちいちプログラムを書かなくても良い。
etcd はみんな大好きGo言語で書かれていて Windows でもビルド出来るし、linux のノードと混ぜて運用する事も出来る。Go言語で書かれた go-etcd というクライアントを使えば、簡単に etcd を操作出来る。
coreos/go-etcd - GitHub

This etcd client library is under heavy development. Check back soon for more docs. In the meantime, check out etcd for details on the client protocol.

https://github.com/coreos/go-etcd
この etcd を使った小さなプログラムを書いてみた。
mattn/etcdenv - GitHub

etcd + env = awesome!

https://github.com/mattn/etcdenv
通常、unix で env と言えば $ env DB=newdb CACHE=mycache foo の様に環境変数を指定してプロセスを起動する物で、shebang で使われる事が多い。
例えば上記の様に書かれたプログラムが複数のサーバで起動するシステムであった場合、環境変数の内容を書き換えるとなれば大変だ。もちろんデプロイしてしまえばいいんだけど、そもそも環境変数値を動的に変えたいなんてニーズはある訳だ。
そこで $ etcdenv -key=/app foo この様にキーを指定して起動すると、etcd から環境変数値を取得して foo を起動する。利用シーンで言えば以下の様な感じ。 $ curl http://127.0.0.1:4001/v1/keys/app/db -d value="newdb"
$ curl http://127.0.0.1:4001/v1/keys/app/cache -d value="new cache"

$ curl http://localhost:4001/v1/keys/app
[{"action":"GET","key":"/app/db","value":"newdb","index":4},{"action":"GET","key":"/app/cache","value":"new cache","index":4}]

$ etcdenv -key=/app/
DB=newdb
CACHE=new cache

$ etcdenv -key=/app/ ruby web.rb
foreman や goreman の Procfile で以下の様に指定してもいい。 $ cat Procfile
web: etcdenv -key=/app ruby web.rb
後は複数あるシステムの環境変数を変えたければ curl で更新すればいい。

なお、etcd は設定情報に特化はしているけど、よく考えたらこれってファイルシステムだよね、とひらめいたので vim から etcd をファイルシステムとして扱える物を作ってみた。
mattn/vim-metarw-etcd - GitHub

vim-metarw-etcd etcd filesystem for vim

https://github.com/mattn/vim-metarw-etcd
:e etcd:/app/ とすれば上記の DB や CACHE が一覧され、ENTER で参照出来る。更新は :w で ok。
vim-metarw-etcd

TAB で補完も出来るのでファイルシステムそっくりに扱える。ちなみに僕はこの2日程、etcd 上で日記を書いてる。
etcd の使い道はもっと可能性があると思うので、もう少し遊んでみたい。
Posted at by | Edit