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

Чтение/чтение-запись URI для Amazon Web Services RDS

Я использую HAProxy для балансировки нагрузки AWS RDS (MySQL) для своего приложения, написанного с использованием Flask.

Файл HAProxy.cfg имеет следующую конфигурацию для БД

listen mysql
bind 127.0.0.1:3306
mode tcp
balance roundrobin
option mysql-check user haproxy_check
option log-health-checks
server db01 MASTER_DATABSE_ENDPOINT.rds.amazonaws.com
server db02 READ_REPLICA_ENDPOINT.rds.amazonaws.com

Я использую SQLALCHEMY, и его URI:

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://USER:[email protected]:3306/DATABASE'

но когда я запускаю API в своей тестовой среде, API-интерфейсы, которые просто читают данные из БД, выполняются просто отлично, но API-интерфейсы, которые что-то записывают в БД, выдают мне в основном следующие ошибки:

(pymysql.err.InternalError) (1290, 'The MySQL server is running with the --read-only option so it cannot execute this statement')

Я думаю, что теперь в этом сценарии мне нужно использовать 2 URL-адреса, один для операции read-only и один для writes.

Как это работает с Flask и SQLALCHEMY с HAProxy? Как указать моему приложению использовать один URL-адрес для write операций и другой HAProxy URL-адрес для read-only операций?

Я не нашел помощи в документации SQLAlchemy.


Ответы:


1

Привязки

Flask-SQLAlchemy может легко подключаться к нескольким базам данных. Для этого он предварительно настраивает SQLAlchemy для поддержки нескольких «привязок».

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://USER:PASSWORD@DEFAULT:3306/DATABASE'
SQLALCHEMY_BINDS = {
    'master': 'mysql+pymysql://USER:PASSWORD@MASTER_DATABSE_ENDPOINT:3306/DATABASE',
    'read': 'mysql+pymysql://USER:PASSWORD@READ_REPLICA_ENDPOINT:3306/DATABASE'
}

Ссылаясь на привязки:

db.create_all(bind='read') # from read only
db.create_all(bind='master') # from master
26.03.2018
  • Я пробовал это, но как мое приложение узнает, какой URI использовать для read, а какой для write? 26.03.2018
  • используя bind='master', вам нужно сообщить своему приложению, чтобы оно записывало в мастер, поскольку вы не можете писать для чтения реплик 26.03.2018
  • Хорошо. Вы имеете в виду использовать bind='master' в API, которые являются writing? 26.03.2018
  • Новые материалы

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

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

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

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

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

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

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