Получение базового IP, используемого в соединении с базой данных - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь увидеть, как соединения с базой данных в пуле влияют на балансировку нагрузки команд между партией реплик базы данных 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 голосов
/ 20 сентября 2018

Да и нет,

Не сохраняйте имя хоста dns в строке подключения.Создайте строку подключения на лету (в любом случае вы можете или хотите сохранить информацию).

При построении строки подключения в коде ищите псевдоним / имя хоста dns, чтобы получить его IP-адреса (должен возвращать только 1ipv4 address)

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...