MongoDB. Часть 1.
Apr 13, 2015 04:05 · 609 words · 3 minutes read
Объявляем эту неделю - неделей MongoDB!
После прочтения постов на эту тему вы сможете понять и обосновать, зачем вам нужна “монга” (и действительно ли нужна). Будете знать, что лучше почитать и посмотреть, чтобы установить эту замечательную БД. Познакомитесь с MongoId и узнате с какими проблемами можно столкнуться при внедрении MongoDB. Ну и разумеется, как решать эти самые проблемы. А ещё повысите свои шансы на успешное прохождение собеседования в IT-компаниях, которые, как и НГС используют передовые технологии Web-разработки:)
Но, прежде чем перейти к вещам сложным и погрузиться в нюансы, остановимся на тех моментах, без которых будет непонятно всё то, о чём мы расскажем вам далее.
И первое, что очень важно при освоении БД – индексы.
Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева. Можно провести аналогию с поиском по предметному указателю книги: вам не нужно просматривать каждую страницу на предмет совпадения с запросом, а достаточно получить список “номеров страниц”, где можно найти нужное.
Масштабирование SQL и NoSQL
Базы данных — часто «узкое место» в производительности веб-приложений. В момент, когда сервер баз данных не может справиться с нагрузками, производится масштабирование. Ниже коротко рассмотрим схемы масштабирования, которые применимы как для реляционных баз данных, так и для NoSQL-хранилищ. Разумеется, что у всех баз данных и хранилищ есть своя специфика, поэтому мы рассмотрим только основные направления и в детали реализации вдаваться не будем.
Партиционирование
Партиционирование — это разбиение таблиц, содержащих большое количество записей, на логические части по неким выбранным администратором критериям. Партиционирование таблиц делит весь объем операций по обработке данных на несколько независимых и параллельно выполняющихся потоков, что существенно ускоряет работу СУБД. Для правильного конфигурирования параметров партиционирования необходимо, чтобы в каждом потоке было примерно одинаковое количество записей. Например, на новостных сайтах имеет смысл партиционировать записи по дате публикации, так как свежие новости на несколько порядков более востребованы и чаще требуется работа именно с ними, а не со всем архивом за годы существования новостного ресурса.
Репликация
Репликация — это синхронное или асинхронное копирование данных между несколькими серверами. Ведущие сервера называют мастерами (master), а ведомые сервера — слэйвами (slave). Мастера используются для изменения данных, а слэйвы — для считывания. В классической схеме репликации обычно один мастер и несколько слэйвов, так как в большей части веб-проектов операций чтения на несколько порядков больше, чем операций записи. Однако в более сложной схеме репликации может быть и несколько мастеров. Например, создание нескольких дополнительных slave-серверов позволяет снять с основного сервера нагрузку и повысить общую производительность системы, а также можно организовать слэйвы под конкретные ресурсоёмкие задачи и таким образом, например, упростить составление серьёзных аналитических отчётов — используемый для этих целей slave может быть нагружен на 100%, но на работу других пользователей приложения это не повлияет.
Шардинг
Шардинг — это прием, который позволяет распределять данные между разными физическими серверами. Процесс шардинга предполагает разнесения данных между отдельными шардами на основе некого ключа шардинга. Связанные одинаковым значением ключа шардинга сущности группируются в набор данных по заданному ключу, а этот набор хранится в пределах одного физического шарда. Это существенно облегчает обработку данных. Например, в системах типа социальных сетей ключом для шардинга может быть ID пользователя, таким образом все данные пользователя будут храниться и обрабатываться на одном сервере, а не собираться по частям с нескольких.