Шардирование и партиционирование: Масштабирование базы данных через шардирование и партиционирование / Хабр

Масштабирование базы данных через шардирование и партиционирование / Хабр

Денис Иванов (2ГИС)


Всем привет! Меня зовут Денис Иванов, и я расскажу о масштабировании баз данных через шардирование и партиционирование. После этого доклада у всех должно появиться желание что-то попартицировать, пошардировать, вы поймете, что это очень просто, оно никак жрать не просит, работает, и все замечательно.

Немного расскажу о себе — я работаю в команде WebAPI в компании 2GIS, мы предоставляем API для организаций, у нас очень много разных данных, 8 стран, в которых мы работаем, 250 крупных городов, 50 тыс. населенных пунктов. У нас достаточно большая нагрузка — 25 млн. активных пользователей в месяц, и в среднем нагрузка около 2000 RPS идет на API. Все это располагается в трех датацентрах.

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


Я в большей степени расскажу про шардинг. Он бывает вертикальным и горизонтальным. Также бывает такой способ масштабирования как репликация. Доклад «Как устроена MySQL репликация» Андрея Аксенова из Sphinx про это и был. Я эту тему практически не буду освещать.

Перейдем подробнее к теме партицирования (вертикальный шардинг). Как это все выглядит?

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

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

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

Про репликацию я не буду останавливаться, тут все очень просто.

Перейдем глубже к этой теме, и я расскажу практически все о партицировании на примере Postgres’а.

Давайте рассмотрим простую табличку, наверняка, практически в 99% проектов такая табличка есть — это новости.

У новости есть идентификатор, есть категория, в которой эта новость расположена, есть автор новости, ее рейтинг и какой-то заголовок — совершенно стандартная таблица, ничего сложного нет.

Как же эту таблицу разделить на несколько? С чего начать?

Всего нужно будет сделать 2 действия над табличкой — это поставить у нашего шарда, например, news_1, то, что она будет наследоваться таблицей news. News будет базовой таблицей, будет содержать всю структуру, и мы, создавая партицию, будем указывать, что она наследуется нашей базовой таблицей. Наследованная таблица будет иметь все колонки родителя — той базовой таблицы, которую мы указали, а также она может иметь свои колонки, которые мы дополнительно туда добавим. Она будет полноценной таблицей, но унаследованной от родителя, и там не будет ограничений, индексов и триггеров от родителя — это очень важно. Если вы на базовой таблице насоздаете индексы и унаследуете ее, то в унаследованной таблице индексов, ограничений и триггеров не будет.

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

В данном случае признак — это category_id=1, т.е. только записи с category_id=1 будут попадать в эту таблицу.

Какие типы проверок бывают для партицированных таблиц?

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

Тут нужно подробнее остановиться, потому что проверка поддерживает оператор BETWEEN, наверняка вы все его знаете.

И так просто его сделать можно. Но нельзя. Можно сделать, потому что нам разрешат такое сделать, PostgreSQL поддерживает такое. Как вы видите, у нас в 1-ую партицию попадают данные между 100 и 200, а во 2-ую — между 200 и 300. В какую из этих партиций попадет запись с рейтингом 200? Не известно, как повезет. Поэтому так делать нельзя, нужно указывать строгое значение, т.е. строго в 1-ую партицию будут попадать значения больше 100 и меньше либо равно 200, и во вторую больше 200, но не 200, и меньше либо равно 300.

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

Также не стоит создавать партиции по разным полям, т.е. что в 1-ую партицию у нас будут попадать записи с category_id=1, а во 2-ую — с рейтингом 100.

Опять же, если нам придет такая запись, в которой category_id = 1 и рейтинг =100, то неизвестно в какую из партиций попадет эта запись. Партицировать стоит по одному признаку, по какому-то одному полю — это очень важно.

Давайте рассмотрим нашу партицию целиком:

Ваша партицированная таблица будет выглядеть вот так, т.е. это таблица news_1 с признаком, что туда будут попадать записи только с category_id = 1, и эта таблица будет унаследована от базовой таблицы news — все очень просто.

Мы на базовую таблицу должны добавить некоторое правило, чтобы, когда мы будем работать с нашей основной таблицей news, вставка на запись с category_id = 1 попала именно в ту партицию, а не в основную. Мы указываем простое правило, называем его как хотим, говорим, что когда данные будут вставляться в news с category_id = 1, вместо этого будем вставлять данные в news_1. Тут тоже все очень просто: по шаблончику оно все меняется и будет замечательно работать. Это правило создается на базовой таблице.

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

Давайте рассмотрим пример вставки данных:

