Що таке загострення і чому це важливо?


196

Я думаю, що я розумію, що загострення - це повернення ваших нарізаних даних (осколків) у просту справу з агрегатом, що має сенс у контексті. Це правильно?

Оновлення : Напевно, я тут борюся. На мою думку, у рівні програми не повинно бути бізнесу, яке визначає, де слід зберігати дані. У кращому випадку це повинен бути шахрайський клієнт. Обидва відповіді відповіли, що це, але не чому це важливий аспект. Які наслідки це має поза очевидним підвищенням продуктивності? Чи є ці вигоди достатньою для компенсації порушення MVC? Чи важливим є заточування здебільшого у дуже масштабних програмах чи воно стосується менших масштабів?


1
Чи корисний би один із цих вебінарів? vimeo.com/26742356 slideshare.net/rightscale/… vimeo.com/32541189

Відповіді:


193

Шардінг - лише інша назва "горизонтального розділення" бази даних. Ви можете шукати цей термін, щоб зрозуміти його.

З Вікіпедії :

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

Ще кілька відомостей про заточування:

По-перше, кожен сервер бази даних ідентичний, має однакову структуру таблиці. По-друге, записи даних логічно розбиваються в заточеній базі даних. На відміну від розділеної бази даних, кожен повний запис даних існує лише в одному фрагменті (якщо тільки немає дзеркального відображення для резервного копіювання / надмірності) з усіма операціями CRUD, що виконуються саме в цій базі даних. Можливо, вам не сподобається використовувана термінологія, але це дійсно представляє інший спосіб організації логічної бази даних на менші частини.

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

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

Щоб вирішити " why sharding": це в основному лише для дуже масштабних додатків з великою кількістю даних. По-перше, це допомагає мінімізувати час відповідей на запити бази даних. По-друге, ви можете використовувати більш дешеві машини "нижчого класу" для розміщення ваших даних замість одного великого сервера, якого більше не вистачить.


1
Пробачте, але чи не повинна база даних визначати, де зберігати дані. Це впливає на код на рівні програми?
ojblass

6
Я давно намагаюся зрозуміти, чим це відрізняється від горизонтального розподілу, і посилання у вашій відповіді ніби доводить, що різниці немає. Як хтось каже в коментарях до допису Тео Шлосснагле, "... Якщо ви з традиційної культури баз даних, ви робите горизонтальне розділення, якщо ви робите веб-культуру, це" Шардінг "..."
andreister

@andreister З того, що я читаю, шардинг концептуально відрізняється тим, що він визначається горизонтальним масштабуванням через декілька логічних або фізичних вузлів (у випадку мого розуміння (mySQL) декількох баз даних, швидше за все, розміщених на різних логічних апаратурах). Горизонтальний розподіл - менш специфічний термін, серед якого "Шардінг" - це підмножина. Знову використовуючи mySQL як приклад, розділ mySQL обробляє один екземпляр db, який на 100% прозорий для програми. Підхід до загострення повинен включати або проксі, або додаток, який розумно обрав, який саме примірник.
NateDSaint

Згідно з вікіпедією "Кожен окремий розділ позначається як осколок або фрагмент бази даних". Що дещо відрізняється від тексту у відповіді, що говорить "Кожен розділ є частиною фрагмента".
Кевін Вілер

Стаття wiki, на яку ви посилаєтесь, незначно розрізняє ці два терміни. Горизонтальний розподіл розбиває одну або кілька таблиць за рядками, як правило, в межах одного екземпляра схеми та сервера баз даних. / *** / Шардінг виходить за рамки цього: він поділяє проблемну таблицю (и) таким же чином, але це робить через потенційно декілька примірників схеми. en.wikipedia.org/wiki/…
Peeter Kokk

38

Якщо у вас є запити до СУБД, для яких місцевість досить обмежена (скажімо, користувач створює лише вибрані з "де ім'я користувача = $ my_username") має сенс розмістити всі імена користувачів, починаючи з AM на одному сервері, і все з NZ з іншого. Цим ви отримуєте майже лінійне масштабування для деяких запитів.

Короткий розповідь : Шардінг - це в основному процес розподілу таблиць на різних серверах, щоб збалансувати навантаження на обидва однаково.

Звичайно, це набагато складніше насправді. :)


Тож загострення впливає на дизайн даних, які ви зберігаєте ... Вибачте, якщо я не зовсім розумію.
ojblass

Це не один горизонтальний розділ?
harunurhan

18

Шардінг знаходиться в горизонтальному положенні ( рядок мудрий ) розбиття бази даних , на відміну від вертикальних ( колонки мудрий ) розбиття , який є Нормалізацією . Він розділяє дуже великі бази даних на менші, швидші та простіші управління частинами, які називаються фрагментами даних. Це механізм досягнення розподілених систем.

