Статьи

MongoDB, Windows Azure (и Node.js)

Экосистема Windows Azure расширяется как Microsoft, так и сторонними поставщиками. Этот пост посвящен одному из этих расширений — базе данных документов MongoDB. Он показывает, как MongoDB можно развернуть в размещенной службе Windows Azure и получить доступ из других ролей размещенной службы, используя либо традиционную .NET, либо недавно выпущенную поддержку Node.js.

NoSQL

За последние 30 лет базы данных SQL стали доминирующими системами хранения данных, а коммерческие предложения, такие как Oracle, Microsoft SQL Server и IBM DB2, достигли огромного коммерческого успеха. Эти системы данных характеризуются поддержкой семантики ACID — атомарности, согласованности, изоляции и долговечности. Эти свойства накладывают определенность, которая необходима для многих бизнес-процессов, работающих с ценными данными. Однако поддержка семантики ACID становится все более дорогостоящей по мере увеличения объема данных.

Появление Web 2.0 привело к растущему интересу к данным «длинного хвоста», ценность которых не в ценности отдельного куска данных, а в величине совокупных данных. Веб-журналы являются примером такого типа данных. Из-за низкого значения отдельного элемента данных этим типом данных могут управлять системы данных, которые не должны поддерживать полную семантику ACID.

В последние несколько лет в моде появился новый тип семантики хранения данных: BASE — в основном доступное, мягкое состояние, в конечном итоге согласованное. В то время как название может быть немного вынужденным, но общая идея заключается в том, что система, придерживающаяся семантики BASE, при реализации в качестве распределенной системы должна быть способна выдерживать сетевое разделение отдельных компонентов системы за счет предлагая более низкий уровень согласованности, чем в традиционных системах SQL.

В строго согласованной системе все чтения после записи получают записанные данные. В конечном итоге непротиворечивая система считывания сразу после записи не гарантируют возвращение вновь записанного значения. Однако в конце концов все записи должны возвращать записанное значение.

NoSQL (не только SQL) — это имя, используемое для классификации систем данных, которые не используют SQL и которые обычно реализуют семантику BASE вместо семантики ACID. Системы NoSQL стали очень популярными, и было создано много таких систем, большинство из которых распространяются в модели с открытым исходным кодом. Еще одна важная особенность систем NoSQL заключается в том, что, в отличие от систем SQL, они не накладывают схемы на хранимые объекты.

Системы NoSQL можно классифицировать по способу хранения данных следующим образом:

  • ключ-значение
  • документ

В хранилище значений ключей объект содержит первичный ключ и набор свойств без связанной схемы, так что каждый объект в «таблице» может иметь различный набор свойств. Apache Cassandra — это популярный магазин ключей. Хранилище документов обеспечивает хранение семантически более богатых сущностей с внутренней структурой. MongoDB — популярный магазин документов.

Таблицы Windows Azure — это хранилище NoSQL со значением ключа, предоставляемое в платформе Windows Azure. В отличие от других хранилищ NoSQL, он поддерживает строгую согласованность без какой-либо согласованной опции. Группа разработчиков хранилища Windows Azure недавно опубликовала документ с описанием реализации таблиц Windows Azure.

10gen , компания, которая поддерживает и поддерживает MongoDB, сотрудничает с Microsoft, чтобы сделать MongoDB доступным в Windows Azure. Это обеспечивает Windows Azure системой NoSQL хранилища документов, дополняющей хранилище значений ключей, предоставляемое таблицами Windows Azure.

MongoDB

MongoDB — это хранилище документов NoSQL, в котором отдельные объекты хранятся в виде документов внутри коллекции, размещенной в базе данных. Одна установка MongoDB может содержать много баз данных. MongoDB не имеет схемы, поэтому каждый документ в коллекции может иметь свою схему. Последовательность настраивается от возможной последовательности к сильной последовательности.

MongoDB использует файлы, отображаемые в память, и производительность является оптимальной, когда все данные и индексы помещаются в память. Он поддерживает автоматическое разбиение, позволяющее масштабировать базы данных за пределы одного сервера. Данные хранятся в формате BSON , который можно рассматривать как двоичную версию JSON .

