Pull to refresh

Comments 6

Может лезу со свинячей головой в калашный ряд, но, сколько сталкивался с секционированием (партиционированием) и шардированием, всегда разделяли эти термины так: разбиение данных в пределах одного экземпляра БД это секционирование (партиционирование), а когда данные лежат на разных серверах с одной схемой таблицы (схема не обязательна), это шардирование.
И первое не исключает второе, и наоборот.
Например, таблица продаж разбита на секции по месяцу, лежит на некотором количестве БД, где данные шардированы (напр. по clientId) по клиенту.

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


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


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


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


Вот хотелось такого жира, а не толочь воду в ступе автором.

Андрей Аксёнов? «Без чёткого понимания термина»? :)

Сюдя по написанному, именно так. Я не нашел в статье четкого и однозначного определения. Зато нашел другое:


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

Т.е. есть ощущения и неуверенности.

На самом деле распределенные транзакции много где есть сегодня. Например в Apache Ignite. Двухфазный комит — стандартный алгоритм для этого и позволяет сделать CP систему с шардированием. Задержки там не очень большие если одновременно работающие транзакции в данных редко пересекаются. Но конечно если начать join запросы тяжёлые 1 в 1 с MySQL переносить на такое, то будет больно)

Насколько я понял «Веселее #6: списки» это vshard у тындексного тарантула. Только там он иначе как-то называется.
Sign up to leave a comment.