etcd
centos7

CentOS 7でetcdに触ってみる

More than 1 year has passed since last update.

目的

etcd触ったことなかったので触ってみる。
クラスタの動きぐらい見えるといいと思っている。

公式ドキュメント

やること

MacにVagrantで3node立てて、etcdのクラスタを構築する
※ vargrantfileで構築するのではなく、素の状態で触ってます。
※ APIヴァージョンがあるようですが備忘録なのでバージョンまで把握してません

環境

Vagrant Box は以下の記事など参考に3つ立てる
参考 : http://qiita.com/kidach1/items/e63c1607705178aa257c

ipは連番で振ってます 192.168.33.2[1-3]

$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

etcdのバージョンなど

$ etcd --version
etcd Version: 2.3.7
Git SHA: fd17c91
Go Version: go1.6.3
Go OS/Arch: linux/amd64

etcdをインストールして動かしてみる

インストール

最新版を使いたいとかはなかったので、yumで入るものを利用

$ sudo yum install etcd -y

バックグラウンドで起動して動作確認

バックグラウンドでetcdを起動しておき動作を見る。

$ etcd &
[1] 4133
2016-10-10 11:35:27.478358 I | etcdmain: etcd Version: 2.3.7
2016-10-10 11:35:27.478444 I | etcdmain: Git SHA: fd17c91
2016-10-10 11:35:27.478448 I | etcdmain: Go Version: go1.6.3
2016-10-10 11:35:27.478452 I | etcdmain: Go OS/Arch: linux/amd64
2016-10-10 11:35:27.478457 I | etcdmain: setting maximum number of CPUs to 1, total number of available CPUs is 1
2016-10-10 11:35:27.478464 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2016-10-10 11:35:27.478496 N | etcdmain: the server is already initialized as member before, starting as etcd member...
2016-10-10 11:35:27.479501 I | etcdmain: listening for peers on http://localhost:2380
2016-10-10 11:35:27.479682 I | etcdmain: listening for peers on http://localhost:7001
2016-10-10 11:35:27.479750 I | etcdmain: listening for client requests on http://localhost:2379
2016-10-10 11:35:27.479864 I | etcdmain: listening for client requests on http://localhost:4001
2016-10-10 11:35:27.480145 I | etcdserver: name = default
2016-10-10 11:35:27.480152 I | etcdserver: data dir = default.etcd
2016-10-10 11:35:27.480157 I | etcdserver: member dir = default.etcd/member
2016-10-10 11:35:27.480161 I | etcdserver: heartbeat = 100ms
2016-10-10 11:35:27.480164 I | etcdserver: election = 1000ms
2016-10-10 11:35:27.480167 I | etcdserver: snapshot count = 10000
2016-10-10 11:35:27.480176 I | etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2016-10-10 11:35:27.507513 I | etcdserver: restarting member ce2a822cea30bfca in cluster 7e27652122e8b2ae at commit index 8835
2016-10-10 11:35:27.512631 I | raft: ce2a822cea30bfca became follower at term 5
2016-10-10 11:35:27.512715 I | raft: newRaft ce2a822cea30bfca [peers: [], term: 5, commit: 8835, applied: 0, lastindex: 8835, lastterm: 5]
2016-10-10 11:35:27.521440 I | etcdserver: starting server... [version: 2.3.7, cluster version: to_be_decided]
2016-10-10 11:35:27.522939 E | etcdmain: failed to notify systemd for readiness: No socket
2016-10-10 11:35:27.523071 E | etcdmain: forgot to set Type=notify in systemd service file?
2016-10-10 11:35:27.525169 N | etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2016-10-10 11:35:27.525615 N | etcdserver: set the initial cluster version to 2.3
2016-10-10 11:35:28.828638 I | raft: ce2a822cea30bfca is starting a new election at term 5
2016-10-10 11:35:28.828730 I | raft: ce2a822cea30bfca became candidate at term 6
2016-10-10 11:35:28.828743 I | raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 6
2016-10-10 11:35:28.828762 I | raft: ce2a822cea30bfca became leader at term 6
2016-10-10 11:35:28.828776 I | raft: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 6
2016-10-10 11:35:28.840528 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae

起動できれば etcdctlコマンドで状態が確認出来る

$ etcdctl cluster-health
member ce2a822cea30bfca is healthy: got healthy result from http://localhost:2379
cluster is healthy

keyの登録と取得

valueの登録

fogeというkeyにhugaを登録する

# setで登録される
$ etcdctl set foge huga
huga

valueの取得

$ etcdctl get foge
huga

valueの削除

$ etcdctl rm foge
PrevNode.Value: huga

# 消えれば取得できなくなる
$ etcdctl get foge
Error:  100: Key not found (/foge) [11]

階層的な保存

ディレクトリを作成し階層的にkeyを保存することも可能で、
階層ごとにユニークなkeyを置くことができる

$ etcdctl mkdir piyo
$ etcdctl ls
/foge
/piyo

# 階層を指定できる。デフォルトは/になっている
$ etcdctl set piyo/fuga hoge
hoge

