チュートリアルに従って開発モード consul agent -dev
で起動して使っている分には、特に問題ならない。
開発モードをやめて本番用の使い方を調べているときに、マニュアルで少し混乱したところが出たので、メモ。
consul agent
の「 -bootstrap-expect
は(3 や 5 を)設定するか、全く設定しないか」するべし。と書かれている。
例えば 3 を指定した場合は、3 node join したときに leader election が開始される。leader election 終わるまでは利用不能。3 node member があるときは、1 node fail しても一貫性は失われない。これは zookeeper でも同様。
あれ?と思ったのは「全く指定しない」ときの動作。consul agent -server -data-dir=/tmp
で 3 node member join させても、一向に leader election が開始されない。
どういうことかと更に調べてみたら、-bootstrap-expect
無しの場合は手動でのbootstrapをしないといけない。
原点に立ち返ると consul
は raft を実装した serf
の上に構築されていて、raft の規則に従う。過半数を満たすように増減すればいいので、1 node から開始してもいいはず。
しかし同時に raft の規則では node の数が変わるときは、変わる前後の両方の総数で過半数を満たしていればよい。raftの「6 Cluster membership changes」に書かれている。
1 node (過半数は 1) で開始してしまうと、2 node (過半数は 2) に遷移できない。2 node から 3 node (過半数は 2) へは遷移できる。ということで、これはむしろ意図的な安全装置で、ノード数の変更を担保しようとしてるんだな。1 node で動かしたい場合は、-bootstrap
か -bootstrap-expect=1
で明示的に開始せよ、と。ノードを増やしたい場合は、すみやかにノードを追加し、bootstrap 付きで起動したノードを解除せよ、と。
あと -bootstrap-expect
は leader election をいつ始めるかを決めるだけなので、クラスターが開始した後は、指定した数とは関係なく、過半数で状態を決める動作をする。
バージョンが上がるごとに使える手順が増えている様子。creationonlineの記事が分かりやすい。
話はそれるけれど、zookeeper でも同じようにノード数を変更することができる。zookeeper は設定ファイル変更しないといけないから、オペレーションは大変だけど。
全台一気に落とした時の問題?があるらしい。シグナルによっては leader election が開始しない?って、どういうことだろう?
おまけ
FROM ubuntu
RUN apt-get install -y wget unzip
RUN wget https://releases.hashicorp.com/consul/0.6.3/consul_0.6.3_linux_amd64.zip -P /tmp
RUN unzip /tmp/consul_0.6.3_linux_amd64.zip -d /usr/local/bin
/etc/default/docker
で DOCKER_OPTS="--iptables=false"
としておくと、実験がはかどる。