0

私は 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 つずつゆっくりとダウンさせると、すべてが正常に機能します (負荷が適切に適切なノードに分散されていることは確認していませんが、少なくとも機能します)。

では、この動作が期待されるポイントはありますか? つまり、すべてを停止しました。最初のクラスタの最後のクラスタが停止される前に、何も稼働していませんでした。この動作は予期されたものですか?

私には、解決するのは簡単な問題のように思えます。何が欠けているか、間違っているかはわかりません。両方のクライアントが同じ症状を示していることに驚いています。私たちのステートフルセットとサービスで何かが起こっていないと思います

4

1 に答える 1