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>.