Данные будем вставлять как обычно, будто у нас обычная большая толстая таблица, т.е. мы вставляем запись с category_id=1 с category_id=2, можем даже вставить данные с category_id=3.

Вот мы выбираем данные, у нас они все есть:

Все, которые мы вставляли, несмотря на то, что 3-ей партиции у нас нет, но данные есть. В этом, может быть, есть немного магии, но на самом деле нет.

Мы также можем сделать соответствующие запросы в определенные партиции, указывая наше условие, т.е.category_id = 1, или вхождение в числа (2, 3).

Все будет замечательно работать, все данные будут выбираться. Опять же, несмотря на то, что с партиции с category_id=3 у нас нет.

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

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

Здесь можно, как видно на слайде, вставлять данные напрямую в партицию. Можно вставлять данные с помощью правил в основную таблицу, но можно и в саму партицию.

Если мы будем вставлять данные в партицию с каким-то чужеродным условием, например, с category_id = 4, то мы получим ошибку «сюда такие данные нельзя вставлять» — это тоже очень удобно — мы просто будем класть данные только в те партиции, которые нам действительно нужно, и если у нас что-то пойдет не так, мы на уровне базы все это отловим.

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

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

У нас будет Seq Scan по всей таблице целиком, потому что туда данные могут все равно попадать, и будет скан по партиции. Если мы будем указывать условия нескольких категорий, то он будет сканировать только те таблицы, на которые есть условия. Он не будет смотреть в остальные партиции. Так работает оптимизатор — это правильно, и так действительно быстрее.

Мы можем посмотреть, как будет выглядеть explain на самой партиции.

Это будет обычная таблица, просто Seq Scan по ней, ничего сверхъестественного. Точно так же будут работать update’ы и delete’ы. Мы можем update’тить основную таблицу, можем также update’ы слать напрямую в партиции. Так же и delete’ы будут работать. На них нужно так же соответствующие правила создать, как мы создавали с insert’ом, только вместо insert написать update или delete.

Перейдем к такой вещи как Index’ы

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

Как мы с этой проблемой боролись у себя. Мы создали замечательную утилиту PartitionMagic, которая позволяет автоматически управлять партициями и не заморачиваться с созданием индексов, триггеров с несуществующими партициями, с какими-то бяками, которые могут происходить. Эта утилита open source’ная, ниже будет ссылка. Мы эту утилиту в виде хранимой процедуры добавляем к нам в базу, она там лежит, не требует дополнительных extension’ов, никаких расширений, ничего пересобирать не нужно, т.е. мы берем PostgreSQL, обычную процедуру, запихиваем в базу и с ней работаем.

Вот та же самая таблица, которую мы рассматривали, ничего нового, все то же самое.

Как же нам запартицировать ее? А просто вот так:

Мы вызываем процедуру, указываем, что таблица будет news, и партицировать будем по category_id. И все дальше будет само работать, нам больше ничего не нужно делать. Мы так же вставляем данные.

У нас тут три записи с category_id =1, две записи с category_id=2, и одна с category_id=3.

После вставки данные автоматически попадут в нужные партиции, мы можем сделать селекты.

Все, партиции уже создались, все данные разложились по полочкам, все замечательно работает.

Какие мы получаем за счет этого преимущества:

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


Мы получаем действительно большое преимущество в этом. Вот ссылочка https://github.com/2gis/partition_magic. На этом первая часть доклада закончена. Мы научились партицировать данные. Напомню, что партицирование применяется на одном инстансе — это тот же самый инстанс базы, где у вас лежала бы большая толстая таблица, но мы ее раздробили на мелкие части. Мы можем совершенно не менять наше приложение — оно точно так же будет работать с основной таблицей — вставляем туда данные, редактируем, удаляем. Так же все работает, но работает быстрее. Приблизительно, в среднем, в 3-4 раза быстрее.

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

Рассматривать будем такую же структуру с двумя шардами — news_1 и news_2, но это будут разные инстансы, третьим инстансом будет основная база, с которой мы будем работать:

Та же самая таблица:

Единственное, что туда нужно добавить, это CONSTRAINT CHECK, того, что записи будут выпадать только с category_id=1. Так же, как в предыдущем примере, но это не унаследованная таблица, это будет таблица с шардом, которую мы делаем на сервере, который будет выступать шардом с category_id=1. Это нужно запомнить. Единственное, что нужно сделать — это добавить CONSTRAINT.

Мы еще можем дополнительно создать индекс по category_id:

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

Как настроить шардинг на основном сервере?

Мы подключаем EXTENSION. EXTENSION идет в Postgres’e из коробки, делается это командой CREATE EXTENSION, называется он postgres_fdw, расшифровывается как foreign data wrapper.

