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 本体でも同様の問題が発生しているということなのだろうか?

nodetoolでリモートホストを指定した時に接続が拒否される時に確認すべきこと - Qiita

Cassandraでnodetoolを-hオプション付きで実行するとき、ポートを閉じていないにもかかわらず接続が拒否されてしまうことがある。オプションなし、あるいはホスト指定がlocalhostだ…

comments powered by Disqus