Шардинг базы данных в django с использованием MySQL

Здравствуйте, я пытался улучшить производительность базы данных и сделал несколько базовых исследований относительно наличия раздела базы данных и шардинга базы данных, а также наличия 2 баз данных, одна для записи, а другая для чтения .

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

Случай 1:- нам нужно получить все транзакции пользователя (что очень много) Случай 2:- нам нужны все данные за определенный промежуток времени для всех пользователей (что опять же огромно)

В связи с вышеуказанными сценариями я хочу реализовать db sharding

Примечание:- Я уже разделил некоторые базы данных на несколько баз данных, и они находятся на разных машинах, поэтому я хочу, чтобы это было применено ко всем этим нескольким базам данных

Что я ищу :

  1. Любая ссылка, которая может быть полезна
  2. Любой фрагмент кода, который может быть полезен

Django==3.2.13 MySql == 5.7

Позвольте мне определить некоторые термины, чтобы мы были "на одной странице":

Репликация или кластеризация -- Несколько серверов, имеющих идентичные наборы данных. Они поддерживаются в синхронизации путем автоматической передачи всех записей с одного сервера на другие. Одно из основных применений - масштабирование reads; оно позволяет одновременно подключаться большему числу клиентов.

PARTITION -- Это разбивает одну таблицу на несколько, основываясь на дате или чем-то еще. Это делается в одном экземпляре MySQL. Существует много мифов о производительности. Основное правильное использование - это чистка старых данных в огромном наборе данных.

Sharding -- Это предполагает разделение набора данных на несколько серверов. Типичный случай - разделение по user_id (или другому столбцу в данных). Примером использования является масштабирование записей. (На чистом MySQL разработчику приходится разрабатывать много кода для реализации Sharding. Существуют дополнения, особенно в MariaDB, которые помогают в этом.)

Ваш вариант использования

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

Вы говорите о SELECTs, которые возвращают миллионы строк. Ни один из вышеперечисленных способов не дает преимущества, даже если у вас есть несколько одновременных соединений, делающих это.

Пожалуйста, предоставьте некоторые цифры - размер оперативной памяти, настройки innodb_buffer_pool_size и размер набора данных (в ГБ) большого SELECTs. С этими цифрами я смогу обсудить "кэширование", ввод/вывод и производительность. Выполнение нескольких запросов к одному и тому же набору данных может выиграть от кэширования на одном сервере.

Репликация и Sharding не могут совместно использовать кэширование; Partitioning по сути не оказывает никакого влияния. То есть, я постараюсь отговорить вас от начала применения техники, которая не поможет и может навредить

Пожалуйста, опишите подробнее вашу задачу; возможно, одна из техник поможет.

P.S. Репликация, разделение и шардинг в основном ортогональны. То есть любую их комбинацию можно собрать вместе. (Но это редко происходит.)

Вернуться на верх