RavenDB - Планирование масштабируемости - PullRequest
8 голосов
/ 16 мая 2011

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

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

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

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

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

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

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

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

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

Мысли?

Ответы [ 2 ]

4 голосов
/ 16 мая 2011

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

Также см .:

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

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

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

1 голос
/ 04 ноября 2012

Я думаю, что хорошим решением является использование виртуальных осколков. Вы можете начать с одного сервера и направить все виртуальные осколки на один сервер. Используйте модуль инкрементного идентификатора, чтобы равномерно распределить строки по виртуальным осколкам. В 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 для решения этих запросов больших данных.

...