0

Шардирование

26.04.2022

Шардирование — это горизонтальное масштабирование данных, при котором данные разбиваются на шарды (т. е. части) и размещаются на разных хостах кластера. Нагрузка на БД при этом распределяется по хостам, что позволяет выжать из системы больше, чем из одного мощного сервера. Это особенно важно, если данных или запросов к ним очень много.Плюсы шардирования в том, что оно позволяет:

  • Обойти технические ограничения. Если БД работает на пределе производительности — можно разбить ее на части и распределить запросы на чтение между ними.
  • Ускорить доступ к данным для пользователей из конкретного региона. Например, международные соцсети могут хранить контент на русском языке на серверах ближе к России.
  • Выполнить юридические требования. Например, хранить конфиденциальные данные на шарде, публичный доступ к которому отключен.
  • Повысить доступность. Если БД находится на одном нешардированном хосте, то его выход из строя приведет к потере всех данных. Если же БД шардирована, то при отказе одного шарда все данные на других остаются доступными.Для шардов можно дополнительно настроить репликацию. Так вы обойдетесь без потерь, если сервер выйдет из строя. А размещение реплик шарда в разных зонах доступности даст вам отказоустойчивую систему.
  • Ускорить запросы. Они могут выполняться медленнее из-за того, что конкурируют за ресурсы сервера. Шардирование устраняет конкуренцию, исполняя запросы параллельно на разных серверах.Каким бы замечательным шардирование ни было, у него есть и недостатки:
  • Правильно шардировать данные, т. е. разбить их на части — непростая задача. Если вы сделаете это неверно, то мощности серверов будут использоваться нерационально (например, потребуется много межсерверных запросов).
  • Из-за несбалансированного распределения данных между шардами появляются горячие точки — разделы БД, к которым идет намного больше обращений по сравнению с остальными. Запросы к горячим точкам обрабатываются заметно медленнее.

Шардирование в MongoDB

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

  • Данных много (коллекция больше 200 ГБ).
  • Данные неоднородны и четко делятся на примерно одинаковые по объему данных категории.
  • Требования к скорости чтения и записи данных высоки. Шардирование распределит нагрузку по хостам, чтобы обойти технические ограничения.

Шардирование доступно для кластеров MongoDB с версией не ниже 4.0. Оно происходит с автоматическим созданием служебных хостов mongos (для маршрутизации запросов пользователей) и mongocfg (для хранения конфигурации шардов), которые тарифицируются отдельно от основных хостов СУБД.Сервис поддерживает две основные стратегии шардирования данных:

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

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380