2 台のマシンに Redis を正常にインストールし、マスター スレーブとして動作させました。いくつかのコードをテストして、レプリケーションが機能し、すべてが問題ないかどうかを確認しました。
私のクライアントマネージャーは次のようになります
var manager = new PooledRedisClientManager(new[] { "MasterIP:6379" }, new[] { "MasterIP:6379", "SlaveIP:6379" });
しかし、マスターインスタンスをシャットダウンし、コードを再度テストすると、クライアントがマスターサーバーに接続できないなどのエラーが発生します。
ps 読み取りには GetReadOnlyCacheClient(); を使用します。
コードを繰り返したところ、クライアントが最初にマスターを取得していることに気付きました (エラーは接続できません)。コードを再度実行すると、クライアントはスレーブを取得し、コードを実行すると、クライアントはマスターを取得します。
ServiceStack.Redis クライアントでソース コードをダウンロードしました。そのエラーがいつ発生するかを確認したかっただけで、コードは次のとおりです。
private void Connect()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
{
SendTimeout = SendTimeout,
ReceiveTimeout = ReceiveTimeout
};
try
{
if (ConnectTimeout == 0)
{
socket.Connect(Host, Port);
}
else
{
var connectResult = socket.BeginConnect(Host, Port, null, null);
connectResult.AsyncWaitHandle.WaitOne(ConnectTimeout, true);
}
if (!socket.Connected)
{
socket.Close();
socket = null;
return;
}
Bstream = new BufferedStream(new NetworkStream(socket), 16 * 1024);
if (Password != null)
SendExpectSuccess(Commands.Auth, Password.ToUtf8Bytes());
db = 0;
var ipEndpoint = socket.LocalEndPoint as IPEndPoint;
clientPort = ipEndpoint != null ? ipEndpoint.Port : -1;
lastCommand = null;
lastSocketException = null;
LastConnectedAtTimestamp = Stopwatch.GetTimestamp();
if (ConnectionFilter != null)
{
ConnectionFilter(this);
}
}
catch (SocketException ex)
{
if (socket != null)
socket.Close();
socket = null;
HadExceptions = true;
var throwEx = new RedisException("could not connect to redis Instance at " + Host + ":" + Port, ex);
log.Error(throwEx.Message, ex);
throw throwEx;
}
}
私は本当にこのコードを理解していません.couzeプロジェクトは本当に大きいですが、このサーバーが失敗した場合は、読み取り専用サーバーリストで別のホストから取得してみてください.
別の読み取り専用インスタンスを取得しようとして失敗したかどうかを確認するために、ある種のカスタム ロジックを作成できます。