Высокая доступность поддерживается в MongoDB благодаря концепции набора реплик, состоящего из одного основного элемента и одного или нескольких дополнительных элементов, каждый из которых содержит копию всех данных. Операции записи выполняются для основного элемента, а затем асинхронно копируются на дополнительные элементы. Можно вызвать безопасную запись, которая возвращается только тогда, когда запись копируется в указанное количество вторичных элементов, что позволяет настраивать уровень согласованности по мере необходимости. Чтения могут выполняться против вторичных элементов, чтобы повысить производительность за счет снижения нагрузки на основной элемент.

MongoDB — это программное обеспечение с открытым исходным кодом, поддерживаемое и поддерживаемое 10gen, компанией, которая изначально его разработала. 10gen предоставляет загрузки для различных платформ и версий. 10gen также предоставляет драйверы (или API) для многих языков, включая C # и F #. MongoDB поставляется с оболочкой JavaScript, которая полезна для выполнения специальных запросов и тестирования развертывания MongoDB.

Кайл Банкер из 10gen написал прекрасную книгу под названием MongoDB в действии . Я настоятельно рекомендую его всем, кто интересуется MongoDB.

MongoDB в Windows Azure

Дэвид Макогон (@dmakogon) работал , как развернуть MongoDB на рабочий роли экземпляров на Windows Azure. Затем 10gen вместе с ним и командой Microsoft по взаимодействию разработали официально поддерживаемый предварительный выпуск MongoDB для оболочки Windows Azure, который упрощает задачу развертывания набора реплик MongoDB на экземплярах рабочих ролей.

Оболочка развертывает каждый член набора реплик в отдельный экземпляр рабочей роли. Процесс mongod.exe для MongoDB запускается в точке входа роли OnStart () для экземпляра. Данные для каждого члена сохраняются в виде блоба страницы в хранилище BLOB-объектов Windows Azure, которое подключается как диск Azure к экземпляру.

Оболочку MongoDB для Windows Azure можно загрузить с github. Загрузки содержат два дерева каталогов: ReplicaSets , содержащий базовое программное обеспечение в качестве MongoDBReplicaSet решения; и SampleApplications, содержащие пример приложения MVC Movies с именем MongoDBReplicaSetMvcMovieSample . Деревья каталогов содержат скрипт PowerShell, solutionsetup.ps1 , который должен быть вызван для загрузки последних двоичных файлов MongoDB.

Решение MongoDBReplicaSetMvcMovieSample содержит четыре проекта:

  • MongoDBAzureHelper — вспомогательный класс для получения конфигурации MongoDB
  • MongoDBReplicaSetSample — проект Windows Azure
  • MvcMovie — приложение ASP.NET MVC 3
  • ReplicaSetRole — рабочая роль для размещения членов набора реплик MongoDB.

Проект MVCMovie основан на примере введения в ASP.NET MVC 3 на веб-сайте asp.net. Он отображает информацию о фильме, полученную из набора реплик MongoDB, размещенного в экземплярах ReplicaSetRole . ReplicaSetRole запускается как 3 средних экземпляров каждый , если в котором находится множество реплик элемента. Проекты MongoDBAzureHelper и ReplcaSetRole взяты из решения MongoDBReplicaSet .

Решение MongoDBReplicaSetMvcMovieSample можно открыть в Visual Studio, затем создать и развернуть либо в локальном эмуляторе вычислений, либо в службе Windows Azure. Приложение имеет две страницы: страницу « О программе», отображающую состояние набора реплик; и страница « Фильмы», позволяющая захватывать и отображать информацию о фильме. Может потребоваться одна или две минуты, чтобы набор реплик полностью подключился к сети и статус стал доступен на странице « О программе» . Когда фильм добавляется в базу данных через фильмыстранице, иногда может потребоваться обновление, чтобы обновленная информация стала видимой на странице. Это связано с тем, что MongoDB является в конечном итоге непротиворечивой базой данных, и страница «Фильмы» могла получать данные от одного из вторичных узлов.

В этом примере представлена ​​общая демонстрация того, как установка MongoDB с наборами реплик добавляется в проект Windows Azure: добавьте проекты MongoDBAzureHelper и ReplicaSetRole из решения MongoDBReplicaSet и добавьте соответствующую конфигурацию в файлы ServiceDefinition.csdef и ServiceConfiguration.cscfg.

