Шардинг MySQL и поиск по шардам?

Здравствуйте.

На данный момент работаю над небольшим приложением на Node.js. В приложении используется MySQL (MariaDB) для хранения данных, Redis для кеширования и Express.js. Приложение пока работает на 1 сервере, но возникла необходимость масштабировать приложение и соответственно распределить данные из БД на несколько серверов. Начал разбираться с шардингом и репликацией БД.

На данный момент пришел к решению выбрать горизонтальный шардинг как основной инструмент масштабирования данных в БД. Но так как большого опыта с шардингом у меня нет, то спрашиваю совет здесь. Как разбить данные по шардам и как хранить данные примерно понятно, но остались некоторые вопросы.

1) Как работать из Node.js приложения одновременно с десятками шардов (серверов БД)? Сейчас я работаю только с 1 инстансом БД, а после шардинга придется для одного запроса к API приложения делать несколько соединений к разным шардам БД и несколько запросов?

2) Как осуществлять поиск / извлечение данных из разных шардов? Например, на одной странице необходимо отобразить одновременно 10 юзеров (имя, аватар и т.п.), которые распределены по разным шардам. Что делать в этом случае? Можно также хранить важные данные в кеше (Memcache/Redis), но при этом, чтобы сделать поиск / извлечь данные нужно также как-то объединить кешы в кластер. Можно ли индексировать данные на шардах с помощью ElasticSearch, а потом уже делать поиск?

3) На какие подводные камни стоит обратить внимание на начальном этапе, чтобы избежать проблем в будущем?

Поделитесь, пожалуйста, собственным опытом и советами.

Спасибо.
  • Вопрос задан
  • 2576 просмотров
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Классический вопрос из серии XY Problem.
Вместо того чтобы писать "я не знаю что мне надо, но вообразил что мне нужен шардинг, поэтому расскажите как им пользоваться" надо писать "масштабирование мне требуется по такой-то причине и с такими-то условиями. подскажите наилучший вариант".

И тогда тебе подскажут ответ, в порядке частоты причин, по которым задают этот вопрос:

1. Нет, бояться миллиона записей не надо. Mysql потянет во много раз больше.
2. Сделать репликацию мастер-слейв, с нужным количеством слейвов.
3. Возможно, под какие-то условия подойдет и шардинг.

Update.
Как и ожидалось, все свелось к п.1.
Ответ написан
art1z
@art1z
Программист-многостаночник в EffectiveSoft
Шардинг имеет смысл именно когда данные чаще всего достаются из одного шарда. Картинки, например, или статистика по различным серверам/сервисам. Юзера, как основаная сущность приложения, должны физически лежать в одной базе. И даже теоретически макс возможные 6 млрд пользователей в базе займут пару терабайт, что для мускула не проблема - https://habrahabr.ru/post/64851/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы