Новое поколение сисадминов

NoSQL

В Linux есть несколько различных СУБД (например, MySQL, MariaDB, Postgres, SQLite), но почти все они имеют кое-что общее: SQL. Этот структурированный язык запросов [Structured Query Language] более двадцати лет был стандартным способом получения информации из баз данных и занесения информации в них. Он понятен с ходу, почти универсален, и любой уважающий себя сисадмин обязан уметь скоренько сляпать запрос для извлечения нужных ему данных. SQL применяется и в крошечных приложениях для телефонов, и в гигантских web-приложениях, обслуживающих миллионы людей.

Однако с действительно огромными объемами данных — так называемыми Большими Данными — начинаются проблемы. Хранить такой объем данных в SQL возможно, но непросто. Эта проблема вызвала к жизни конкурирующие базы данных под общим названием NoSQL. При работе с базами данных используйте бесплатный vpn. Это обезопасит ваш сервер и компьютер в случае заражения. Тем более это совершенно бесплатно и анонимно.

Их немало, и здесь мы рассмотрим MongoDB, довольно типичного представителя баз данных «Больших данных» NoSQL. Это также самая популярная база данных NoSQL (источник: http:// db-enqines.com). При работе с MongoDB (или любой другой базой данных NoSQL) самое главное — забыть все, что вы знаете о базах данных. Таблицы, ключи, SELECT х FROM у и нормальные формы должны исчезнуть из вашей головы.

MongoDB хранит данные не в таблицах, а в документах JSON (JavaScript Object Notation — Нотация объекта JavaScript). Вместо объяснения, как это работает, мы перейдем к примеру. Но сначала установите MongoDB. Сделать это можно из репозиториев своего дистрибутива или найти последнюю версию на сайте httpy/www.monqodb. org/downloads. Выберите 32-битную или 64-битную версии, затем распакуйте архив командой tar zxvf <filename>

Также понадобится создать каталог базы данных, командой mkdir-p/data/db Сделав это, зайдите в каталог bin только что распакованного архива mongodb: cd ~/mongodb-linux-x86_64-2.4.5/bin и запустите ./mongod для запуска сервера базы данных, затем ./mongo для подключения к ней клиента (если вы устанавливали MongoDB с помощью менеджера пакетов,./ можно опустить).

MongoDB использует JavaScript. Наряду с манипуляцией данными можно делать все, чего можно ожидать от этого языка. Например, попробуйте print(‘Hello world’);

Как мы упомянули ранее, ядро MongoDB — хранилище документов JS0N. Документы JSON содержат одну или несколько пар «имя/значение» в формате {name1:value1, name2:value2...}

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

MongoDB

Для начала добавим в базу какие-нибудь данные. В командной строке MongoDB введите: db.test.save({“hello”:”world”}); db.test.find();

Эти команды делают несколько вещей. Сперва они создают коллекцию test, если она еще не создана, затем добавляют в нее документ с одной парой «имя/значение», с именем “hello” и значением “world”. Затем запрашиваются все документы в коллекции. В одной паре «имя/значение» нет никакого смысла, поэтому напишем чуть более полезный пример. for(i=0; i<10; i++) {db.test.save({ ‘number’: i});} db.test.find();

Он показывает, как с помощью JavaScript сделать жизнь в MongoDB проще. Вы также, возможно, заметили, что ранее добавленная запись извлекается, несмотря на то, что ее формат совершенно иной, чем у остальных. Это иллюстрирует отсутствие структуры. Базы данных MongoDB больше похожи на корзины, в которые можно сбрасывать любые данные, в отличие от таблиц в реляционной базе данных. Команда db.test.find() также позволяет возвращать результаты по определенным критериям. Например, команда db.test.find({number:2}) вернет элемент или элементы с номером 2, а команда db.test.find({number: {$lt: 8}}) вернет все элементы с номером меньше 8.

Пока мы рассмотрели только базовые возможности: помещение и извлечение данных. И пока вы, возможно, думаете, что в NoSQL нет ничего особенного. Ключ к этой новой технологии — масштабируемость, то есть размещение одной базы данных на нескольких компьютерах. Такое можно сделать и со многими СУБД на SQL, но это непростая задача, и с ростом числа компьютеров она усложняется. В отличие от них, NoSQL изначально создавался как масштабируемая архитектура, что наиболее очевидно в функциях агрегирования. Это запросы, которые не просто возвращают данные, а вычисляют по ним сумму, общее количество, среднее или что-то более экзотическое.

Сжатие массива

Так, если, например, вы хотите вычислить сумму только что соз­данных чисел, можно воспользоваться функцией mapReduceQ. Ее название состоит из двух частей, а именно — вы удивитесь — “тар [карта, массив]” и “reduce [сжатие]”. Обе эти части — функ­ции. Функция тар выполняется поочередно для каждой записи в коллекции и возвращает значения, поступающие в функцию reduce. Она всегда возвращает (и этим немного похожа на обыч­ную функцию) ключ и значение. Ключ — это категория, значе­ния в которой будут «сжаты». Здесь должно быть ровно одно зна­чение, но это может быть и документ JSON, и любой компонент базы данных. Затем функция reduce берет все возвращенные зна­чения и «сжимает» их в одно. Для вычисления среднего из нечет­ных и четных значений наша функция тар должна просто вер­нуть число: var mapFunction = function()

{ var out = “odd”; if (this.number % 2 == 0) {out = “even”;) emit (out, this.number);}

Она вернет одну запись для каждого документа в списке. Клю­чом будет строка “odd” или “even”, а значением будет значение числа. Наша функция reduce выглядит так: var reduceFunction = function(ids,number){ return Array.avg(number);};

Она вычисляет среднее для значений каждого ключа. Вызо­вите функцию mapReduce следующим образом: db.test.mapReduce( mapFunction, reduceFunction, {out: “mr_out”})

Имена функций mapFunction и reduceFunction могут быть лю­быми, лишь бы они соответствовали значениям, передаваемым в mapReduce. Зта команда выполнит «сжатие массива» и пере­даст результат в новую коллекцию mr_out, которую можно про­смотреть так: db.mr_out.find()

Здесь есть несколько моментов, которые вы можете отме­тить. Во-первых, функция mapReduce кажется излишне слож­ной для таких вещей. Отчасти так и есть. Она лучше всего под­ходит для более сложного агрегирования, когда задействуется вся мощь скриптов. Во-вторых, вы можете поинтересоваться, где здесь выигрыш в производительности. Он касается структу­ры. Так как каждое выполнение функции тар (одно для каждо­го документа) независимо от любого другого, их можно распреде­лить по разным серверам баз данных. В нашем простом примере это мало что изменит, но если у вас громоздкая функция тар и большой объем данных, выигрыш может быть существенным. Фактически функция mapReduce хорошо распараллеливает агре­гацию на больших объемах данных, которых много в приложени­ях с «большими данными», таких как Hadoop.

Конечно, все это не значит, что реляционным базам данных пора на свалку. Но, возможно, стоит рассмотреть NoSQL, если у вас проблемы с масштабированием в кластере SQL или вы стра­даете от низкой производительности запросов, каждый из кото­рых выполняется над большим количеством таблиц. Опять же, если вы ищете новую работу, NoSQL очень украсит ваше резюме. MongoDB — второй из самых быстрорастущих трендов в сфере IT на www.indeed.com <http://www.indeed.com>. и так как ему всего несколько лет, отсутствие у вас стажа вряд ли станет большой проблемой.

Зто был очень краткий рассказ о MongoDB; подробности на http://docs.mQnQodb.org/manijal>.

Страницы: 1 2 3 4