Записи ServiceDefinition.csdef для ReplicaSetRole:

<Endpoints>
    <InternalEndpoint name=”MongodPort” protocol=”tcp” port=”27017″ />
</Endpoints>
<ConfigurationSettings>
    <Setting name=”MongoDBDataDir” />
    <Setting name=”ReplicaSetName” />
    <Setting name=”MongoDBDataDirSize” />
    <Setting name=”MongoDBLogVerbosity” />
</ConfigurationSettings>
<LocalResources>
    <LocalStorage name=”MongoDBLocalDataDir” cleanOnRoleRecycle=”false”
       sizeInMB=”1024″ />
    <LocalStorage name=”MongodLogDir” cleanOnRoleRecycle=”false”
       sizeInMB=”512″ />
</LocalResources>

Порт 27017 является стандартным портом для установки MongoDB. Ни один из параметров не должен быть изменен для примера проекта.

Записи ServiceDefinition.csdef для MvcMovie:

<ConfigurationSettings>
    <Setting name=”ReplicaSetName” />
</ConfigurationSettings>

Параметры ServiceConfiguration.cscfg для ReplicaSetRole:

<ConfigurationSettings>
      <Setting name=”MongoDBDataDir” value=”UseDevelopmentStorage=true” />
      <Setting name=”ReplicaSetName” value=”rs” />
      <Setting name=”MongoDBDataDirSize” value=”" />
      <Setting name=”MongoDBLogVerbosity” value=”-v” />
      <Setting name=”Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString” value=”UseDevelopmentStorage=true” />
</ConfigurationSettings>

Параметры ServiceConfiguration.cscfg для веб-роли MvcMovie:

<ConfigurationSettings>
      <Setting name=”ReplicaSetName” value=”rs” />
      <Setting name=”Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString” value=”UseDevelopmentStorage=true” />
</ConfigurationSettings>

 

Крайне важно, чтобы значение ReplicaSetName было одинаковым как в веб-роли MvcMovie, так и в рабочей роли ReplicaSets.

Доступ к набору реплик также можно получить из оболочки MongoDB mongo, если он запущен в эмуляторе вычислений. Это полезный способ убедиться, что все работает, поскольку он предоставляет удобный способ доступа к данным и управления набором реплик. Данные приложения хранятся в коллекции фильмов в базе данных фильмов. Например, команда rs.stepDown () может быть вызвана на первичном элементе, чтобы преобразовать его во вторичный. MongoDB автоматически выберет одного из второстепенных членов и продвинет его до основного. Обратите внимание, что в эмуляторе вычислений 3 члена набора реплик размещаются по номерам портов 27017, 27018 и 27019 соответственно.

В этом примере демонстрируется процесс добавления поддержки MongoDB в решение Windows Azure с веб-ролью.

1) Добавьте следующие решения MongoDB к решению;

  • MongoDBAzureHelper
  • ReplicaSetRole

2) Добавьте сборки MongoDB в веб-роль:

  • Mongo.DB.Bson (копия локальная)
  • Mongo.DB.Driver (копия локальная)
  • MongoDBAzureHelper (из добавленного проекта)

3) Добавьте параметры MongoDB, описанные ранее, в конфигурацию службы Windows Azure.

MongoDB в Windows Azure с Node.js

Node.js — популярная система для разработки веб-серверов с использованием JavaScript и модели асинхронного программирования. Microsoft недавно выпустила Windows Azure SDK для Node.js, которая упрощает развертывание веб-приложений Node.js в Windows Azure.

SDK предоставляет обширный набор сценариев PowerShell, таких как Add-AzureNodeWebRole , Start-AzureEmulator и Publish-AzureService, которые упрощают управление жизненным циклом разработки и развертывания веб-приложения Node.js. Он содержит несколько вводных руководств, включая веб-приложение Node.js с хранилищем в MongoDB . В этом руководстве показано, как добавить набор реплик, реализованный, как описано ранее, в веб-приложение, разработанное в Node.js.

Резюме

MongoDB в оболочке Windows Azure и учебник Windows Azure SDK для Node.js позволили очень легко опробовать MongoDB в размещенной службе Windows Azure.

 

КОНЕЦ