MySQL c# 连接字符串故障转移

Posted

技术标签:

【中文标题】MySQL c# 连接字符串故障转移【英文标题】:MySQL c# Connection String failover 【发布时间】:2018-10-20 19:44:03 【问题描述】:

我知道我可以用逗号分隔连接字符串中的主机,它将使用不同的服务器:https://www.connectionstrings.com/mysql-connector-net-mysqlconnection/multiple-servers/

例如:Server=serverAddress1, serverAddress2, serverAddress3;Database=myDataBase; uid=myUsername;Pwd=myPassword;

但我需要一些关于它如何具体选择服务器的信息。例如,是循环赛吗?或者它是否按顺序进行,直到找到一个工作?

如果第一个失败,它会移动到第二个,它会在尝试使用第二个之前多长时间?

我愿意接受有关故障转移连接字符串的其他建议

TIA - 乔

【问题讨论】:

【参考方案1】:

这里的 MySQL 文档是您的朋友。它指出

连接 URL 中的主机列表包含两种类型的主机, 主要次要。当开始一个新的连接时, 驱动程序总是首先尝试连接到主主机,如果 必需,按顺序故障转移到列表中的辅助主机 当遇到沟通问题时。即使最初 与主要主机的连接失败,驱动程序连接到 辅助主机,主主机永远不会失去它的特殊地位

所以在下面的连接字符串中,第一个主机是主要的,将首先被选中进行连接。只有当这不可用时,才会选择辅助主机。它还将尝试尽快故障回复到主要主机,但可以配置其工作方式。

jdbc:mysql://[primary host][:port],[secondary host 1][:port][,[辅助主机2][:port]]...[/[数据库]]» [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-config-failover.html

【讨论】:

【参考方案2】:

MySQL documentation 表示可以用逗号分隔多个主机:

可以指定多个主机,用逗号分隔。这在为复制配置了多个 MySQL 服务器并且您不关心要连接的确切服务器的情况下非常有用。

不幸的是,这种行为在 Connector/NET 8.0.18 及更早版本中被破坏(它是fixed in 8.0.19)。

Connector/NET 8.0.19 将尝试多个主机 at random,除非您为每个主机指定 priority 属性。例如:

// hosts will be tried at random
host=10.10.10.10:3306,192.101.10.2:3305,localhost:3306;uid=test;password=xxxx;

// hosts will be tried in descending priority order
server=(address=192.10.1.52:3305,priority=60),(address=localhost:3306,priority=100);

如果您无法更新到 8.0.19,则有一个替代的 OSS MySQL ADO.NET 提供程序支持多个逗号分隔的主机:MySqlConnector on GitHub、NuGet。此外,它还有一个Load Balanceconnection string option,可让您指定所需的确切负载平衡类型:RoundRobinFailOverRandomLeastConnections

【讨论】:

多主机连接字符串的错误已修复:Connector/NET 8.0.19,请参阅此处的发行说明:insidemysql.com @HoomanBahreini 谢谢;我看过有关新行为的文档,但忘记了我对旧行为的答案。 是的,我看到了你对这个错误的评论:bugs.mysql.com/bug.php?id=98204 - 这是 8.0.19 引入的 ;-)

以上是关于MySQL c# 连接字符串故障转移的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 和数据库连接故障转移?

SQL Server 的多子网故障转移

配置 GlassFish JDBC 连接池以处理 Amazon RDS 多可用区故障转移

c# mysql连接字符串问题

c#连接到mysql 的连接字符串怎么写

故障转移后连接到镜像数据库