RavenDB - Планирование масштабируемости

Я недавно изучаю RavenDB и хотел бы использовать его.

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

Целесообразно или даже возможно ли создать несколько баз данных в одном экземпляре и реализовать их сегментирование. Тогда для масштабирования это просто вопрос распространения этих баз данных по машинам?

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

Обновление 1:

Я больше думал об этой теме. Я думаю, что моя проблема с подходом «разберись позже» заключается в том, что мне кажется трудным равномерно распределить данные по серверам в этой ситуации. У меня не будет строкового ключа, по которому я могу ранжировать (A-E, F-M ..), это будет сделано с помощью чисел.

Это оставляет два варианта, которые я вижу. Либо разбейте его по границам, так что 1-50000 находится на осколке 1, 50001-100000 находится на осколке 2, но тогда с сайтом, который стареет, скажем, таким, как этот, ваши исходные осколки будут выполнять намного меньше работы. В качестве альтернативы стратегия, которая использует циклический перебор осколков и помещает идентификатор осколка в ключ, пострадает, если вам нужно переместить документ на новый осколок, это изменит ключ и сломает URL-адреса, которые использовали этот ключ.

Итак, моя новая идея, и я снова предлагаю ее для комментариев, заключалась в том, чтобы создать с первого дня систему накопления. Это похоже на вставку идентификатора шарда в ключ, но вы начинаете с большого числа, скажем, 1000, которое вы распределяете равномерно между ними. Затем, когда придет время разделить нагрузку на сегмент, вы можете сказать, что переместить сегменты 501-1000 на новый сервер и написать логику сегментов, согласно которой 1-500 отправляются в сегмент 1, а 501-1000 - в сегмент 2. Затем, когда третий сервер подключается к сети, вы выбираете другой диапазон и настраиваете.

На мой взгляд, это дает вам возможность разделить на столько сегментов, сколько вы изначально создали сегментов, равномерно распределяя нагрузку как по количеству, так и по возрасту. Без смены ключей.

Мысли?


person Chris Sainty    schedule 16.05.2011    source источник


Ответы (2)


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

Также см:

http://ravendb.net/documentation/docs-sharding

http://ayende.com/blog/4830/ravendb-auto-sharding-bundle-design-early-gotits

http://ravendb.net/documentation/replication/sharding

person synhershko    schedule 16.05.2011
comment
Спасибо за ссылку с автоматическим шардингом, которую я не видел. Я полагаю, что моя проблема с выяснением этого позже заключается в том, что мне нужна стратегия, которая балансирует данные между серверами, а не та, которая заполняет один сервер, а затем переходит к следующему. Это вызывает проблему перемещения документов между шардами при добавлении новых. Так что я стараюсь спланировать это заранее, где это возможно. - person Chris Sainty; 16.05.2011
comment
Я обновил вопрос своим новым мышлением по этой теме. Что вы думаете об этом подходе? - person Chris Sainty; 17.05.2011
comment
Я не уверен, зачем вам все это сейчас. Вы всегда можете добавить сегментирование позже, и RavenDB сделает всю работу за вас. - person synhershko; 17.05.2011
comment
В конце концов, вам нужно рассказать ему, как перейти от ключа к осколку, верно? В этот момент вам нужно либо изменить свои ключи, разорвав веб-ссылки, которые их использовали, либо разбить на сегменты на основе диапазона ключей, оставив неравномерное распределение. - person Chris Sainty; 17.05.2011

Думаю, хорошее решение - использовать виртуальные шарды. Вы можете начать с одного сервера и направить весь виртуальный сегмент на один сервер. Используйте модуль для инкрементного идентификатора, чтобы равномерно распределить строки по виртуальным осколкам. С Amazon RDS у вас есть возможность превратить ведомое устройство в ведущее, поэтому, прежде чем изменять конфигурацию сегментирования (указать больше виртуальных сегментов на новый сервер), вы должны сделать ведомое устройство ведущим, затем обновить файл конфигурации и затем удалить все записи на новом главном сервере с использованием модуля, не соответствующего диапазону сегментов, который вы используете для нового экземпляра.

Вам также необходимо удалить строки с исходного сервера, но к настоящему времени все новые данные с идентификаторами, которые модулируются на основе новых диапазонов виртуальных сегментов, будут указывать на новый сервер. Таким образом, вам на самом деле не нужно перемещать данные, но воспользуйтесь функцией продвижения сервера Amazon RDS.

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

