我正在尝试查看池化数据库连接如何影响一组只读MySQL数据库副本之间的命令负载平衡。连接字符串中的数据源是一个DNS条目,其中包含多个条目,这些条目以循环方式提供给客户端。
是否可以获取数据库连接对象并提取该连接用于连接的IP地址?
更新
在此代码示例中:
MySql.Data.MySqlClient.MySqlConnection _mySQL = new MySql.Data.MySqlClient.MySqlConnection(_AuroraClusterEndPoint);
更新#2
我的问题更多是关于如何确定活动连接使用的IP,而不是如何平均分配流量。
伪代码:
MySql.Data.MySqlClient.MySqlConnection _mySQL = new MySql.Data.MySqlClient.MySqlConnection(_AuroraClusterEndPoint);
_mySQL.Open();
Console.WriteLine(_mySQL.ConnectionInfo.IPAddress); //This is the unknown part
_mySQL.Close();
我将如何使用_mySQL
并提取其正在使用的IP地址?
答案 0 :(得分:0)
是,不是
不要在连接字符串中存储dns主机名。随时构建连接字符串(无论您可以还是想存储信息)。
在代码查找中构建连接字符串时,dns别名/主机名将获得其ip地址(应仅返回1个ipv4地址)
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry("hostnamehere").AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
测试它,然后调试是否获得多个地址。
一旦获得IP,您现在知道轮询机制给请求提供了哪个IP地址,您可以对其进行记录,然后使用IP地址而不是主机名来构建连接字符串。
这是我在5分钟内写的一个粗鲁又肮脏的例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
string ipAddress;
var newConnectionString = SwapConnectionStringDNSWithIP("Server=google.com;Database=myDataBase;Uid=myUsername;Pwd=myPassword;", out ipAddress);
Console.WriteLine(ipAddress);
Console.WriteLine(newConnectionString);
Console.ReadKey(true);
}
public static string SwapConnectionStringDNSWithIP(string connectionString, out string ipAddress)
{
ipAddress = null;
if (string.IsNullOrEmpty(connectionString))
return null;
var dict = new Dictionary<string, string>();
var pParts = connectionString.Split(';');
foreach (var part in pParts)
{
if (part.IndexOf('=') == -1)
break;
var sParts = part.Split('=');
if (sParts.Length != 2)
break;
string key = sParts[0].ToLower().Trim();
string value = sParts[1];
if (!dict.ContainsKey(key))
{
dict.Add(key, value);
}
}
var server = dict.ContainsKey("server") ? dict["server"] : null;
if (server == null)
return null;
var ret = Dns.GetHostEntry(server);
var addresses = ret.AddressList.Select(a => a.GetAddressBytes()).ToArray();
if (addresses != null && addresses.Length > 0)
{
ipAddress = string.Join(".", addresses[0]);
dict["server"] = ipAddress;
var newConnectionString = string.Join(string.Empty, dict.Keys.Select(k => k + "=" + dict[k] + ";").ToArray());
return newConnectionString;
}
return null;
}
}
}