Шардинг базы данных в django с использованием MySQL
Здравствуйте, я пытался улучшить производительность базы данных и сделал несколько базовых исследований относительно наличия раздела базы данных и шардинга базы данных, а также наличия 2 баз данных, одна для записи, а другая для чтения .
Однако я обнаружил, что шардинг базы данных является лучшим способом из всех, поскольку отображение, обеспечиваемое шардингом, является динамическим, что является одним из требований.
Случай 1:- нам нужно получить все транзакции пользователя (что очень много) Случай 2:- нам нужны все данные за определенный промежуток времени для всех пользователей (что опять же огромно)
В связи с вышеуказанными сценариями я хочу реализовать db sharding
Примечание:- Я уже разделил некоторые базы данных на несколько баз данных, и они находятся на разных машинах, поэтому я хочу, чтобы это было применено ко всем этим нескольким базам данных
Что я ищу :
- Любая ссылка, которая может быть полезна
- Любой фрагмент кода, который может быть полезен
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. Репликация, разделение и шардинг в основном ортогональны. То есть любую их комбинацию можно собрать вместе. (Но это редко происходит.)