MongoDB. Часть 1.

Apr 13, 2015 04:05 · 609 words · 3 minutes read mongodb

Объявляем эту неделю - неделей MongoDB!

После прочтения постов на эту тему вы сможете понять и обосновать, зачем вам нужна “монга” (и действительно ли нужна). Будете знать, что лучше почитать и посмотреть, чтобы установить эту замечательную БД. Познакомитесь с MongoId и узнате с какими проблемами можно столкнуться при внедрении MongoDB. Ну и разумеется, как решать эти самые проблемы. А ещё повысите свои шансы на успешное прохождение собеседования в IT-компаниях, которые, как и НГС используют передовые технологии Web-разработки:)

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

И первое, что очень важно при освоении БД – индексы.

Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева. Можно провести аналогию с поиском по предметному указателю книги: вам не нужно просматривать каждую страницу на предмет совпадения с запросом, а достаточно получить список “номеров страниц”, где можно найти нужное.

Масштабирование SQL и NoSQL

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

Партиционирование

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

Репликация

Репли­ка­ция — это син­хрон­ное или асин­хрон­ное копи­ро­ва­ние дан­ных между несколь­кими сер­ве­ра­ми. Веду­щие сер­вера назы­вают масте­рами (master), а ведо­мые сер­вера — слэй­вами (slave). Мастера исполь­зу­ются для изме­не­ния дан­ных, а слэйвы — для счи­ты­ва­ния. В клас­си­че­ской схеме репли­ка­ции обычно один мастер и несколько слэй­вов, так как в боль­шей части веб-про­ек­тов опе­ра­ций чте­ния на несколько поряд­ков боль­ше, чем опе­ра­ций запи­си. Однако в более слож­ной схеме репли­ка­ции может быть и несколько масте­ров. Напри­мер, созда­ние несколь­ких допол­ни­тель­ных slave-сер­ве­ров поз­во­ляет снять с основ­ного сер­вера нагрузку и повы­сить общую про­из­во­ди­тель­ность систе­мы, а также можно орга­ни­зо­вать слэйвы под кон­крет­ные ресур­соём­кие задачи и таким обра­зом, напри­мер, упро­стить состав­ле­ние серь­ёз­ных ана­ли­ти­че­ских отчётов — исполь­зу­е­мый для этих целей slave может быть нагру­жен на 100%, но на работу дру­гих поль­зо­ва­те­лей при­ло­же­ния это не повли­я­ет.

Шардинг

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

Просто про шардинг и репликацию на примере MySQL