handshake が上手くいかず Cassandra クラスタにノードが追加できなかった件
Cassandra を触り始めました。開発環境の Cassandra クラスタ (ノードは1台しかいない) に、2台目のノードを追加しようとしたときのお話。
設定を配置し2号機の Cassandra を start させたが、どうも正常に起動しない。
/var/log/cassandra/system.log
を見てみると、以下のようなログを吐いて死んでいた。
どうも1号機とのハンドシェイクが上手くいってない模様?
INFO [HANDSHAKE-dev-cassandra101.example.com/10.10.10.101] 2017-05-25 17:11:07,529 OutboundTcpConnection.java (line 386) Handshaking version with dev-cassandra101.example.com/10.10.10.101
ERROR [main] 2017-05-25 17:11:38,522 CassandraDaemon.java (line 513) Exception encountered during startup
java.lang.RuntimeException: Unable to gossip with any seeds
at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1193)
at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:446)
at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:655)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:611)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:504)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:378)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:496)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:585)
ERROR [StorageServiceShutdownHook] 2017-05-25 17:11:38,563 CassandraDaemon.java (line 199) Exception in thread Thread[StorageServiceShutdownHook,5,main]
java.lang.NullPointerException
at org.apache.cassandra.gms.Gossiper.stop(Gossiper.java:1270)
at org.apache.cassandra.service.StorageService$1.runMayThrow(StorageService.java:572)
at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28)
at java.lang.Thread.run(Thread.java:745)
StackOverflow 的なサイトでは、seeds の設定を見直せとか、ネットワーク的にそもそも到達出来ていないのではなどのコメントが書かれているが、どれも問題はなさそう。1号機のログには何も追記されない。
ようわからんので、チームの先輩とペア作業でトラブルシュートしてみることに。
試しに seeds に1号機と2号機の両方の FQDN を書いて起動してみると、2号機だけが ring に入った状態で Cassandra が起動した。nodetool status
をみると、 Address が 127.0.0.1 となっているノードが1台だけいる状態。
ここで、2号機さんは hostname/IP アドレスの対応を正しくまわりのノードに伝えられているのかしらという疑問が浮かび、 /etc/hosts
を確認してみると 2号機は FQDN 及び hostname が 127.0.0.1 に向いていた。
127.0.0.1 localhost
127.0.0.1 dev-cassandra102.example.com dev-cassandra102
hostname -i
してみるとイカの通り。
$ hostname -i
127.0.0.1
ということで、 /etc/hosts
の該当の行をコメントアウトし、 hostname -i
で eth0 に当たっている IP アドレスが返ってくることを確認。seeds の設定を元の1号機のみの状態に戻し Cassandra を start させたら、みごと起動するようになった。
127.0.0.1 localhost
#127.0.0.1 dev-cassandra102.example.com dev-cassandra102
or
## eth0 に当たっている IP を書いてもうまくいった
10.10.10.102 dev-cassandra102.example.com dev-cassandra102
$ sudo nscd -i hosts # hosts のキャッシュを飛ばして...
$ hostname -i
2xxx:xxxx:x:xxx:xxxx:xxxx:xxxx:xxxx 10.10.10.102
hostname -i
で返ってくる IP が、 eth0 に割り当てられている他のノードから叩ける IP であれば問題がないようにみえる。
下記の記事は nodetool
コマンドの話だが、Cassandra 本体でも同様の問題が発生しているということなのだろうか?
Previous Post
Next Post