3 つの redis サーバー、1 つのマスターと 2 つのスレーブがあります。現在、実行中のセンチネルは 1 つだけで、それらすべてを適切に監視しています。必要に応じてどのインスタンスも昇格し、非常にスムーズです。
私が現在抱えている問題は、C#から通信することです。私のグーグルによると、スレーブ/マスターを取得するためのセンチネルをサポートしているのは csredis だけのようです。したがって、このようなコードを使用して...
//Create a manager, which has all the sentinels in it (this would have 3 when we go live)
RedisSentinelManager sentman = new RedisSentinelManager("localhost:26379");
//Get a slave, as these are read-only
sentman.GetSlave("mymaster", 100, 100);
//Get a master, for storing an object
sentman.GetMaster("mymaster", 100, 100);
これはうまく機能し、インスタンスを強制終了するとさまざまな応答が変化します。しかし、それは信じられないほど遅いです!
マネージャーを作成してスレーブを 5 回取得しようとすると、スレーブ要求ごとに約 1 秒かかり、非常に遅くなります。私が気付いたのは、最初のリクエストが非常に高速であることです。以下のコードを参照してください...
//Try and get 5 slaves
for ( int i = 0; i < 5; i ++ )
{
Stopwatch a = Stopwatch.StartNew();
var slave = sentman.GetSlave("mymaster", 50, 50);
if (slave == null)
Console.WriteLine("Failed to get slave");
Console.WriteLine("Took " + a.ElapsedMilliseconds.ToString() + "ms to get " + slave.Host + ":" + slave.Port);
}
これが出力です...
Took 4ms to get localhost:6400
Took 844ms to get localhost:6400
Took 1007ms to get localhost:6400
Took 999ms to get localhost:6400
Took 994ms to get localhost:6400
奇妙なことに、最初のものは 4ms です! その後、後続のクライアントを取得するのに時間がかかります。それで、ループ項目ごとに新しい SentinelManager を作成して、別のテストを試してみましたが、それはより高速ですか? いいえ、まったく同じです。最初は非常に速く、次に非常に遅くなります。
このライブラリを間違って使用していますか、それともバグを見つけましたか? ソースを取得してステップスルーしようとしています...
乾杯...