Documentation · CoreOS
etcd etcd is a highly-available key value store for shared configuration and service discovery.
http://coreos.com/docs/etcd/
coreos/etcd - GitHubetcd の良い所は
https://github.com/coreos/etcd
- curl で使える様な簡単な API
- SSL Cert 認証もオプションとして使える
- ベンチマークで 1000s of writes/s per instance を出せるくらい速い
- Raft を使って正確に、確実に分散する
etcd はキーをパス形式で指定し、値を入出力出来るのだけど、例えば
/app/foo
に test1/app/bar
に test2
/app
を参照すると foo
と bar
の両方が参照出来る。curl からも簡単に実行出来るので、ちょっと値を更新といった場合にもいちいちプログラムを書かなくても良い。
etcd はみんな大好きGo言語で書かれていて Windows でもビルド出来るし、linux のノードと混ぜて運用する事も出来る。Go言語で書かれた go-etcd というクライアントを使えば、簡単に etcd を操作出来る。
coreos/go-etcd - GitHubこの etcd を使った小さなプログラムを書いてみた。
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
mattn/etcdenv - GitHub通常、unix で env と言えば
etcd + env = awesome!
https://github.com/mattn/etcdenv
$ 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。TAB で補完も出来るのでファイルシステムそっくりに扱える。ちなみに僕はこの2日程、etcd 上で日記を書いてる。
etcd の使い道はもっと可能性があると思うので、もう少し遊んでみたい。