私は kubernetes にデプロイされたアプリケーションを持っています。それは cassandra、go クライアント、および Java クライアント (およびその他のものですが、この議論には関係ありません) で構成されています。デプロイには helm を使用しました。カサンドラにはステートフル セットとヘッドレス サービスを使用しています。クラスター作成の連絡先としてヘッドレス サービス dns を使用するようにクライアントを構成しました。
すべてがうまく機能します。すべてのノードがダウンするか、その他の悪意のあるノードの組み合わせがダウンするまで、すべての cassandra ノードで kubectl delete を使用してすべてのポッドを連続して削除することで、それをシミュレートしています。
これを行うと、クライアントは Java で NoHostAvailableException をスローします。
"java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /10.200.23.151:9042 (com.datastax.driver.core.exceptions.UnavailableException: Not enough replicas available for query at consistency LOCAL_QUORUM (1 required but only 0 alive)), /10.200.152.130:9042 (com.datastax.driver.core.exceptions.UnavailableException: Not enough replicas available for query at consistency ONE (1 required but only 0 alive)))"
which eventually becomes
"java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)"
in go its
"gocql: no hosts available in the pool"
cqlsh を使用して cassandra にクエリを実行できます。ノードは nodetool ステータスを使用して問題ないようです。新しい IP はすべてそこにあります。
2 つのクライアント ポッドで bash を実行すると、nslookup を使用して dns が適切であることを確認できますが、... netstat には cassandra への確立された接続が表示されません (ノードを停止する前に接続が存在します)。
クライアントを再起動すると、すべて正常に動作します。
私はたくさんグーグルで検索しました(つまり、たくさんのことを意味します)、私が見つけたもののほとんどは、接続が機能していないことに関連しており、最も関連性の高いものは非常に古いようです(2014、2016など)。
したがって、ダウンするノードは非常に基本的なものであり、cassandra クラスターがそれ自体を管理し、オンラインになると新しいノードを検出し、負荷を分散するなど、すべてが機能することを期待します。
すべての cassandra ノードを一度に 1 つずつゆっくりとダウンさせると、すべてが正常に機能します (負荷が適切に適切なノードに分散されていることは確認していませんが、少なくとも機能します)。
では、この動作が期待されるポイントはありますか? つまり、すべてを停止しました。最初のクラスタの最後のクラスタが停止される前に、何も稼働していませんでした。この動作は予期されたものですか?
私には、解決するのは簡単な問題のように思えます。何が欠けているか、間違っているかはわかりません。両方のクライアントが同じ症状を示していることに驚いています。私たちのステートフルセットとサービスで何かが起こっていないと思います