获取数据库连接中使用的基础IP

时间:2018-09-20 00:16:18

标签: c# networking

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

1 个答案:

答案 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;
        }
    }
}