【问题标题】:Getting underlying IP used in database connection获取用于数据库连接的底层 IP
【发布时间】:2018-09-21 00:38:39
【问题描述】:

我正在尝试查看池化数据库连接如何影响一组只读 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 地址?

【问题讨论】:

    标签: c# networking


    【解决方案1】:

    是与否,

    不要将 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;
            }
        }
    }
    

    【讨论】:

    • 我已经用我正在寻找的示例更新了我的问题。我不认为我很清楚自己在追求什么。
    • 您需要分解连接字符串,从中获取主机名,对其进行 DNS 查找,将 ipaddress 放在连接字符串中而不是主机名中,然后继续创建使用查找的 IP 地址进行连接。正如刚才提到的。该 IP 地址将是循环 DNS 为您提供的。
    • 是的,这是可能的,但是您需要从连接字符串中提取 dns 主机名,使用 Dns.GetHostEntry 获取 ip,然后将 ip 放入连接字符串中。如果是 SqlServer,你可以使用 SqlConnectionStringBuilder,mysql 你可能需要通过字符串操作来解析它。
    • 我已更新我的答案以包含完整的工作代码,用于将连接字符串中的服务器替换为查找 IP 地址。这应该是来自 DNS(循环)的 IP 地址,如果循环给它一个不同的解析,它应该在不同的 dns 分辨率上改变。但是有了这个你就知道它在代码中用于连接字符串的 IP。因此,您可以将该信息添加到日志等,甚至查询中。
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2021-02-17
    • 2011-06-02
    • 1970-01-01
    • 2015-12-02
    • 2019-10-24
    相关资源
    最近更新 更多