Далее нам нужно завести удаленный сервер, подключить его к основному, мы называем его как угодно, указываем, что этот сервер будет использовать foreign data wrapper, который мы указали.

Таким же образом можно использовать для шарда MySql, Oracle, Mongo… Foreign data wrapper есть для очень многих баз данных, т.е. можно отдельные шарды хранить в разных базах.

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

Далее мы создаем маппинг для пользователя — по этим данным основной сервер будет авторизироваться к дочернему. Мы указываем, что для сервера news_1 будет пользователь postgres, с паролем postgres. И на основную базу данных он будет маппиться как наш user postgres.

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

Далее мы заводим табличку на основном сервере:

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

Схема по дефолту — это public, таблицу, которую мы завели, назвали news. Точно так же мы подключаем 2-ую таблицу к основному серверу, т.е. добавляем сервер, добавляем маппинг, создаем таблицу. Все, что осталось — это завести нашу основную таблицу.

Это делается с помощью VIEW, через представление, мы с помощью UNION ALL склеиваем запросы из удаленных таблиц и получаем одну большую толстую таблицу news из удаленных серверов.

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

Мы заводим основное правило, которое будет срабатывать, если ни одна проверка не сработала, чтобы не происходило ничего. Т.е. мы указываем DO INSTEAD NOTHING и заводим такие же проверки, как мы делали ранее, но только с указанием нашего условия, т. е. category_id=1 и таблицу, в которую данные вместо этого будут попадать.

Т.е. единственное отличие — это в category_id мы будем указывать имя таблицы. Также посмотрим на вставку данных.

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

Выбираем данные

Обратите внимание на сортировку идентификаторов — у нас сначала выводятся все записи из первого шарда, затем из второго. Это происходит из-за того, что postgres ходит по VIEW последовательно. У нас указаны select’ы через UNION ALL, и он именно так исполняет — посылает запросы на удаленные машины, собирает эти данные и склеивает, и они будут отсортированы по тому принципу, по которому мы эту VIEW создали, по которому тот сервер отдал данные.

Делаем запросы, какие мы делали ранее из основной таблицы с указанием категории, тогда postgres отдаст данные только из второго шарда, либо напрямую обращаемся в шард.

Так же, как и в примерах выше, только у нас разные сервера, разные инстансы, и все точно так же работает как работало раньше.

Посмотрим на explain.

У нас foreign scan по news_1 и foreign scan по news_2, так же, как было с партицированием, только вместо Seq Scan-а у нас foreign scan — это удаленный скан, который выполняется на другом сервере.

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

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

Контакты

Блог компании 2ГИС

Виды и отличия методов масштабирования баз данных

В процессе развития бизнеса растёт объём необходимых данных и операций с ними. В определённый момент один сервер перестаёт справляться с нагрузкой, и тогда необходимо масштабирование баз данных. Как осуществляется этот процесс?

Вертикальное масштабирование

Вертикальное масштабирование предполагает наращивание мощностей сервера. Основным преимуществом метода является его простота. Нет необходимости переписывать код при добавлении мощностей, а управлять одним крупным сервером намного проще, чем целой системой. Это же является и основным недостатком — масштабирование ресурсов одного сервера имеет вполне конкретные аппаратные ограничения. Также стоит учесть стоимость такого решения: сервер с кратным объёмом вычислительных ресурсов в большинстве случаев оказывается дороже, чем несколько менее мощных серверов, дающих в сумме такую производительность.

Вертикальное масштабирование баз данных

Горизонтальное масштабирование

Горизонтальное масштабирование означает увеличение производительности за счёт разделения данных на множество серверов. Такой способ предполагает увеличение производительности без снижения отказоустойчивости. Существует три основных типа горизонтального масштабирования.

Горизонтальное масштабирование баз данных

Репликация

Этот термин подразумевает копирование данных между серверами. При использовании такого метода выделяют два типа серверов: master и slave. Мастер используется для записи или изменения информации, слейвы — для копирования информации с мастера и её чтения. Чаще всего используется один мастер и несколько слейвов, так как обычно запросов на чтение больше, чем запросов на изменение. Главное преимущество репликации — большое количество копий данных. Так, если даже головной сервер выходит из строя, любой другой сможет его заменить. Однако как механизм масштабирования репликация не слишком удобна. Причина тому — рассинхронизация и задержки при передаче данных между серверами. Чаще всего репликация используется как средство для обеспечения отказоустойчивости вместе с другими методами масштабирования.

Репликация баз данных

Партицирование/секционирование

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

Секционирование баз данных