$ etcdctl ls --recursive
/foge
/piyo
/piyo/fuga  <<<< ここに保存されている

etcdctlのexec-watchを触ってみる

exec-watchは格納するkeyを監視して処理を実行できる
この時与えたkeyとvalueを取得できる

$ etcdctl exec-watch --recursive /test -- sh -c 'echo " set key \"$ETCD_WATCH_KEY\" , set value \"$ETCD_WATCH_VALUE\" "'
set key "/test/foge" , set value "huga"

クラスタ化を試す

# node1
$ etcd --initial-cluster-state 'new' \
     --initial-cluster-token 'etcd-cluster-1' \
     --name 'node1' \
     --listen-peer-urls http://192.168.33.21:2380 \
     --listen-client-urls http://192.168.33.21:2379,http://127.0.0.1:2379 \
     --advertise-client-urls http://192.168.33.21:2379 \
     --initial-cluster node1=http://192.168.33.21:2380,node2=http://192.168.33.22:2380,node3=http://192.168.33.23:2380 \
     --initial-advertise-peer-urls http://192.168.33.21:2380

# node2
$ etcd --initial-cluster-state 'new' \
     --initial-cluster-token 'etcd-cluster-1' \
     --name 'node2' \
     --listen-peer-urls http://192.168.33.22:2380 \
     --listen-client-urls http://192.168.33.22:2379,http://127.0.0.1:2379 \
     --advertise-client-urls http://192.168.33.22:2379 \
     --initial-cluster node1=http://192.168.33.21:2380,node2=http://192.168.33.22:2380,node3=http://192.168.33.23:2380 \
     --initial-advertise-peer-urls http://192.168.33.22:2380

# node3
$ etcd --initial-cluster-state 'new' \
     --initial-cluster-token 'etcd-cluster-1' \
     --name 'node3' \
     --listen-peer-urls http://192.168.33.23:2380 \
     --listen-client-urls http://192.168.33.23:2379,http://127.0.0.1:2379 \
     --advertise-client-urls http://192.168.33.23:2379 \
     --initial-cluster node1=http://192.168.33.21:2380,node2=http://192.168.33.22:2380,node3=http://192.168.33.23:2380 \
     --initial-advertise-peer-urls http://192.168.33.23:2380

3台とも起動すると以下のようになる。

$ etcdctl member list
56042ab014c6ac8e: name=node1 peerURLs=http://192.168.33.21:2380 clientURLs=http://192.168.33.21:2379 isLeader=false
eeec403fa07e9432: name=node3 peerURLs=http://192.168.33.23:2380 clientURLs=http://192.168.33.23:2379 isLeader=true
fbd7ce486ae9e974: name=node2 peerURLs=http://192.168.33.22:2380 clientURLs=http://192.168.33.22:2379 isLeader=false

この状態でリーダーをkillすると、リーダが変わる

クラスターの状態を見ると1台死んでおり、残りは生きている
```
$ etcdctl cluster-health
member 56042ab014c6ac8e is healthy: got healthy result from http://192.168.33.21:2379
failed to check the health of member eeec403fa07e9432 on http://192.168.33.23:2379: Get http://192.168.33.23:2379/health: dial tcp 192.168.33.23:2379: getsockopt: connection refused
member eeec403fa07e9432 is unreachable: [http://192.168.33.23:2379] are all unreachable
member fbd7ce486ae9e974 is healthy: got healthy result from http://192.168.33.22:2379
cluster is healthy

$ etcdctl member list
56042ab014c6ac8e: name=node1 peerURLs=http://192.168.33.21:2380 clientURLs=http://192.168.33.21:2379 isLeader=true  <<< リーダが変わっている
eeec403fa07e9432: name=node3 peerURLs=http://192.168.33.23:2380 clientURLs=http://192.168.33.23:2379 isLeader=false
fbd7ce486ae9e974: name=node2 peerURLs=http://192.168.33.22:2380 clientURLs=http://192.168.33.22:2379 isLeader=false
```

この状態で、setやgetを行うと互いの値を同期してみることができる

わかりにくいですが、node1で入れたものがnode3で取り出すことができる

#### node1側でセット
[vagrant@localhost ~]$ ifconfig |grep 192.168.33.21
        inet 192.168.33.21  netmask 255.255.255.0  broadcast 192.168.33.255
[vagrant@localhost ~]$ etcdctl set node1 192.168.33.21
192.168.33.21

#### node3側でゲット
[vagrant@localhost ~]$ ifconfig | grep 192.168.33.23
        inet 192.168.33.23  netmask 255.255.255.0  broadcast 192.168.33.255
[vagrant@localhost ~]$ etcdctl get node1
192.168.33.21

まとめ

  • CentOS7でetcdを動かしてみた
  • 互いのサーバを知っていれば、ディスカバリの設定は不要なことがわかった
  • 性能計測してないが、etcdのクラスタとして同期していればvalueの監視で何かできそうなことがわかった

今の所使い道は思いつかないが、あまりCentOS7で立ち上げてる資料がなさそうだったので誰かの役に立てば嬉しいです