Nano Hash - криптовалюты, майнинг, программирование

Случайный «временный сбой в разрешении имен» при подключении к кластеру AWS Aurora

Я использую кластер базы данных Amazon Web Services RDS Aurora 5.6. С этими экземплярами базы данных обращается пара лямбда-выражений, написанных на Python. Теперь все работает нормально, но вдруг, пару дней назад, код python иногда начинает выдавать следующую ошибку:

[ERROR] InterfaceError: 2003: не удается подключиться к серверу MySQL на «CLUSTER-DOMAIN: 3306» (-3 Временный сбой в разрешении имен)

Это происходит примерно в 1 раз на 1000 новых подключений. Что интересно, я не трогал всю эту услугу последние пару дней (с тех пор, как это начало происходить). Все лямбды используют официальный клиент MySQL-коннектора и подключаются при каждой инициализации с помощью следующего фрагмента:

import mysql.connector as mysql
import os

connection = mysql.connect(user=os.environ['DATABASE_USER'],
                         password=os.environ['DATABASE_PASSWORD'],
                         database=os.environ['DATABASE_NAME'],
                         host=os.environ['DATABASE_HOST'],
                         autocommit=True)

Чтобы исключить, что это проблема клиента Python MySQL, я добавил следующее, чтобы разрешить хост:

import os
import socket

host = socket.gethostbyname(os.environ['DATABASE_HOST'])

Также здесь я иногда получаю следующую ошибку:

[ERROR] gaierror: [Errno -2] Имя или служба неизвестны

Теперь я подозреваю, что это как-то связано с DNS, но поскольку я использую только конечную точку кластера, я мало что могу с этим поделать. Интересно то, что я недавно столкнулся с точно такой же проблемой в другом регионе, с той же настройкой (кластер Aurora 5.6, лямбда-выражения в python, подключающиеся к нему), и там происходит то же самое.

Я попытался перезапустить все машины в кластере, но проблема все еще возникает. Это действительно проблема с DNS? Что я могу сделать, чтобы этого не произошло?


  • Хмммм, это интересный вопрос - эээ, так вы используете имя кластера Aurora по умолчанию или засунули его в свой собственный домен? Какую Аврору вы используете обычную или бессерверную? 01.10.2019
  • Я использую имя кластера по умолчанию, а не имя личного домена. Используя обычный! 01.10.2019
  • Хм, я думаю, что это ошибка библиотеки, а не проблема AWS (я никогда не сталкивался с ней даже при миллионах запросов) - если вы попробуете / поймаете эту ошибку и повторите попытку подключения, она будет работать? Также вы закрываете соединение при каждом выполнении? 01.10.2019
  • При этом стоит поднять заявку в службу поддержки одновременно с этим, поскольку это может быть странной ошибкой Aurora. 01.10.2019
  • Да, я думал, что это ошибка библиотеки, поэтому я попробовал библиотеку сокетов из Python, но все еще не работает. Действительно, это сработает, если я попытаюсь повторить попытку, но глупо, что я должен добавить повтор для чего-то столь же простого, как разрешение хоста. И да! Я закрываю соединения после каждого казни. Я также убедился, что открыто не слишком много одновременных подключений. Но все же проблема не может быть связана с этим, поскольку разрешение хоста с помощью библиотеки сокетов также вызывает проблемы. 01.10.2019
  • Я бы пригласил друга в службу поддержки, если у вас есть частное репо, которым вы можете поделиться, я могу попробовать воспроизвести его в моем стеке? Посмотрим, смогу ли я что-нибудь найти, но это очень неприятная ошибка. 01.10.2019

Ответы:


1

Служба поддержки AWS сообщила мне, что эта ошибка, вероятно, вызвана квотой трафика в VPC AWS.

Согласно их документации по квотам DNS < / а>:

Каждый инстанс Amazon EC2 ограничивает количество пакетов, которые могут быть отправлены на DNS-сервер, предоставленный Amazon, до 1024 пакетов в секунду для каждого сетевого интерфейса. Эту квоту нельзя увеличить. Количество DNS-запросов в секунду, поддерживаемых DNS-сервером, предоставленным Amazon, зависит от типа запроса, размера ответа и используемого протокола. Для получения дополнительной информации и рекомендаций по масштабируемой архитектуре DNS см. Технический документ по гибридным облачным DNS-решениям для Amazon VPC.

Важно отметить, что здесь рассматривается показатель пакетов в секунду на каждый ENI. Что в этом важного? Что ж, может быть не сразу очевидно, что, хотя фактическое количество пакетов на запрос варьируется, обычно существует несколько пакетов на запрос DNS.

Хотя эти пакеты нельзя увидеть в журналах потоков VPC, просмотрев собственные записи пакетов, я могу увидеть некоторые разрешения, состоящие примерно из 4 пакетов.

К сожалению, я не могу много сказать о техническом документе; на данном этапе я не совсем считаю внедрение гибридной службы DNS «хорошим» решением.

Решения

Я ищу способы снизить риск возникновения этой ошибки и ограничить ее влияние, когда она действительно возникает. На мой взгляд, для этого есть несколько вариантов:

  1. Заставить лямбда-функции разрешить DNS кластера Aurora, прежде чем делать что-либо еще, и использовать частный IP-адрес для подключения и обрабатывать сбои с экспоненциальным откатом. Чтобы свести к минимуму затраты на ожидание reties, я установил общий тайм-аут 5 секунд для разрешения DNS. Это число включает все время ожидания возврата.
  2. Создание множества недолговечных подключений связано с потенциально дорогостоящими накладными расходами, даже если вы закрываете соединение. Подумайте об использовании пула соединений на стороне клиента, поскольку распространено заблуждение, что пул соединений Aurora достаточен для обработки накладных расходов, связанных с множеством недолговечных соединений.
  3. По возможности старайтесь не полагаться на DNS. Aurora автоматически обрабатывает отработку отказа и повышение / понижение роли экземпляров, поэтому важно знать, что вы всегда подключены к «правильному» (или пишете, в некоторых случаях: P) экземпляру. Поскольку для распространения обновлений DNS-имени кластера Aurora может потребоваться время, даже с его 5-секундным TTL, может быть лучше использовать таблицу INFORMATION_SCHEMA.REPLICA_HOST_STATUS, в которой MySQL предоставляет метаданные об экземплярах БД «почти в реальном времени». Обратите внимание, что таблица «содержит метаданные для всего кластера». Если вы cbf, обратите внимание на вариант 4.
  4. Используйте умный драйвер, который:
    # P8 #

Не решения

Первоначально я подумал, что было бы неплохо создать CNAME, указывающий на кластер, но теперь я не уверен, что кэширование результатов запроса Aurora DNS является разумным. Для этого есть несколько причин, которые обсуждаются с разной степенью детализации в Руководство по управлению подключением Aurora:

  • # P10 #
  • # P11 #

Надеюсь, это поможет!

27.01.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..