Я думаю, что хорошим решением является использование виртуальных осколков. Вы можете начать с одного сервера и направить все виртуальные осколки на один сервер. Используйте модуль инкрементного идентификатора, чтобы равномерно распределить строки по виртуальным осколкам. В Amazon RDS у вас есть возможность превратить подчиненное устройство в главное, поэтому перед тем, как изменить конфигурацию разделения (укажите больше виртуальных сегментов на новом сервере), вы должны сделать подчиненное устройство главным, затем обновить файл конфигурации и затем удалить все записи нового мастера, использующие модуль, который не соответствует диапазону сегментов, который вы используете для нового экземпляра.
Вам также необходимо удалить строки с исходного сервера, но теперь все новые данные с идентификаторами, которые являются модульными на основе новых диапазонов виртуальных сегментов, будут указывать на новый сервер. Таким образом, вам на самом деле не нужно перемещать данные, но используйте функцию продвижения сервера Amazon RDS.
Затем вы можете создать реплику с исходного сервера. Вы создаете уникальный идентификатор как: Shard ID + идентификатор типа таблицы + инкрементный номер. Поэтому, когда вы запрашиваете базу данных, вы знаете, к какому фрагменту обращаться и получать данные.
Я не знаю, как это можно сделать с RavenDB, но он вполне может работать с Amazon RDS, потому что Amazon уже предоставляет вам функцию репликации и продвижения сервера.
Я согласен с тем, что они должны быть решением, которое с самого начала предлагает полную коммуникабельность и не говорит разработчику разобраться с проблемами, когда они возникают. Кроме того, я обнаружил, что многие NoSQL-решения, которые равномерно распределяют данные по шардам, должны работать в кластере с низкой задержкой. Так что вы должны принять это во внимание. Я пытался использовать Couchbase с двумя разными машинами EC2 (не в выделенном кластере Amazon), и балансировка данных была очень очень медленной. Это добавляет к общей стоимости тоже.
Я также хочу добавить, что то, что сделал Пентос для решения проблем масштабируемости, используя 4096 виртуальных осколков.
Вам также необходимо изучить проблемы с подкачкой во многих базах данных NoSQL. При таком подходе вы можете довольно просто размещать данные на страницах, но, возможно, не самым эффективным способом, поскольку вам может потребоваться запросить несколько баз данных. Еще одна проблема - изменение схемы. Pinterest решил эту проблему, поместив все данные в BLSON-объект JSON в MySQL. Если вы хотите добавить новый столбец, вы создаете новую таблицу с новым столбцом data + key и можете использовать Index для этого столбца. Если вам нужно запросить данные, например, по электронной почте, вы можете создать другую таблицу с адресами электронной почты + идентификатор и поместить индекс в столбец электронной почты. Счетчики - это еще одна проблема, я имею в виду атомные счетчики. Поэтому лучше взять эти счетчики из JSON и поместить их в столбец, чтобы можно было увеличить значение счетчика.
Есть отличные решения, но в конце дня вы обнаружите, что они могут быть очень дорогими. Я предпочел потратить время на создание своего собственного решения для шардинга и избежать головной боли в дальнейшем. Если вы выберете другой путь, есть множество компаний, которые ждут, чтобы вы попали в беду и попросили довольно много денег, чтобы решить ваши проблемы. Потому что в тот момент, когда они вам нужны, они знают, что вы заплатите все, чтобы ваш проект снова заработал. Это из моего собственного опыта, поэтому я ломаю голову над созданием собственного решения шардинга, используя ваш подход, который также будет намного дешевле.
Другой вариант - использовать промежуточные программные решения для MySQL, такие как ScaleBase или DBshards. Таким образом, вы можете продолжить работу с MySQL, но в то время, когда вам нужно масштабировать, у них есть хорошо проверенное решение. И затраты могут быть намного ниже, чем альтернатива.
Еще один совет: при создании конфигурации для шардов добавьте атрибут write_lock, который принимает значение false или true.Таким образом, когда оно ложно, данные не будут записываться в этот сегмент, поэтому, когда вы извлекаете список сегментов для определенного типа таблицы (т. Е. Пользователей), они будут записываться только в другие сегменты для того же типа.Это также хорошо для резервного копирования, поэтому вы можете показывать дружественную ошибку для посетителей, когда вы хотите заблокировать все осколки при резервном копировании всех данных, чтобы получить моментальные снимки всех осколков на определенный момент времени.Хотя я думаю, что вы можете отправить глобальный запрос на создание моментальных снимков всех баз данных с помощью Amazon RDS и использование резервного копирования на определенный момент времени.
Дело в том, что большинство компаний не будут тратить время на работу с решением для шардинга DIY,они предпочтут платить за ScaleBase.Это решение разработано отдельными разработчиками, которые могут позволить себе платить за масштабируемое решение с самого начала, но хотят быть уверены, что когда они достигнут того, что им нужно, у них есть решение.Просто посмотрите на цены, и вы сможете понять, что это будет стоить вам МНОГО.Я с радостью поделюсь с вами своим кодом, как только закончу.На мой взгляд, вы идете по наилучшему пути, все зависит от логики вашего приложения.Я моделирую свою базу данных как простую, без объединений, не сложных запросов агрегации - это решает многие из моих проблем.В будущем вы можете использовать Map Reduce для решения этих запросов больших данных.