私は次のコードを実行しています...
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["db-connection"].ConnectionString))
{
connection.Open();
var command = new SqlCommand("SELECT @@SERVERNAME",connection);
using (var reader = command.ExecuteReader())
{
reader.Read();
return reader[0].ToString();
}
}
...このアプリケーションが指しているDBサーバーの名前を返すための健全性チェックとして。2つのDBサーバー(DB00とDB01)があり、DB00が使用できない場合にDB01にフェイルオーバーするようにセットアップされたHAProxyの背後にあります。
接続文字列は次のようになります。
<add name="db-connection"
connectionString="User Id=USER_ID; Password=PASSWORD; Initial Catalog=the-database; Server=load-balancer.is.here,59281; Application Name=My.Application.Name;Min Pool Size=5;Max Pool Size=500;Connect Timeout=10;Connection Lifetime=29;" />
私たちが経験している問題はこれです:
- DB01にフェイルオーバーします(現在、HAProxy構成を編集し、DB00をバックアップにしてから、HAProxyをリロードします)。
- SELECTコード(この質問の冒頭のコード)はサーバー名としてDB01を返すはずですが、そうではなく、DB00を返します。
- これは、SQLConnectionsがまだ間違ったDBを指しているように見えることを意味します
- コードがホストされているボックスでモノラルプロセスを再起動するまで、問題は解決しません
- これで、健全性チェックコードが正しいサーバー名を返します-DB01
これが何であるかについてのアイデアはありますか?モノラル接続プールの問題である可能性がありますか?
要求に応じてHAProxy設定を編集します。
1 global
2 maxconn 4096
3 daemon
4
5 defaults
6 mode tcp
7 #mode http
8 contimeout 5000
9 clitimeout 50000
10 srvtimeout 50000
11
12
13 frontend blahblah
14 bind *:59283
15 mode tcp
16 default_backend sql-server-lockertest
17
18 backend sql-server-lockertest
19 balance roundrobin
20 server james 10.0.10.217:1433 check maxconn 32 rise 3 fall 3
21 server andres 10.0.10.226:1433 check maxconn 32 rise 3 fall 3 backup
よろしく、
ジェームズ