Что такое шардинг и почему это важно?

196

Я думаю, что я понимаю, что осколки - это возврат ваших нарезанных данных (осколков) в простое для работы с агрегатом, что имеет смысл в контексте. Это верно?

Обновление : я думаю, я борюсь здесь. По моему мнению, уровень приложений не должен определять, где должны храниться данные. В лучшем случае это должен быть осколочный клиент. Оба ответа ответили на вопрос «что, но не почему?». Какие последствия это имеет помимо очевидного прироста производительности? Достаточно ли этих усилений для компенсации нарушения MVC? Черепок является наиболее важным в приложениях очень большого масштаба или он применяется в более мелких приложениях?

ojblass
источник
1
Будет ли полезен один из этих вебинаров? vimeo.com/26742356 slideshare.net/rightscale/... vimeo.com/32541189

Ответы:

193

Sharding - это еще одно название для «горизонтального разделения» базы данных. Возможно, вы захотите найти этот термин, чтобы прояснить его.

Из Википедии :

Горизонтальное разбиение - это принцип проектирования, согласно которому строки таблицы базы данных хранятся отдельно, а не по столбцам (как при нормализации). Каждый раздел является частью сегмента, который, в свою очередь, может находиться на отдельном сервере базы данных или в физическом местоположении. Преимущество заключается в том, что количество строк в каждой таблице уменьшается (это уменьшает размер индекса, что повышает производительность поиска). Если сегментирование основано на некотором реальном аспекте данных (например, европейские клиенты против американских клиентов), то можно легко и автоматически вывести соответствующее членство в шарде и запросить только соответствующий шард.

Еще немного информации о шардинге:

Во-первых, каждый сервер базы данных идентичен, имея одинаковую структуру таблицы. Во-вторых, записи данных логически разделяются в изолированной базе данных. В отличие от многораздельной базы данных, каждая полная запись данных существует только в одном сегменте (если нет зеркалирования для резервного копирования / избыточности) со всеми операциями CRUD, выполняемыми только в этой базе данных. Возможно, вам не понравится используемая терминология, но это действительно другой способ организации логической базы данных на более мелкие части.

Обновление: Вы не сломаете MVC. Работа по определению правильного шарда, в котором будут храниться данные, будет прозрачно выполняться вашим уровнем доступа к данным. Там вам нужно будет определить правильный шард на основе критериев, которые вы использовали для шардирования вашей базы данных. (Поскольку вы должны вручную разделить базу данных на несколько различных сегментов на основе конкретных аспектов вашего приложения.) Затем вы должны позаботиться о загрузке и сохранении данных из / в базу данных, чтобы использовать правильный фрагмент.

Возможно, этот пример с кодом Java проясняет (о проекте Hibernate Shards ), как это будет работать в реальном сценарии.

Для решения вопроса « why sharding»: это в основном только для очень крупных приложений с большим количеством данных. Во-первых, это помогает минимизировать время отклика для запросов к базе данных. Во-вторых, вы можете использовать более дешевые машины более низкого уровня для размещения ваших данных вместо одного большого сервера, которого может уже не хватить.

MicSim
источник
1
Простите, но база данных не должна определять, где хранить данные. Влияет ли это на код на уровне приложения?
ojblass
6
Я давно пытаюсь понять, чем это отличается от горизонтального разбиения, и ссылка в вашем ответе вроде доказывает, что нет никакой разницы. Как кто-то говорит в комментариях к посту Тео Шлосснагла: «... Если вы из традиционной культуры баз данных делаете горизонтальное разбиение, если вы из Web-культуры, это« Sharding »...»
andreister
@andreister Из того, что я читаю, сегментирование концептуально отличается тем, что оно определяется горизонтальным масштабированием между несколькими логическими или физическими узлами (в моем понимании (mySQL) несколько баз данных, скорее всего, размещены на другом логическом оборудовании). Горизонтальное разбиение является менее конкретным термином, из которого «Sharding» является подмножеством. Снова используя mySQL в качестве примера, раздел mySQL обрабатывается одним экземпляром БД, который на 100% прозрачен для приложения. Подход с использованием шардинга будет включать либо прокси-сервер, либо приложение, которое разумно выберет, какой экземпляр.
NateDSaint
Согласно википедии «Каждый отдельный раздел называется осколком или осколком базы данных». Что немного отличается от текста в ответе, который гласит: «Каждый раздел является частью шарда».
Кевин Уилер
В вики-статье, на которую вы ссылаетесь, проводится небольшое различие между этими двумя терминами. Горизонтальное разбиение разделяет одну или несколько таблиц по строкам, как правило, в пределах одного экземпляра схемы и сервера базы данных. / *** / Sharding выходит за рамки этого: он разделяет проблемные таблицы таким же образом, но делает это потенциально между несколькими экземплярами схемы. en.wikipedia.org/wiki/…
Питер Кокк
38