Шардирование/шардинг/сегментирование

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

Сегментирование баз данных

Резюме

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

Разделение базы данных

и разделение: в чем разница?

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

Введение:

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

Что такое разделение?

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

Вертикальное разделение

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

По умолчанию в SingleStore. Когда вы запускаете CREATE DATABASE, SingleStore разбивает базу данных на разделы, которые равномерно распределяются между доступными узлами. Это позволяет SingleStore быть высокодоступным по умолчанию. С помощью CREATE DATABASE вы можете указать количество разделов с помощью параметра PARTITIONS=X.

Когда разбивать таблицу?

Вот несколько советов по разделению таблицы:

Что такое шардинг?

Разделение на самом деле является типом разделения базы данных, точнее, горизонтальным разделением. Разделение — это репликация [копирование] схемы, а затем разделение данных на основе ключа сегмента на отдельный экземпляр сервера базы данных для распределения нагрузки.

Каждая распределенная таблица имеет ровно один ключ сегмента. Ключ сегмента может содержать любое количество столбцов. В SingleStore при запуске CREATE TABLE для создания таблицы можно указать ключ сегмента для таблицы.

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

. Затем узел направляет операцию INSERT на соответствующий компьютер узла и раздел.

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

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

Когда разбивать таблицу?

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

Когда НЕ следует сегментировать таблицу?

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

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

Разделение и разделение: в чем разница?

Разделение — это общий термин, который просто означает разделение ваших логических объектов на разные физические объекты для повышения производительности, доступности или какой-либо другой цели. «Горизонтальное разбиение» или сегментирование — это репликация схемы и последующее разделение данных на основе ключа сегмента.

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

Итак, теперь, когда мы обсудили разницу между шардингом и секционированием, что дальше? Если вы хотите поэкспериментировать с технологиями сегментирования и секционирования в облаке, лучший способ — развернуть кластер базы данных в SingleStore и попробовать его самостоятельно! Вы можете зарегистрироваться БЕСПЛАТНО здесь: https://www.singlestore.com/cloud-trial/

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

Страница обучения SingleStore содержит дополнительные курсы для самостоятельного обучения, такие как разработка схемы, прием данных, оптимизация запросов и многое другое.

Если вы столкнетесь с какими-либо проблемами или застряли, обязательно свяжитесь с сообществом SingleStore и получите ответы на все свои вопросы или ознакомьтесь с другими интересными материалами для разработчиков на нашей странице разработчиков SingleStore. Форумы сообщества — лучшее место, где можно получить ответы на вопросы о SingleStore.

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

Дополнительные ресурсы:

mysql — сегментирование базы данных и разбиение на разделы

собрал и пункты, которыми я хотел бы поделиться:

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

https://en.wikipedia.org/wiki/Partition_(database)

Шардинг — тип разбиения, например Горизонтальное разбиение (HP)

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

https://en.wikipedia.org/wiki/Shard_(database_architecture)

Мне очень нравится ответ Тони Бако на Quora, где он заставляет вас думать с точки зрения схемы (а не столбцов и строк). Он заявляет, что…

» Горизонтальное разбиение «, или сегментирование, реплицирует [копирует] схему, а затем разделяет данные на основе ключа сегмента.

» Вертикальное разбиение » включает в себя разделение схемы (и данные идут вместе).

https://www.quora.com/Whats-the-difference-between-sharding-DB-tables-and-partitioning-them

В Oracle Database Partitioning Guide есть несколько хороших цифр. Я скопировал несколько выдержек из статьи.

https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm

Когда разбивать таблицу

Вот несколько советов, когда разбивать таблицу:

  • Таблицы размером более 2 ГБ всегда должны рассматриваться как кандидаты.
    для разбиения.
  • Таблицы, содержащие исторические данные, в которых новые данные добавляются в самый новый раздел. Типичным примером является историческая таблица, в которой обновляются данные только за текущий месяц, а остальные 11 месяцев доступны только для чтения.
  • Когда содержимое таблицы необходимо распределить по разным типам устройств хранения.

Сокращение раздела

Сокращение раздела — это самый простой и в то же время наиболее существенный способ повышения производительности с помощью разделения. Сокращение секций часто может повысить производительность запросов на несколько порядков. Например, предположим, что приложение содержит таблицу «Заказы», ​​содержащую хронологическую запись заказов, и что эта таблица разбита по неделям. Запрос, запрашивающий заказы на одну неделю, будет обращаться только к одному разделу таблицы Orders. Если бы таблица Orders содержала исторические данные за 2 года, то этот запрос обращался бы к одному разделу вместо 104 разделов.

This entry was posted in Популярное