Я не знаю, как это можно сделать с помощью RavenDB, но он может неплохо работать с Amazon RDS, потому что Amazon уже предоставляет вам функцию репликации и продвижения серверов.

Я согласен с тем, что это должно быть решение, которое с самого начала предлагало бы беспрепятственную коммуникацию и не говорило разработчику, что нужно решать проблемы, когда они возникают. Кроме того, я обнаружил, что многие решения NoSQL, которые равномерно распределяют данные по шардам, должны работать в кластере с низкой задержкой. Так что вы должны принять это во внимание. Я пробовал использовать Couchbase с двумя разными машинами EC2 (не в выделенном кластере Amazon), и балансировка данных была очень медленной. Это тоже увеличивает общую стоимость.

Я также хочу добавить, что компания pinterest решила свои проблемы с масштабируемостью, используя 4096 виртуальных шардов.

Вам также следует изучить проблемы разбиения на страницы во многих базах данных NoSQL. При таком подходе вы можете довольно легко разбивать данные на страницы, но, возможно, не самым эффективным способом, потому что вам может потребоваться запросить несколько баз данных. Другая проблема - изменение схемы. Pinterest решил эту проблему, поместив все данные в JSON Blob в MySQL. Если вы хотите добавить новый столбец, вы создаете новую таблицу с данными нового столбца + ключ и можете использовать индекс для этого столбца. Если вам нужно запросить данные, например, по электронной почте, вы можете создать другую таблицу с адресами электронной почты + ID и поместить индекс в столбец электронной почты. Другая проблема - счетчики, я имею в виду атомные счетчики. Так что лучше вынуть эти счетчики из JSON и поместить их в столбец, чтобы вы могли увеличивать значение счетчика.

Есть отличные решения, но в конце концов вы обнаруживаете, что они могут быть очень дорогими. Я предпочел потратить время на создание собственного решения для шардинга, чтобы потом не заболеть. Если вы выберете другой путь, множество компаний ждут, когда у вас возникнут проблемы, и попросят немалые деньги для решения ваших проблем. Потому что в тот момент, когда они вам понадобятся, они знают, что вы заплатите все, чтобы ваш проект снова заработал. Это из моего собственного опыта, поэтому я ломаю себе голову, чтобы создать собственное решение для сегментирования, используя ваш подход, который также будет намного дешевле.

Другой вариант - использовать промежуточное программное обеспечение для MySQL, например ScaleBase или DBshards. Таким образом, вы можете продолжить работу с MySQL, но в то время, когда вам нужно масштабировать, у них есть хорошо зарекомендовавшее себя решение. И затраты могут быть намного ниже, чем у альтернативы.

Еще один совет: когда вы создаете свою конфигурацию для шардов, поместите атрибут write_lock, который принимает false или true. Таким образом, если установлено значение false, данные не будут записаны в этот сегмент, поэтому, когда вы получите список сегментов для определенного типа таблицы (то есть пользователей), он будет записан только в другие сегменты для того же типа. Это также хорошо для резервного копирования, так что вы можете показать дружественную ошибку для посетителей, когда вы хотите заблокировать весь сегмент при резервном копировании всех данных, чтобы получить моментальные снимки всех сегментов. Хотя я думаю, что вы можете отправить глобальный запрос на создание снимков всех баз данных с помощью Amazon RDS и использования резервного копирования на определенный момент времени.

Дело в том, что большинство компаний не будут тратить время на работу с самостоятельным решением для сегментирования, они предпочтут платить за ScaleBase. Это решение исходит от отдельных разработчиков, которые могут позволить себе платить за масштабируемое решение с самого начала, но хотят быть уверены, что когда они дойдут до нужной точки, у них будет решение. Просто посмотрите на цены там, и вы поймете, что это будет вам дорого стоить. Я с радостью поделюсь с вами своим кодом, когда закончу. На мой взгляд, вы идете лучшим путем, все зависит от логики вашего приложения. Я моделирую свою базу данных так, чтобы она была простой, без соединений, без сложных запросов агрегирования - это решает многие из моих проблем. В будущем вы можете использовать Map Reduce для решения этих задач, связанных с большими данными.

person Idan Shechter    schedule 04.11.2012