Навіщо нам потрібні розподілені системи?

  • Підвищена доступність.
  • Легше розширення.
  • Економіка: це дешевше створити мережу менших комп'ютерів потужністю одного великого комп’ютера.

Детальніше ви можете прочитати тут: Переваги розподіленої бази даних

Як шардинг допомагає досягти розподіленої системи?

Ви можете розділити індекс пошуку на N розділів і завантажити кожен індекс на окремий сервер. Якщо ви запитаєте один сервер, ви отримаєте 1 / Nth результатів. Отже, щоб отримати повний набір результатів, типова розподілена система пошуку використовує агрегатор, який збиратиме результати з кожного сервера та поєднує їх. Агрегатор також розподіляє запит на кожному сервері. Ця програма агрегатора називається MapReduce в термінології великих даних. Іншими словами, розподілені системи = Sharding + MapReduce (Хоча теж є інші речі).

Наочне зображення нижче. Розподілена система


7

Чи важливим є заточування здебільшого у дуже масштабних програмах чи воно стосується менших масштабів?

Шардування викликає занепокоєння, якщо і лише якщо ваші потреби перевищують те, що може обслуговуватися одним сервером баз даних. Це надзвичайний інструмент, якщо у вас є чіткі дані та ви маєте неймовірно високі вимоги до масштабованості та продуктивності. Я б здогадався, що протягом своїх 12 років я був професіоналом програмного забезпечення, я стикався з однією ситуацією, яка могла б отримати користь від загострення. Це передова техніка з дуже обмеженою застосованістю.

Крім того, майбутнє, мабуть, буде чимось веселим та захоплюючим, як масивна об’єктна «хмара», яка стирає всі потенційні обмеження продуктивності, правда? :)


Чи можете ви поділитися ситуацією, коли вам потрібно заточування
Гаган Берде

4

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

Ще одне місце може бути використане для зменшення суперечок щодо суб'єктів даних. Особливо важливо при створенні масштабованих систем стежити за тими даними, які часто записуються, оскільки вони завжди є вузьким місцем. Хорошим рішенням є відшарування цієї конкретної сутності та написання у декілька копій, а потім зчитування загальної кількості. Приклад цього "стриманого лічильника wrt GAE: http://code.google.com/appengine/articles/sharding_counters.html


7
<< Шардінг спочатку був створений інженерами Google >> - неправда. Google була заснована в 1998 році. Scilar.google.com знаходить документи 1980-х років, такі як "Відхилення застарілої інформації в реплікуваній системі баз даних" ... Система високодоступних реплікаційних даних (SHARD), розроблена в CCA ... Я пам'ятаю, як чули людей говорити про загострення тоді.
Krazy Glew

3

Шардінг робить більше, ніж просто горизонтальне розділення. Відповідно до статті вікіпедії ,

Горизонтальний розподіл розбиває одну або кілька таблиць за рядками, як правило, в межах одного екземпляра схеми та сервера баз даних. Він може запропонувати перевагу, зменшивши розмір індексу (і, таким чином, пошукові зусилля) за умови наявності явного, надійного, неявного способу визначити, у якому розділі буде знайдений конкретний рядок, без попереднього пошуку індексу, наприклад, класичний приклад таблиць "CustomersEast" та "CustomersWest", де їх поштовий індекс вже вказує, де вони будуть знайдені.

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

Також,

Розбивання осколків на кілька ізольованих екземплярів вимагає більше, ніж просто горизонтальне розділення. Очікувані досягнення ефективності будуть втрачені, якщо запит на базу даних вимагає запитання обох екземплярів, просто для отримання простої таблиці розмірів. Крім розділення, шардінг, таким чином, розбиває великі розподільні таблиці на серверах, тоді як менші таблиці копіюються як повні одиниці


1

На мою думку, у рівні програми не повинно бути бізнесу, яке визначає, де слід зберігати дані

Це хороше правило, але, як і більшість речей, не завжди правильне.

Коли ви займаєтеся своєю архітектурою, ви починаєте з обов'язків та співпраці. Після того як ви визначите свою функціональну архітектуру, вам доведеться збалансувати нефункціональні сили.

Якщо одна з цих нефункціональних сил має масштабну масштабованість, вам доведеться адаптувати свою архітектуру для забезпечення цієї сили, навіть якщо це означає, що ваша абстракція сховища даних тепер просочується у ваш рівень додатків.


1
Рівень програми все ще може створювати розділення логіки доступу до даних та правил бізнесу. Це просто означає, що у вас є додаткові концептуальні шари всередині шару "додаткового рівня".
Ерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.