Если у вас есть запросы к СУБД, для которых локальность довольно ограничена (скажем, пользователь только запускает селекторы с «где username = $ my_username»), имеет смысл поместить все имена пользователей, начинающиеся с AM, на один сервер и все из NZ с другой. Таким образом, вы получаете почти линейное масштабирование для некоторых запросов.

Короче говоря : шардинг - это в основном процесс распределения таблиц на разные серверы, чтобы равномерно распределить нагрузку на оба сервера.

Конечно, в реальности все намного сложнее. :)

Байера
источник
Так что шардинг влияет на дизайн данных, которые вы храните ... извините, если я не совсем понимаю.
ojblass
Разве это не одно горизонтальное разделение?
harunurhan
18

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

Зачем нам нужны распределенные системы?

  • Увеличение доступности.
  • Простое расширение.
  • Экономика: создание сети меньших компьютеров с использованием одного большого компьютера обходится дешевле.

Вы можете прочитать больше здесь: Преимущества распределенной базы данных

Как шардинг поможет добиться распределенной системы?

Вы можете разделить поисковый индекс на N разделов и загрузить каждый индекс на отдельный сервер. Если вы запросите один сервер, вы получите 1 / Nth результатов. Таким образом, чтобы получить полный набор результатов, типичная распределенная поисковая система использует агрегатор, который будет накапливать результаты с каждого сервера и объединять их. Агрегатор также распространяет запрос на каждый сервер. Эта агрегаторная программа называется MapReduce в терминологии больших данных. Другими словами, распределенные системы = Sharding + MapReduce (хотя есть и другие вещи).

Визуальное представление ниже. Распределенная Система

Химаншу Кансал
источник
7

Черепок является наиболее важным в приложениях очень большого масштаба или он применяется в более мелких приложениях?

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

Кроме того, будущее, вероятно, будет чем-то веселым и захватывающим, как массивное объектное «облако», которое стирает все потенциальные ограничения производительности, верно? :)

earino
источник
Можете ли вы поделиться ситуацией, когда вам нужно шардинг
Гаган Бурде
4

Изначально Sharding был придуман инженерами Google, и вы можете видеть, что он довольно активно использовался при написании приложений на Google App Engine. Поскольку существуют жесткие ограничения на количество ресурсов, которые могут использоваться вашими запросами, и поскольку сами запросы имеют строгие ограничения, разделение не только поощряется, но и почти полностью обеспечивается архитектурой.

Еще одно место, где можно использовать сегрегацию, - это уменьшить конкуренцию за объекты данных. При создании масштабируемых систем особенно важно следить за частями записи, которые часто записываются, потому что они всегда являются узким местом. Хорошее решение состоит в том, чтобы отделить эту конкретную сущность и записать ее в несколько копий, а затем прочитать итоги. Примером этого «защищенного счетчика по отношению к GAE: http://code.google.com/appengine/articles/sharding_counters.html

lampShaded
источник
7
<< Шардинг изначально был придуман инженерами Google >> - не соответствует действительности. Google был основан в 1998 году. Scholar.google.com находит статьи 1980-х годов, такие как «Отбрасывание устаревшей информации в реплицированной системе баз данных» ... Система высокодоступных реплицированных данных (SHARD), разработанная в CCA ... Я помню, как слышал людей говорить о шардинге тогда.
Крейзи Глеу
3

Sharding делает больше, чем просто горизонтальное разбиение. Согласно статье в Википедии ,

Горизонтальное разбиение разделяет одну или несколько таблиц по строкам, как правило, в пределах одного экземпляра схемы и сервера базы данных. Это может дать преимущество за счет уменьшения размера индекса (и, следовательно, усилий по поиску), при условии, что существует некоторый очевидный, надежный, неявный способ определить, в каком разделе будет найдена конкретная строка, без необходимости предварительного поиска в индексе, например, в классическом Пример таблиц CustomersEast и CustomersWest, где их почтовый индекс уже указывает, где они будут найдены.

Разделение выходит за рамки этого: оно разделяет проблемные таблицы таким же образом, но делает это между потенциально несколькими экземплярами схемы. Очевидным преимуществом будет то, что поисковая нагрузка для большой многораздельной таблицы теперь может быть разделена на несколько серверов (логических или физических), а не только на несколько индексов на одном логическом сервере.

Также,

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

Кришна Рати
источник
1

По моему мнению, на уровне приложений не должно быть никаких бизнес-данных, определяющих, где должны храниться данные

Это хорошее правило, но, как и большинство вещей, это не всегда правильно.

Когда вы делаете свою архитектуру, вы начинаете с ответственности и сотрудничества. После того, как вы определили свою функциональную архитектуру, вы должны сбалансировать нефункциональные силы.

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

Ханс Малербе
источник
1
Уровень приложений все еще может создавать разделение логики доступа к данным и бизнес-правил. Это просто означает, что у вас есть дополнительные концептуальные слои в слое «уровень приложения».
Эрик